From ca2728874c49316d8d450c23d01afe20f646eb9e Mon Sep 17 00:00:00 2001 From: Bam6ycha <84175555+Bam6ycha@users.noreply.github.com> Date: Thu, 27 Apr 2023 13:35:28 +0500 Subject: [PATCH 01/17] EPMRPP-83282 || Update profile page layout (#3465) * EPMRPP-83282 || Update profile page * EPMRPP-83282 || Code review fixes - 1 * EPMRPP-83282 || Code review fixes - 2 --- app/localization/translated/be.json | 5 +- app/localization/translated/ru.json | 5 +- app/localization/translated/uk.json | 5 +- app/src/common/constants/userProfileRoutes.js | 19 +++++ app/src/controllers/pages/constants.js | 2 + app/src/controllers/pages/index.js | 2 + app/src/controllers/pages/selectors.js | 2 + .../adminLayout/adminSidebar/adminSidebar.jsx | 8 +- .../appLayout/appSidebar/appSidebar.jsx | 6 +- .../common/sidebar/userBlock/userBlock.jsx | 6 +- app/src/layouts/pageLayout/pageLayout.scss | 1 + .../accessTokenBlock/accessTokenBlock.scss | 2 + .../assignedProjectsBlock.jsx | 3 +- .../assignedProjectsBlock.scss | 6 +- .../configExamplesBlock.jsx | 12 +-- .../configExamplesBlock.scss | 2 + .../localizationBlock/localizationBlock.jsx | 17 ++-- .../localizationBlock/localizationBlock.scss | 38 +++++---- .../personalInfoBlock/personalInfoBlock.jsx | 7 +- .../personalInfoBlock/personalInfoBlock.scss | 1 - .../pages/inside/profilePage/profilePage.jsx | 84 ++++++++++++++++--- .../pages/inside/profilePage/profilePage.scss | 21 +++-- app/src/routes/constants.js | 2 + app/src/routes/routesMap.js | 13 ++- 24 files changed, 188 insertions(+), 81 deletions(-) create mode 100644 app/src/common/constants/userProfileRoutes.js diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 9e71648ba1..495f0527e8 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -309,7 +309,6 @@ "Conditions.withoutAllShort": "!усе", "Conditions.withoutAny": "Без аніякога", "Conditions.withoutAnyShort": "!люб", - "ConfigExamplesBlock.header": "Прыклады наладаў", "ConnectionSection.connectedMessage": "Падключана", "ConnectionSection.connectionFailedMessage": "Падключэнне не ўдалося", "ConnectionSection.connectionTitle": "Падключэнне", @@ -1364,7 +1363,6 @@ "PersonalInfoBlock.changePassword": "Змяніць Пароль", "PersonalInfoBlock.errorChangePassword": "Памылка! Не ўдаецца змяніць пароль", "PersonalInfoBlock.forceUpdate": "Абнавіць Прымусова", - "PersonalInfoBlock.header": "Асабістая інфармацыя", "PersonalInfoBlock.inProgress": "У працэсе", "PersonalInfoBlock.passwordChanged": "Ваш пароль паспяхова зменены", "PersonalInfoBlock.synchronize": "Інфармацыя аб карыстальніку паспяхова сінхранізавана", @@ -1441,6 +1439,9 @@ "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дубляваныя імёны слупкоў забароненыя", "ProfilePage.title": "Профіль карыстальніка", + "ProfilePage.projectAssignmentTab": "Праектнае заданне", + "ProfilePage.apiKeys": "API ключы", + "ProfilePage.configurationExamples": "Прыклады канфiгурацыi", "Project.deleteDefectSubTypeSuccess": "Тып дэфекту быў паспяхова выдалены", "Project.updateDefectSubTypeSuccess": "Паспяхова завершана!", "ProjectActivity.april": "Красавік", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 1587e6136d..1b108c2c22 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -309,7 +309,6 @@ "Conditions.withoutAllShort": "!все", "Conditions.withoutAny": "Без любого", "Conditions.withoutAnyShort": "!люб", - "ConfigExamplesBlock.header": "Примеры конфигураций", "ConnectionSection.connectedMessage": "Соединено", "ConnectionSection.connectionFailedMessage": "Ошибка соединения", "ConnectionSection.connectionTitle": "Соединение", @@ -1364,7 +1363,6 @@ "PersonalInfoBlock.changePassword": "Изменить Пароль", "PersonalInfoBlock.errorChangePassword": "Ошибка! Не удается изменить пароль", "PersonalInfoBlock.forceUpdate": "Обновить Принудительно", - "PersonalInfoBlock.header": "Персональная информация", "PersonalInfoBlock.inProgress": "В процессе", "PersonalInfoBlock.passwordChanged": "Ваш пароль успешно изменен", "PersonalInfoBlock.synchronize": "Информация о пользователе успешно синхронизирована", @@ -1441,6 +1439,9 @@ "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дублированные имена столбцов запрещены", "ProfilePage.title": "Профиль пользователя", + "ProfilePage.projectAssignmentTab": "Заданные проекты", + "ProfilePage.apiKeys": "API ключи", + "ProfilePage.configurationExamples": "Примеры конфигурации", "Project.deleteDefectSubTypeSuccess": "Тип дефекта был успешно удалён", "Project.updateDefectSubTypeSuccess": "Успешно завершено!", "ProjectActivity.april": "Апрель", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index d41ecf8740..14355a6fc7 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -309,7 +309,6 @@ "Conditions.withoutAllShort": "!всі", "Conditions.withoutAny": "Без будь-якого", "Conditions.withoutAnyShort": "!буд", - "ConfigExamplesBlock.header": "Приклади конфігурацій", "ConnectionSection.connectedMessage": "З'єднано", "ConnectionSection.connectionFailedMessage": "Помилка з'єднання", "ConnectionSection.connectionTitle": "З'єднання", @@ -1364,7 +1363,6 @@ "PersonalInfoBlock.changePassword": "Змінити Пароль", "PersonalInfoBlock.errorChangePassword": "Помилка! Не вдається змінити пароль", "PersonalInfoBlock.forceUpdate": "Оновити Примусово", - "PersonalInfoBlock.header": "Персональна інформація", "PersonalInfoBlock.inProgress": "У процесі", "PersonalInfoBlock.passwordChanged": "Ваш пароль успішно змінено", "PersonalInfoBlock.synchronize": "Інформація про користувача успішно синхронізована", @@ -1441,6 +1439,9 @@ "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дубльовані імена стовпців заборонені", "ProfilePage.title": "Профіль користувача", + "ProfilePage.projectAssignmentTab": "Проектне завдання", + "ProfilePage.apiKeys": "API ключi", + "ProfilePage.configurationExamples": "Приклади конфігурацій", "Project.deleteDefectSubTypeSuccess": "Тип дефекту був успішно видалений", "Project.updateDefectSubTypeSuccess": "Успішно завершено!", "ProjectActivity.april": "Квітень", diff --git a/app/src/common/constants/userProfileRoutes.js b/app/src/common/constants/userProfileRoutes.js new file mode 100644 index 0000000000..8db2ead85c --- /dev/null +++ b/app/src/common/constants/userProfileRoutes.js @@ -0,0 +1,19 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const API_KEYS_ROUTE = 'apiKeys'; +export const PROJECT_ASSIGNMENT_ROUTE = 'assignedProjects'; +export const CONFIG_EXAMPLES_ROUTE = 'configExamples'; diff --git a/app/src/controllers/pages/constants.js b/app/src/controllers/pages/constants.js index cf1c91c905..e3896ee850 100644 --- a/app/src/controllers/pages/constants.js +++ b/app/src/controllers/pages/constants.js @@ -48,6 +48,7 @@ export const PROJECT_USERDEBUG_TEST_ITEM_PAGE = 'PROJECT_USERDEBUG_TEST_ITEM_PAG export const PROJECT_LOG_PAGE = 'PROJECT_LOG_PAGE'; export const PROJECT_USERDEBUG_LOG_PAGE = 'PROJECT_USERDEBUG_LOG_PAGE'; export const USER_PROFILE_PAGE = 'USER_PROFILE_PAGE'; +export const USER_PROFILE_SUB_PAGE = 'USER_PROFILE_SUB_PAGE'; export const HISTORY_PAGE = 'HISTORY_PAGE'; export const UNIQUE_ERRORS_PAGE = 'UNIQUE_ERRORS_PAGE'; export const TEST_ITEM_PAGE = 'TEST_ITEM_PAGE'; @@ -82,6 +83,7 @@ export const pageNames = { PROJECT_USERDEBUG_PAGE, PROJECT_USERDEBUG_TEST_ITEM_PAGE, USER_PROFILE_PAGE, + USER_PROFILE_SUB_PAGE, LOGIN_PAGE, REGISTRATION_PAGE, TEST_ITEM_PAGE, diff --git a/app/src/controllers/pages/index.js b/app/src/controllers/pages/index.js index aaea78b04c..e6ee1c22a1 100644 --- a/app/src/controllers/pages/index.js +++ b/app/src/controllers/pages/index.js @@ -39,6 +39,7 @@ export { currentPathSelector, pluginPageSelector, pluginRouteSelector, + userProfileRouteSelector, } from './selectors'; export { updatePagePropertiesAction, clearPageStateAction } from './actionCreators'; @@ -67,6 +68,7 @@ export { PROJECT_USERDEBUG_PAGE, PROJECT_USERDEBUG_TEST_ITEM_PAGE, USER_PROFILE_PAGE, + USER_PROFILE_SUB_PAGE, LOGIN_PAGE, REGISTRATION_PAGE, HISTORY_PAGE, diff --git a/app/src/controllers/pages/selectors.js b/app/src/controllers/pages/selectors.js index 08a77f390d..2225fdd639 100644 --- a/app/src/controllers/pages/selectors.js +++ b/app/src/controllers/pages/selectors.js @@ -54,6 +54,8 @@ export const pluginsTabSelector = (state) => payloadSelector(state).pluginsTab; export const pluginPageSelector = (state) => payloadSelector(state).pluginPage; export const pluginRouteSelector = (state) => payloadSelector(state).pluginRoute; +export const userProfileRouteSelector = (state) => payloadSelector(state).profileRoute; + export const pageSelector = (state) => pageNames[state.location.type] || NO_PAGE; export const projectSectionSelector = (state) => payloadSelector(state).projectSection || ''; export const querySelector = createSelector(locationSelector, (location) => location.query || {}); diff --git a/app/src/layouts/adminLayout/adminSidebar/adminSidebar.jsx b/app/src/layouts/adminLayout/adminSidebar/adminSidebar.jsx index 62d1c9c93e..733be9e4c9 100644 --- a/app/src/layouts/adminLayout/adminSidebar/adminSidebar.jsx +++ b/app/src/layouts/adminLayout/adminSidebar/adminSidebar.jsx @@ -23,13 +23,13 @@ import Parser from 'html-react-parser'; import Link from 'redux-first-router-link'; import { PROJECT_LAUNCHES_PAGE, - USER_PROFILE_PAGE, SERVER_SETTINGS_PAGE, PLUGINS_PAGE, ALL_USERS_PAGE, PROJECTS_PAGE, PLUGIN_UI_EXTENSION_ADMIN_PAGE, -} from 'controllers/pages/constants'; + USER_PROFILE_PAGE, +} from 'controllers/pages'; import { ALL } from 'common/constants/reservedFilterIds'; import PropTypes from 'prop-types'; import track, { useTracking } from 'react-tracking'; @@ -165,7 +165,9 @@ export class AdminSidebar extends Component { }, { onClick: this.props.onClickNavBtn, - link: { type: USER_PROFILE_PAGE }, + link: { + type: USER_PROFILE_PAGE, + }, icon: ProfileIcon, message: , }, diff --git a/app/src/layouts/appLayout/appSidebar/appSidebar.jsx b/app/src/layouts/appLayout/appSidebar/appSidebar.jsx index e91ec908d7..6567133790 100644 --- a/app/src/layouts/appLayout/appSidebar/appSidebar.jsx +++ b/app/src/layouts/appLayout/appSidebar/appSidebar.jsx @@ -34,10 +34,10 @@ import { PROJECT_USERDEBUG_PAGE, LAUNCHES_PAGE, PROJECT_FILTERS_PAGE, - USER_PROFILE_PAGE, ADMINISTRATE_PAGE, PROJECT_MEMBERS_PAGE, PROJECT_SETTINGS_PAGE, + USER_PROFILE_PAGE, } from 'controllers/pages/constants'; import { uiExtensionSidebarComponentsSelector } from 'controllers/plugins'; import { Sidebar } from 'layouts/common/sidebar'; @@ -160,7 +160,9 @@ export class AppSidebar extends Component { createBottomSidebarItems = () => [ { onClick: this.props.onClickNavBtn, - link: { type: USER_PROFILE_PAGE }, + link: { + type: USER_PROFILE_PAGE, + }, icon: ProfileIcon, message: , }, diff --git a/app/src/layouts/common/sidebar/userBlock/userBlock.jsx b/app/src/layouts/common/sidebar/userBlock/userBlock.jsx index 29517e27a0..20ec539715 100644 --- a/app/src/layouts/common/sidebar/userBlock/userBlock.jsx +++ b/app/src/layouts/common/sidebar/userBlock/userBlock.jsx @@ -27,7 +27,7 @@ import { withTooltip } from 'components/main/tooltips/tooltip'; import { TextTooltip } from 'components/main/tooltips/textTooltip'; import { userInfoSelector, photoTimeStampSelector } from 'controllers/user'; import { logoutAction } from 'controllers/auth'; -import { API_PAGE, ADMINISTRATE_PAGE, USER_PROFILE_PAGE } from 'controllers/pages/constants'; +import { API_PAGE, ADMINISTRATE_PAGE, USER_PROFILE_PAGE } from 'controllers/pages'; import { SIDEBAR_EVENTS } from 'components/main/analytics/events'; import { NavLink } from 'components/main/navLink'; import { Image } from 'components/main/image'; @@ -155,7 +155,9 @@ export class UserBlock extends Component {
{userDetails}
this.props.tracking.trackEvent(SIDEBAR_EVENTS.CLICK_PROFILE_LINK)} diff --git a/app/src/layouts/pageLayout/pageLayout.scss b/app/src/layouts/pageLayout/pageLayout.scss index c4e235f24e..755be1eb4a 100644 --- a/app/src/layouts/pageLayout/pageLayout.scss +++ b/app/src/layouts/pageLayout/pageLayout.scss @@ -22,6 +22,7 @@ margin: 0; padding: 20px 0 0; position: relative; + height: 100%; @media (max-width: $SCREEN_XS_MAX) { padding: 0; } diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss b/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss index 19adf98fdc..625befd5a8 100644 --- a/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss +++ b/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss @@ -17,6 +17,8 @@ .access-token-block { width: 100%; margin-bottom: 5px; + box-sizing: border-box; + padding: 0 30px; } .header-label { width: 100%; diff --git a/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx b/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx index 00cdf89071..dda6d277bf 100644 --- a/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx +++ b/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx @@ -60,8 +60,7 @@ export class AssignedProjectsBlock extends Component {
{intl.formatMessage(messages.headerRoleCol)}
- - + {Object.keys(projects).map((project) => (
diff --git a/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.scss b/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.scss index b33a54d9b7..81b3683de2 100644 --- a/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.scss +++ b/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.scss @@ -15,10 +15,12 @@ */ .assigned-projects-block { + box-sizing: border-box; width: 100%; + padding: 0 30px; } .name-col { - width: 66%; + width: 80%; overflow: hidden; display: inline-block; box-sizing: border-box; @@ -31,7 +33,7 @@ } } .role-col { - width: 33%; + width: 20%; display: inline-block; box-sizing: border-box; vertical-align: top; diff --git a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx index a23c5b05ce..30e0a5342e 100644 --- a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx +++ b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx @@ -17,12 +17,12 @@ import classNames from 'classnames/bind'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; -import { FormattedMessage } from 'react-intl'; import { ContainerWithTabs } from 'components/main/containerWithTabs'; import { apiTokenValueSelector, activeProjectSelector, userIdSelector } from 'controllers/user'; import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events'; import styles from './configExamplesBlock.scss'; -import { BlockContainerHeader, BlockContainerBody } from '../blockContainer'; +import { BlockContainerBody } from '../blockContainer'; + import { TabsConfig } from './tabsConfig'; const cx = classNames.bind(styles); @@ -47,14 +47,6 @@ export class ConfigExamplesBlock extends Component { const { token, activeProject, login } = this.props; return (
- - - - -
- - {this.props.lang !== DEFAULT_LANGUAGE && ( -
-

{this.props.intl.formatMessage(messages.note)}:

-

- {Parser(this.props.intl.formatMessage(messages.contribute))} -

-
- )}
+ {this.props.lang !== DEFAULT_LANGUAGE && ( +
+

{this.props.intl.formatMessage(messages.note)}:

+

+ {Parser(this.props.intl.formatMessage(messages.contribute))} +

+
+ )}
); } diff --git a/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.scss b/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.scss index 97f046fc53..818e4cba81 100644 --- a/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.scss +++ b/app/src/pages/inside/profilePage/localizationBlock/localizationBlock.scss @@ -15,13 +15,17 @@ */ .localization-block { - margin: 30px 0 30px 15px; + box-sizing: border-box; + padding: 15px 45px; display: flex; align-items: start; @media (max-width: $SCREEN_SM_MAX) { margin: 30px 0 0 15px; } + + border-top: 2px solid $COLOR--gray-91; } + .label { margin-right: 30px; margin-top: 5px; @@ -42,19 +46,23 @@ display: flex; align-items: center; } -.note { - margin-top: 5px; - line-height: 18px; - font-size: 13px; - color: $COLOR--tealish; -} -.text { - line-height: 18px; - color: $COLOR--charcoal-grey; - font-size: 12px; - a { - color: $COLOR--topaz; - cursor: pointer; - text-decoration: none; +.description { + margin-left: 15px; + + .note { + line-height: 18px; + font-size: 13px; + color: $COLOR--tealish; + } + + .text { + line-height: 18px; + color: $COLOR--charcoal-grey; + font-size: 12px; + a { + color: $COLOR--topaz; + cursor: pointer; + text-decoration: none; + } } } diff --git a/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.jsx b/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.jsx index 844fce941a..45f0996bc6 100644 --- a/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.jsx +++ b/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.jsx @@ -32,17 +32,13 @@ import { GhostButton } from 'components/buttons/ghostButton'; import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events'; import { Image } from 'components/main/image'; import styles from './personalInfoBlock.scss'; -import { BlockContainerBody, BlockContainerHeader } from '../blockContainer'; +import { BlockContainerBody } from '../blockContainer'; import { PhotoControls } from './photoControls'; import { UserInfo } from './userInfo/userInfo'; const cx = classNames.bind(styles); const messages = defineMessages({ - header: { - id: 'PersonalInfoBlock.header', - defaultMessage: 'Personal information', - }, changePassword: { id: 'PersonalInfoBlock.changePassword', defaultMessage: 'Change Password', @@ -187,7 +183,6 @@ export class PersonalInfoBlock extends Component { const { forceUpdateInProgress } = this.state; return (
- {intl.formatMessage(messages.header)}
diff --git a/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.scss b/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.scss index b9c18aab40..d1997d0e43 100644 --- a/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.scss +++ b/app/src/pages/inside/profilePage/personalInfoBlock/personalInfoBlock.scss @@ -32,7 +32,6 @@ width: 100%; min-height: 160px; padding: 15px; - margin-bottom: 15px; box-sizing: border-box; @media (max-width: $SCREEN_XS_MAX) { diff --git a/app/src/pages/inside/profilePage/profilePage.jsx b/app/src/pages/inside/profilePage/profilePage.jsx index 4cf0a6cc68..e952955526 100644 --- a/app/src/pages/inside/profilePage/profilePage.jsx +++ b/app/src/pages/inside/profilePage/profilePage.jsx @@ -19,8 +19,16 @@ import PropTypes from 'prop-types'; import track from 'react-tracking'; import { defineMessages, injectIntl } from 'react-intl'; import classNames from 'classnames/bind'; -import { PageLayout, PageHeader, PageSection } from 'layouts/pageLayout'; +import { connect } from 'react-redux'; +import { PageLayout, PageHeader } from 'layouts/pageLayout'; import { PROFILE_PAGE } from 'components/main/analytics/events'; +import { userProfileRouteSelector, USER_PROFILE_SUB_PAGE } from 'controllers/pages'; +import { NavigationTabs } from 'components/main/navigationTabs'; +import { + API_KEYS_ROUTE, + CONFIG_EXAMPLES_ROUTE, + PROJECT_ASSIGNMENT_ROUTE, +} from 'common/constants/userProfileRoutes'; import { PersonalInfoBlock } from './personalInfoBlock'; import { AccessTokenBlock } from './accessTokenBlock'; import { AssignedProjectsBlock } from './assignedProjectsBlock'; @@ -35,12 +43,60 @@ const messages = defineMessages({ id: 'ProfilePage.title', defaultMessage: 'User profile', }, + profilePageProjectAssignmentTab: { + id: 'ProfilePage.projectAssignmentTab', + defaultMessage: 'Project assignment', + }, + profilePageProjectApiKeysTab: { + id: 'ProfilePage.apiKeys', + defaultMessage: 'API keys', + }, + profilePageConfigurationExamplesTab: { + id: 'ProfilePage.configurationExamples', + defaultMessage: 'Configuration examples', + }, +}); + +const getProfilePageLink = (profileRoute) => ({ + type: USER_PROFILE_SUB_PAGE, + payload: { + profileRoute, + }, }); + +const getNavigationTabsConfig = (formatMessage) => ({ + [PROJECT_ASSIGNMENT_ROUTE]: { + name: formatMessage(messages.profilePageProjectAssignmentTab), + link: getProfilePageLink(PROJECT_ASSIGNMENT_ROUTE), + component: , + }, + [API_KEYS_ROUTE]: { + name: formatMessage(messages.profilePageProjectApiKeysTab), + link: getProfilePageLink(API_KEYS_ROUTE), + component: , + }, + [CONFIG_EXAMPLES_ROUTE]: { + name: formatMessage(messages.profilePageConfigurationExamplesTab), + link: getProfilePageLink(CONFIG_EXAMPLES_ROUTE), + component: , + }, +}); + +@connect((state) => ({ + activeTab: userProfileRouteSelector(state), +})) @injectIntl @track({ page: PROFILE_PAGE }) export class ProfilePage extends Component { static propTypes = { intl: PropTypes.object.isRequired, + activeTab: PropTypes.string, + dispatch: PropTypes.func, + }; + + static defaultProps = { + activeTab: PROJECT_ASSIGNMENT_ROUTE, + dispatch: () => {}, }; getBreadcrumbs = () => [{ title: this.props.intl.formatMessage(messages.profilePageTitle) }]; @@ -48,19 +104,21 @@ export class ProfilePage extends Component { render = () => ( - -
-
- - - -
-
- - +
+
+
+
+ +
+
-
- + + +
); } diff --git a/app/src/pages/inside/profilePage/profilePage.scss b/app/src/pages/inside/profilePage/profilePage.scss index cb9f24c8af..55743ed6e7 100644 --- a/app/src/pages/inside/profilePage/profilePage.scss +++ b/app/src/pages/inside/profilePage/profilePage.scss @@ -15,17 +15,20 @@ */ .container { - display: flex; + height: 93%; background-color: $COLOR--white-two; - @media (max-width: $SCREEN_SM_MAX) { + padding: 0 120px; + + .content-wrapper { + display: flex; flex-direction: column; - } -} -.column { - width: 50%; - padding: 15px; - box-sizing: border-box; - @media (max-width: $SCREEN_SM_MAX) { + justify-content: space-between; width: 100%; + height: 100%; + max-width: 1370px; + margin: 0 auto; + .section-wrapper { + padding: 0 30px; + } } } diff --git a/app/src/routes/constants.js b/app/src/routes/constants.js index ab8ac0c689..48bf31fde1 100644 --- a/app/src/routes/constants.js +++ b/app/src/routes/constants.js @@ -51,6 +51,7 @@ import { OAUTH_SUCCESS, PLUGIN_UI_EXTENSION_ADMIN_PAGE, UNIQUE_ERRORS_PAGE, + USER_PROFILE_SUB_PAGE, } from 'controllers/pages'; import { AdminUiExtensionPage } from 'pages/admin/adminUiExtensionPage'; @@ -64,6 +65,7 @@ export const pageRendering = { REGISTRATION_PAGE: { component: RegistrationPage, layout: EmptyLayout, access: ANONYMOUS_ACCESS }, [OAUTH_SUCCESS]: { component: EmptyLayout, layout: EmptyLayout, access: ANONYMOUS_ACCESS }, USER_PROFILE_PAGE: { component: ProfilePage, layout: AppLayout }, + [USER_PROFILE_SUB_PAGE]: { component: ProfilePage, layout: AppLayout }, API_PAGE: { component: ApiPage, layout: AppLayout }, PROJECT_DASHBOARD_PAGE: { component: DashboardPage, layout: AppLayout }, PROJECT_DASHBOARD_ITEM_PAGE: { component: DashboardItemPage, layout: AppLayout }, diff --git a/app/src/routes/routesMap.js b/app/src/routes/routesMap.js index 2a0d88b0d0..a742da0fd4 100644 --- a/app/src/routes/routesMap.js +++ b/app/src/routes/routesMap.js @@ -53,6 +53,7 @@ import { clearPageStateAction, adminPageNames, PLUGIN_UI_EXTENSION_ADMIN_PAGE, + USER_PROFILE_SUB_PAGE, } from 'controllers/pages'; import { GENERAL, AUTHORIZATION_CONFIGURATION, ANALYTICS } from 'common/constants/settingsTabs'; import { ADMINISTRATOR } from 'common/constants/accountRoles'; @@ -83,6 +84,11 @@ import { startSetViewMode } from 'controllers/administrate/projects/actionCreato import { SIZE_KEY } from 'controllers/pagination'; import { setSessionItem, updateStorageItem } from 'common/utils/storageUtils'; import { fetchClustersAction } from 'controllers/uniqueErrors'; +import { + API_KEYS_ROUTE, + CONFIG_EXAMPLES_ROUTE, + PROJECT_ASSIGNMENT_ROUTE, +} from 'common/constants/userProfileRoutes'; import { pageRendering, ANONYMOUS_ACCESS, ADMIN_ACCESS } from './constants'; const redirectRoute = (path, createNewAction, onRedirect = () => {}) => ({ @@ -104,7 +110,12 @@ const routesMap = { [NOT_FOUND]: '/notfound', ADMINISTRATE_PAGE: redirectRoute('/administrate', () => ({ type: PROJECTS_PAGE })), - USER_PROFILE_PAGE: '/user-profile', + USER_PROFILE_PAGE: redirectRoute('/userProfile', () => ({ + type: USER_PROFILE_SUB_PAGE, + payload: { profileRoute: PROJECT_ASSIGNMENT_ROUTE }, + })), + + [USER_PROFILE_SUB_PAGE]: `/userProfile/:profileRoute(${PROJECT_ASSIGNMENT_ROUTE}|${API_KEYS_ROUTE}|${CONFIG_EXAMPLES_ROUTE})`, API_PAGE: '/api', From 422c1542981ad491b1a0a77be9c4badf5c46deca Mon Sep 17 00:00:00 2001 From: Bam6ycha <84175555+Bam6ycha@users.noreply.github.com> Date: Thu, 27 Apr 2023 19:25:44 +0500 Subject: [PATCH 02/17] EPMRPP-83068 || Update admin permissions (#3466) * EPMRPP-83068 || Update admin permissions * EPMRPP-83068 || Code review fixes - 1 --- app/localization/translated/be.json | 3 -- app/localization/translated/ru.json | 3 -- app/localization/translated/uk.json | 3 -- .../administrate/projects/sagas.js | 38 +++++-------------- app/src/controllers/modal/index.js | 1 - app/src/controllers/modal/sagas.js | 31 --------------- app/src/controllers/user/index.js | 1 + app/src/controllers/user/selectors.js | 18 +++++++++ .../appLayout/appSidebar/appSidebar.jsx | 12 +++--- app/src/pages/admin/projectsPage/messages.js | 16 -------- .../projectsPage/projectName/projectName.jsx | 14 +------ app/src/routes/routesMap.js | 5 ++- 12 files changed, 38 insertions(+), 107 deletions(-) delete mode 100644 app/src/controllers/modal/sagas.js diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 495f0527e8..b2f04b9580 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -1476,8 +1476,6 @@ "ProjectDetailsPageEvents.title": "Падзеі", "ProjectDetailsPageMembers.title": "Налады", "ProjectDetailsPageSettings.title": "Настройки", - "ProjectPage.assignButton": "Прызначыць", - "ProjectPage.assignModalTitle": "Прызначыць на праект", "ProjectPanel.assign": "Прызначыць", "ProjectPanel.delete": "Выдаліць", "ProjectPanel.internal": "Унутраны", @@ -1515,7 +1513,6 @@ "ProjectsPage.addProjectSuccess": "Праект ''{name}'' быў паспяхова створаны", "ProjectsPage.addProjectTitle": "Дадаць Праект", "ProjectsPage.assignError": "Адбылася памылка пры прысваенні праекту", - "ProjectsPage.assignModalConfirmationText": "Вы яшчэ не з'яўляецеся удзельнікам гэтага праекта. Хацелі б вы быць прызначаным?", "ProjectsPage.assignSuccess": "Вы прызначаныя на праект", "ProjectsPage.dateCol": "Дата", "ProjectsPage.deleteError": "Пры выдаленні праекта ўзнікла памылка", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 1b108c2c22..7137b691f4 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -1476,8 +1476,6 @@ "ProjectDetailsPageEvents.title": "События", "ProjectDetailsPageMembers.title": "Участники", "ProjectDetailsPageSettings.title": "Настройки", - "ProjectPage.assignButton": "Назначить", - "ProjectPage.assignModalTitle": "Назначить на проект", "ProjectPanel.assign": "Назначить", "ProjectPanel.delete": "Удалить", "ProjectPanel.internal": "Внутренний", @@ -1515,7 +1513,6 @@ "ProjectsPage.addProjectSuccess": "Проект ''{name}'' успешно создан", "ProjectsPage.addProjectTitle": "Добавить Проект", "ProjectsPage.assignError": "В процессе назначения на проект произошла ошибка", - "ProjectsPage.assignModalConfirmationText": "Вы еще не являетесь участником этого проекта. Хотели бы вы быть назначенным?", "ProjectsPage.assignSuccess": "Вы назначены на проект", "ProjectsPage.dateCol": "Дата", "ProjectsPage.deleteError": "При удалении проекта возникла ошибка", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index 14355a6fc7..d5eeee50ee 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -1476,8 +1476,6 @@ "ProjectDetailsPageEvents.title": "Події", "ProjectDetailsPageMembers.title": "Учасники", "ProjectDetailsPageSettings.title": "Налаштування", - "ProjectPage.assignButton": "Призначити", - "ProjectPage.assignModalTitle": "Призначити на проект", "ProjectPanel.assign": "Призначити", "ProjectPanel.delete": "Видалити", "ProjectPanel.internal": "Внутрішній", @@ -1515,7 +1513,6 @@ "ProjectsPage.addProjectSuccess": "Проект ''{name}'' успешно создан", "ProjectsPage.addProjectTitle": "Проект Додати", "ProjectsPage.assignError": "У процесі призначення на проект сталася помилка", - "ProjectsPage.assignModalConfirmationText": "Ви ще не є учасником цього проекту. Ви Хотіли б бути призначеним?", "ProjectsPage.assignSuccess": "Ви призначені на проект", "ProjectsPage.dateCol": "Дата", "ProjectsPage.deleteError": "При видаленні проекту виникла помилка", diff --git a/app/src/controllers/administrate/projects/sagas.js b/app/src/controllers/administrate/projects/sagas.js index 2c2ce8172a..c83044c280 100644 --- a/app/src/controllers/administrate/projects/sagas.js +++ b/app/src/controllers/administrate/projects/sagas.js @@ -14,22 +14,16 @@ * limitations under the License. */ -import { takeEvery, takeLatest, race, take, all, put, select, call } from 'redux-saga/effects'; +import { takeEvery, takeLatest, all, put, select, call } from 'redux-saga/effects'; import { fetchDataAction } from 'controllers/fetch'; import { URLS } from 'common/urls'; import { showNotification, NOTIFICATION_TYPES } from 'controllers/notification'; -import { - assignedProjectsSelector, - ASSIGN_TO_RROJECT, - ASSIGN_TO_RROJECT_SUCCESS, - ASSIGN_TO_RROJECT_ERROR, - assignToProjectSuccessAction, -} from 'controllers/user'; +import { assignToProjectSuccessAction } from 'controllers/user'; import { PROJECT_TYPE_INTERNAL } from 'common/constants/projectsObjectTypes'; import { SETTINGS } from 'common/constants/projectSections'; import { fetch, getStorageItem, setStorageItem } from 'common/utils'; import { PROJECT_PAGE } from 'controllers/pages'; -import { confirmSaga, hideModalAction } from 'controllers/modal'; +import { hideModalAction } from 'controllers/modal'; import { PROJECT_MANAGER } from 'common/constants/projectRoles'; import { NAMESPACE, @@ -143,26 +137,12 @@ function* watchDeleteProject() { } function* navigateToProject({ payload }) { - const { project, confirmModalOptions } = payload; - const assignedProjects = yield select(assignedProjectsSelector); - let isAssigned = !!assignedProjects[project.projectName]; - if (!isAssigned) { - const isConfirmed = yield call(confirmSaga, confirmModalOptions); - if (isConfirmed) { - yield put({ type: ASSIGN_TO_RROJECT, payload: project }); - const assignResult = yield race({ - isAssigned: take(ASSIGN_TO_RROJECT_SUCCESS), - noAssigned: take(ASSIGN_TO_RROJECT_ERROR), - }); - isAssigned = !!assignResult.isAssigned; - } - } - if (isAssigned) { - yield put({ - type: PROJECT_PAGE, - payload: { projectId: project.projectName }, - }); - } + const { project } = payload; + + yield put({ + type: PROJECT_PAGE, + payload: { projectId: project.projectName }, + }); } function* watchNavigateToProject() { diff --git a/app/src/controllers/modal/index.js b/app/src/controllers/modal/index.js index 30b6b3f684..af5a67672a 100644 --- a/app/src/controllers/modal/index.js +++ b/app/src/controllers/modal/index.js @@ -19,5 +19,4 @@ export { showModalAction, hideModalAction, confirmModalAction } from './actionCr export { modalReducer } from './reducer'; export { activeModalSelector } from './selectors'; export { getModal, addModal } from './modalsMap'; -export { confirmSaga } from './sagas'; export { withModal } from './withModal'; diff --git a/app/src/controllers/modal/sagas.js b/app/src/controllers/modal/sagas.js deleted file mode 100644 index 1b0d3c382d..0000000000 --- a/app/src/controllers/modal/sagas.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2019 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { take, put, race } from 'redux-saga/effects'; -import { showModalAction, hideModalAction } from './actionCreators'; -import { HIDE_MODAL, CONFIRM_MODAL } from './constants'; - -export function* confirmSaga(confirmationModalOptions) { - yield put(showModalAction(confirmationModalOptions)); - const { confirmed } = yield race({ - confirmed: take(CONFIRM_MODAL), - cancelled: take(HIDE_MODAL), - }); - if (confirmed) { - yield put(hideModalAction()); - } - return !!confirmed; -} diff --git a/app/src/controllers/user/index.js b/app/src/controllers/user/index.js index 8ac414619c..e085e6e92b 100644 --- a/app/src/controllers/user/index.js +++ b/app/src/controllers/user/index.js @@ -54,5 +54,6 @@ export { apiTokenValueSelector, apiTokenStringSelector, photoIdSelector, + availableProjectsSelector, } from './selectors'; export { userSagas } from './sagas'; diff --git a/app/src/controllers/user/selectors.js b/app/src/controllers/user/selectors.js index 159faa1730..0460a5d0db 100644 --- a/app/src/controllers/user/selectors.js +++ b/app/src/controllers/user/selectors.js @@ -15,6 +15,9 @@ */ import { ADMINISTRATOR } from 'common/constants/accountRoles'; +import { createSelector } from 'reselect'; +import { INTERNAL } from 'common/constants/accountType'; +import { projectInfoSelector } from 'controllers/project/selectors'; import { START_TIME_FORMAT_RELATIVE } from './constants'; const userSelector = (state) => state.user || {}; @@ -39,6 +42,21 @@ export const activeProjectRoleSelector = (state) => { }; export const isAdminSelector = (state) => userInfoSelector(state).userRole === ADMINISTRATOR; +export const availableProjectsSelector = createSelector( + userInfoSelector, + projectInfoSelector, + activeProjectSelector, + isAdminSelector, + ({ assignedProjects }, { entryType = INTERNAL }, activeProjectName, isAdmin) => { + const isAssignedToProject = assignedProjects[activeProjectName]; + const isPropagatedToUnassignedProject = isAdmin && !isAssignedToProject; + + return isPropagatedToUnassignedProject + ? { ...assignedProjects, [activeProjectName]: { entryType } } + : assignedProjects; + }, +); + const apiTokenSelector = (state) => userSelector(state).token || ''; export const apiTokenValueSelector = (state) => apiTokenSelector(state).value; export const apiTokenTypeSelector = (state) => apiTokenSelector(state).type; diff --git a/app/src/layouts/appLayout/appSidebar/appSidebar.jsx b/app/src/layouts/appLayout/appSidebar/appSidebar.jsx index 6567133790..ceff698eca 100644 --- a/app/src/layouts/appLayout/appSidebar/appSidebar.jsx +++ b/app/src/layouts/appLayout/appSidebar/appSidebar.jsx @@ -22,7 +22,7 @@ import { activeProjectSelector, activeProjectRoleSelector, userAccountRoleSelector, - assignedProjectsSelector, + availableProjectsSelector, } from 'controllers/user'; import { SIDEBAR_EVENTS } from 'components/main/analytics/events'; import { FormattedMessage } from 'react-intl'; @@ -53,7 +53,7 @@ import { ProjectSelector } from '../../common/projectSelector'; @connect((state) => ({ activeProject: activeProjectSelector(state), - assignedProjects: assignedProjectsSelector(state), + availableProjects: availableProjectsSelector(state), projectRole: activeProjectRoleSelector(state), accountRole: userAccountRoleSelector(state), extensionComponents: uiExtensionSidebarComponentsSelector(state), @@ -68,12 +68,12 @@ export class AppSidebar extends Component { trackEvent: PropTypes.func, getTrackingData: PropTypes.func, }).isRequired, - assignedProjects: PropTypes.object, + availableProjects: PropTypes.object, extensionComponents: PropTypes.array, onClickNavBtn: PropTypes.func, }; static defaultProps = { - assignedProjects: {}, + availableProjects: {}, extensionComponents: [], onClickNavBtn: () => {}, }; @@ -175,12 +175,12 @@ export class AppSidebar extends Component { ]; render() { - const { assignedProjects, activeProject } = this.props; + const { availableProjects, activeProject } = this.props; const topSidebarItems = this.createTopSidebarItems(); const bottomSidebarItems = this.createBottomSidebarItems(); const mainBlock = ( ); diff --git a/app/src/pages/admin/projectsPage/messages.js b/app/src/pages/admin/projectsPage/messages.js index b73c35a90a..066f90c87a 100644 --- a/app/src/pages/admin/projectsPage/messages.js +++ b/app/src/pages/admin/projectsPage/messages.js @@ -54,10 +54,6 @@ export const messages = defineMessages({ id: 'ProjectDetailsPageEvents.title', defaultMessage: 'Events', }, - modalCancelButtonText: { - id: 'Common.cancel', - defaultMessage: 'Cancel', - }, deleteProjectsCount: { id: 'ProjectsPage.deleteProjectsCount', defaultMessage: '{count} items selected', @@ -158,18 +154,6 @@ export const messages = defineMessages({ id: 'ProjectPanel.lastLaunch', defaultMessage: '{date} run', }, - assignModalConfirmationText: { - id: 'ProjectsPage.assignModalConfirmationText', - defaultMessage: 'You are not a member of this project yet. Would you like to be assigned?', - }, - assignModalTitle: { - id: 'ProjectPage.assignModalTitle', - defaultMessage: 'Assign to the project', - }, - assignModalButton: { - id: 'ProjectPage.assignButton', - defaultMessage: 'Assign', - }, searchPlaceholder: { id: 'ProjectsPage.searchPlaceholder', defaultMessage: 'Search by name', diff --git a/app/src/pages/admin/projectsPage/projectName/projectName.jsx b/app/src/pages/admin/projectsPage/projectName/projectName.jsx index 818e531235..ab36d205e2 100644 --- a/app/src/pages/admin/projectsPage/projectName/projectName.jsx +++ b/app/src/pages/admin/projectsPage/projectName/projectName.jsx @@ -27,7 +27,6 @@ import { navigateToProjectAction } from 'controllers/administrate/projects'; import { showModalAction } from 'controllers/modal'; import { PROJECT_PAGE } from 'controllers/pages'; import { assignedProjectsSelector } from 'controllers/user'; -import { messages } from './../messages'; import styles from './projectName.scss'; const cx = classNames.bind(styles); @@ -63,24 +62,13 @@ export class ProjectName extends Component { }; onProjectClick = (event) => { - const { tracking, intl, isAssigned, disableAnalytics } = this.props; + const { tracking, isAssigned, disableAnalytics } = this.props; if (!isAssigned && window.matchMedia(SCREEN_XS_MAX_MEDIA).matches) { event.preventDefault(); return; } - const confirmAssignModalOpts = { - id: 'confirmationModal', - data: { - message: intl.formatMessage(messages.assignModalConfirmationText), - onConfirm: () => {}, - title: intl.formatMessage(messages.assignModalTitle), - confirmText: intl.formatMessage(messages.assignModalButton), - cancelText: intl.formatMessage(messages.modalCancelButtonText), - }, - }; this.props.navigateToProject({ project: this.props.project, - confirmModalOptions: confirmAssignModalOpts, }); if (!disableAnalytics) { tracking.trackEvent(ADMIN_PROJECTS_PAGE_EVENTS.PROJECT_NAME); diff --git a/app/src/routes/routesMap.js b/app/src/routes/routesMap.js index a742da0fd4..462b84197b 100644 --- a/app/src/routes/routesMap.js +++ b/app/src/routes/routesMap.js @@ -287,6 +287,7 @@ export const onBeforeRouteChange = (dispatch, getState, { action }) => { const accountRole = userAccountRoleSelector(getState()); const userInfo = userInfoSelector(getState()); const userProjects = userInfo ? userInfo.assignedProjects : {}; + const isAdmin = accountRole === ADMINISTRATOR; const isAdminNewPageType = !!adminPageNames[nextPageType]; const isAdminCurrentPageType = !!adminPageNames[currentPageType]; @@ -296,7 +297,7 @@ export const onBeforeRouteChange = (dispatch, getState, { action }) => { (hashProject !== projectId || isAdminCurrentPageType) && !isAdminNewPageType ) { - if (hashProject in userProjects) { + if (hashProject in userProjects || isAdmin) { dispatch(setActiveProjectAction(hashProject)); dispatch(fetchProjectAction(hashProject)); projectId = hashProject; @@ -327,7 +328,7 @@ export const onBeforeRouteChange = (dispatch, getState, { action }) => { } break; case ADMIN_ACCESS: - if (authorized && accountRole !== ADMINISTRATOR) { + if (authorized && !isAdmin) { dispatch(redirect({ type: PROJECT_DASHBOARD_PAGE, payload: { projectId } })); } else if (!authorized) { setSessionItem(ANONYMOUS_REDIRECT_PATH_STORAGE_KEY, redirectPath); From 827d38fda1818ec5d31263a0356247e15ef110e8 Mon Sep 17 00:00:00 2001 From: Bam6ycha <84175555+Bam6ycha@users.noreply.github.com> Date: Fri, 28 Apr 2023 15:04:47 +0500 Subject: [PATCH 03/17] EPMRPP-83606 || Inaccuracies on Profile page (#3468) --- app/localization/translated/be.json | 2 +- app/localization/translated/ru.json | 2 +- app/localization/translated/uk.json | 2 +- .../assignedProjectsBlock/assignedProjectsBlock.jsx | 4 ++-- .../profilePage/configExamplesBlock/configExamplesBlock.scss | 3 +-- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index b2f04b9580..4a87530bb2 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -109,7 +109,7 @@ "AnalyticsTab.analyticsListPoint2": "Інфармацыя пра паводзіны: падрабязнасці вашага выкарыстання ReportPortal, на што вы націскаеце і якія дзеянні вырабляеце, як доўга трымаеце прыкладанне адкрытым.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Настройкі сервера паспяхова абноўленыя", "ApiPage.title": "Дакументацыя API", - "AssignedProjectsBlock.headerNameCol": "Прызначаныя праекты", + "AssignedProjectsBlock.headerNameCol": "Праекты", "AssignedProjectsBlock.headerRoleCol": "Праектная роля", "AsyncAutocomplete.dynamicSearchPromptText": "Калі ласка увядзіце {length} або больш сімвалаў", "AsyncAutocomplete.loading": "Загрузка ...", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 7137b691f4..ec7481f07e 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -109,7 +109,7 @@ "AnalyticsTab.analyticsListPoint2": "Информация о поведении: подробности вашего использования ReportPortal, на что вы нажимаете и какие действия производите, как долго держите приложение открытым.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Настройки сервера успешно обновлены", "ApiPage.title": "Документация API", - "AssignedProjectsBlock.headerNameCol": "Назначенные проекты", + "AssignedProjectsBlock.headerNameCol": "Проекты", "AssignedProjectsBlock.headerRoleCol": "Проектная роль", "AsyncAutocomplete.dynamicSearchPromptText": "Пожалуйста введите {length} или более символов", "AsyncAutocomplete.loading": "Загрузка ...", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index d5eeee50ee..7652aceb3c 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -109,7 +109,7 @@ "AnalyticsTab.analyticsListPoint2": "Інформація про поведінку: подробиці вашого використання ReportPortal, на що ви натискаєте і які дії виробляєте, як довго тримаєте додаток відкритим.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Налаштування сервера успішно оновлено", "ApiPage.title": "Документація API", - "AssignedProjectsBlock.headerNameCol": "Призначені проекти", + "AssignedProjectsBlock.headerNameCol": "Проекти", "AssignedProjectsBlock.headerRoleCol": "Проектна роль", "AsyncAutocomplete.dynamicSearchPromptText": "Будь-ласка введіть {length} чи більше символів", "AsyncAutocomplete.loading": "Завантаження…", diff --git a/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx b/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx index dda6d277bf..43f017b1e1 100644 --- a/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx +++ b/app/src/pages/inside/profilePage/assignedProjectsBlock/assignedProjectsBlock.jsx @@ -28,7 +28,7 @@ const cx = classNames.bind(styles); const messages = defineMessages({ headerNameCol: { id: 'AssignedProjectsBlock.headerNameCol', - defaultMessage: 'Assigned on projects', + defaultMessage: 'Projects', }, headerRoleCol: { id: 'AssignedProjectsBlock.headerRoleCol', @@ -60,7 +60,7 @@ export class AssignedProjectsBlock extends Component {
{intl.formatMessage(messages.headerRoleCol)}
- + {Object.keys(projects).map((project) => (
diff --git a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss index d45e64ac16..7159fedba1 100644 --- a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss +++ b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss @@ -30,12 +30,11 @@ text-overflow: ellipsis; } .content-container { - padding-top: 10px; box-sizing: border-box; } .content-wrapper { width: 100%; - height: 435px; + height: 360px; padding: 10px 15px; border: 1px solid $COLOR--gray-80; box-sizing: border-box; From c8d3e618b1a539a0d3f927a59fab61190fc50ba4 Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Tue, 2 May 2023 15:21:06 +0400 Subject: [PATCH 04/17] EPMRPP-82423 || Add Data Privacy links to the login page of ReportPortal (#3470) * EPMRPP-82423 || Add Data Privacy links to the login page of ReportPortal * EPMRPP-82423 || code review fixes - 1 --- app/localization/translated/be.json | 22 ++++++------- app/localization/translated/ru.json | 24 +++++++------- app/localization/translated/uk.json | 22 ++++++------- app/src/common/utils/referenceDictionary.js | 2 ++ app/src/controllers/appInfo/constants.js | 5 +++ app/src/controllers/appInfo/selectors.js | 4 +++ app/src/pages/outside/loginPage/loginPage.jsx | 17 ++++++++-- .../loginBlock/loginForm/loginForm.scss | 2 +- .../loginPage/pageBlocks/policyBlock/index.js | 17 ++++++++++ .../pageBlocks/policyBlock/policyBlock.jsx | 31 ++++++++++++++++++ .../pageBlocks/policyBlock/policyBlock.scss | 32 +++++++++++++++++++ .../serviceVersionsBlock.scss | 9 ++---- 12 files changed, 143 insertions(+), 44 deletions(-) create mode 100644 app/src/pages/outside/loginPage/pageBlocks/policyBlock/index.js create mode 100644 app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.jsx create mode 100644 app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.scss diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 4a87530bb2..81dd877a22 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -218,6 +218,7 @@ "Common.finish": "Завяршыць", "Common.forceFinish": "Скончыць прымусова", "Common.invite": "Запрасіць", + "Common.key": "Ключ", "Common.login": "Увайсці", "Common.merge": "Злучыць", "Common.move": "Перамясціць", @@ -239,9 +240,8 @@ "Common.submit": "Адправіць", "Common.uninstall": "Выдаліць", "Common.update": "Актуалізаваць", - "Common.key": "Ключ", - "Common.value": "Значэнне", "Common.validation.email": "Электронны адрас няслушны. Калі ласка, увядзіце слушны электронны адрас.", + "Common.value": "Значэнне", "CommonEntityChanges.create": "стварыў панэль кіравання", "CommonEntityChanges.createFilter": "стварыў фільтр", "CommonEntityChanges.createPattern": "стварыць патэрн", @@ -273,11 +273,11 @@ "ComponentHealthCheckControls.attributesArrayValidationError": "Увядзіце ключы аттрыбута чые унікальнае значэнне будзе выкарыстоўвацца для групоўкі тэстаў", "ComponentHealthCheckTable.automationBugColumnTitle": "Хіба аўтаматызацыі", "ComponentHealthCheckTable.customColumnHint": "Карыстацкі слупок:", + "ComponentHealthCheckTable.nameColumn": "Імя", "ComponentHealthCheckTable.nameTotal": "Усяго", "ComponentHealthCheckTable.passRateColumn": "Хуткасць праходжання", "ComponentHealthCheckTable.passingRateHint": "Хуткасць праходжання:", "ComponentHealthCheckTable.productBugColumnTitle": "Праблема прадукта", - "ComponentHealthCheckTable.nameColumn": "Імя", "ComponentHealthCheckTable.statusColumn": "Статус", "ComponentHealthCheckTable.statusHint": "Статус", "ComponentHealthCheckTable.systemIssueColumnTitle": "Сыстэмная праблема", @@ -349,6 +349,7 @@ "DashboardForm.editModalSubmitButtonText": "Актуалізаваць", "DashboardForm.editModalTitle": "Рэдагаваць панэль кіравання", "DashboardForm.modalCancelButtonText": "Адмяніць", + "DashboardHeaderButton.buttonTooltip": "Ліміт у 300 панэляў дасягнуты. Каб стварыць новы, трэба выдаліць хаця б адзін, створаны раней", "DashboardItemPage.addNewWidget": "Дадаць новы віджэт", "DashboardItemPage.addWidgetSuccess": "Віджэт дададзены", "DashboardItemPage.dashboardEmptyText": "Дадайце Ваш першы віджэт каб прааналізаваць статыстыку", @@ -420,13 +421,10 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "Вы збіраецеся выдаліць не свой фільтр. Гэта можа паўплываць на інфармацыю іншых карыстальнікаў праекта.", "DeleteImageModal.header": "Выдаліць фота", "DeleteImageModal.text": "Вы ўпэўненыя, што жадаеце выдаліць фота профілю?", - "DeleteLaunchDialog.deleteLaunch": "Вы ўпэўнены, што хочаце выдаліць запуск '{name} #{number}'? Ён больш не будзе існаваць..", - "DeleteLaunchDialog.deleteLaunchHeader": "Выдаліць запуск", - "DeleteLaunchDialog.deleteLaunchWarning": "Вы збіраецеся выдаліць не свой уласны запуск. Гэта можа паўплываць на інфармацыю іншых карыстальнікаў на праекце.", "DeleteNotificationCaseModal.message": "Вы ўпэўнены, што жадаеце выдаліць правіла апавяшчэння {number}?", "DeleteNotificationCaseModal.title": "Выдаліць правіла апавяшчэння", - "DeleteWidgetModal.deleteOwnWidgetWarning": "Вы збіраецеся выдаліць ваш відждэт. Гэта можа паўплываць на інфармацыю на вашых панэлях кіравання.", "DeleteWidgetModal.deleteNotOwnWidgetWarning": "Вы збіраецеся выдаліць не ваш відждэт. Гэта можа паўплываць на інфармацыю іншых карыстальнікаў праекта.", + "DeleteWidgetModal.deleteOwnWidgetWarning": "Вы збіраецеся выдаліць ваш відждэт. Гэта можа паўплываць на інфармацыю на вашых панэлях кіравання.", "DeleteWidgetModal.deleteWidgetHeader": "Выдаліць відждэт", "DeleteWidgetModal.deleteWidgetText": "Вы ўпэўнены, што хочаце выдаліць віджэт '{name}'? Вы страціце доступ да яго. Гэта дзеянне нельга адмяніць.", "DemoBanner.descriptionDefault": "Вы ўвайшлі пад уліковым запісам \"Дэма\". Для бяспечнай працы з дадзенымі, выкарыстоўвайце ", @@ -1334,8 +1332,8 @@ "PermissionMap.attention": "Карыстальнік з роляй адміністратара можа выконваць усе аперацыі.", "PermissionMap.changeStatus": "Змена статусу", "PermissionMap.createItem": "Стварыць элемент", - "PermissionMap.editDeleteItem": "Змяніць, выдаліць элемент", "PermissionMap.customer": "Заказчык", + "PermissionMap.editDeleteItem": "Змяніць, выдаліць элемент", "PermissionMap.editProjectSettings": "Змяніць налады праекта", "PermissionMap.investigationActions": "Дзеянні з аналізам (тыпы дэфектаў і пытанні ў сістэме адсочвання памылак)", "PermissionMap.launches": "Запускі", @@ -1409,6 +1407,7 @@ "PluginsPage.uploadButton": "Загрузіць", "PluginsTabs.installed": "Устаноўлены", "PluginsTabs.store": "Крама", + "PolicyBlock.privacyPolicy": "Палітыка прыватнасці", "PostIssueModal.attachmentsHeader": "Укладанні", "PostIssueModal.booleanFieldHint": "Гэта поле можа ўтрымліваць значэння: Праўда/Хлусня", "PostIssueModal.commentsHeader": "Каментарыі", @@ -1438,10 +1437,10 @@ "ProductStatusControls.StartTimeCriteria": "Старт", "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дубляваныя імёны слупкоў забароненыя", - "ProfilePage.title": "Профіль карыстальніка", - "ProfilePage.projectAssignmentTab": "Праектнае заданне", "ProfilePage.apiKeys": "API ключы", "ProfilePage.configurationExamples": "Прыклады канфiгурацыi", + "ProfilePage.projectAssignmentTab": "Праектнае заданне", + "ProfilePage.title": "Профіль карыстальніка", "Project.deleteDefectSubTypeSuccess": "Тып дэфекту быў паспяхова выдалены", "Project.updateDefectSubTypeSuccess": "Паспяхова завершана!", "ProjectActivity.april": "Красавік", @@ -1570,6 +1569,7 @@ "RemoveOrganizationModal.removeOrganizationHeader": "Выдаліць арганізацыю github", "RemoveOrganizationModal.removeSuccessNotification": "Арганізацыя ў GitHub выдалена", "RetriesCounter.label": "{count} спроб", + "RetriesStackTrace.emptyMessage": "Няма трасіроўкі стэка для адлюстравання", "SamlFormFields.emailAttribute": "Паштовы адрас", "SamlFormFields.firstNameAttribute": "Імя", "SamlFormFields.fullNameAttribute": "Імя і прозвішча", @@ -1611,7 +1611,6 @@ "SortingControl.sortByFailedItems": "Няўдалыя пункты", "SortingControl.sortByPassingRate": "Прахадны бал", "SortingControl.sortByTotal": "Агульная колькасць", - "RetriesStackTrace.emptyMessage": "Няма трасіроўкі стэка для адлюстравання", "StackTrace.jumpTo": "Перайсці", "StackTrace.linkText": "Адкрыць логі", "StackTrace.loadLabel": "Загрузіць яшчэ", @@ -1948,6 +1947,7 @@ "administrateUsersPageToolbar.allUsers": "{count} карыстальнікаў выбрана", "administrateUsersPageToolbar.searchPlaceholder": "Шукаць па імені, лагіне, электронным адрасе", "dashboardControl.dashboardName": "Мая першая панэль кіравання", + "dashboardControl.title": "Захаваць віджэт на прыборнай панэлі", "entityInputConditional.defaultPlaceholder": "Увядзiце iмя", "flakyTests.flakyTestsMatrixTooltip": "{statusNumber} {statusChange} з {possibleNumber} {possibleTimes}", "flakyTests.flakyTestsMatrixTooltipChange": "змяненне стану", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index ec7481f07e..5c02014015 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -218,6 +218,7 @@ "Common.finish": "Завершить", "Common.forceFinish": "Принудительно завершить", "Common.invite": "Пригласить", + "Common.key": "Ключ", "Common.login": "Войти", "Common.merge": "Соединить", "Common.move": "Передвинуть", @@ -239,9 +240,8 @@ "Common.submit": "Отправить", "Common.uninstall": "Удалить", "Common.update": "Обновить", - "Common.key": "Ключ", - "Common.value": "Значение", "Common.validation.email": "Неправильный адрес электронной почты. Введите правильный адрес электронной почты", + "Common.value": "Значение", "CommonEntityChanges.create": "создал панель управления", "CommonEntityChanges.createFilter": "создал фильтр", "CommonEntityChanges.createPattern": "создать паттерн", @@ -273,11 +273,11 @@ "ComponentHealthCheckControls.attributesArrayValidationError": "Введите ключи аттрибута чье уникальное значение будет использоваться для группировки тестов", "ComponentHealthCheckTable.automationBugColumnTitle": "Ошибка автоматизации", "ComponentHealthCheckTable.customColumnHint": "Пользовательский столбец:", + "ComponentHealthCheckTable.nameColumn": "Имя", "ComponentHealthCheckTable.nameTotal": "Общее количество", "ComponentHealthCheckTable.passRateColumn": "Скорость прохождения", "ComponentHealthCheckTable.passingRateHint": "Скорость прохождения:", "ComponentHealthCheckTable.productBugColumnTitle": "Проблемы продукта", - "ComponentHealthCheckTable.nameColumn": "Имя", "ComponentHealthCheckTable.statusColumn": "Статус", "ComponentHealthCheckTable.statusHint": "Статус", "ComponentHealthCheckTable.systemIssueColumnTitle": "Системные проблемы", @@ -349,6 +349,7 @@ "DashboardForm.editModalSubmitButtonText": "Обновить", "DashboardForm.editModalTitle": "редактировать панель управления", "DashboardForm.modalCancelButtonText": "Отменить", + "DashboardHeaderButton.buttonTooltip": "Достигнут предел в 300 панелей управления. Для создания новой нужно удалить хотя бы одну созданную ранее", "DashboardItemPage.addNewWidget": "Добавить новый виджет", "DashboardItemPage.addWidgetSuccess": "Виджет добавлен", "DashboardItemPage.dashboardEmptyText": "Добавьте первый виджет, чтобы проанализировать статистику", @@ -361,7 +362,7 @@ "DashboardPage.modal.deleteModalConfirmationText": "Вы уверены, что хотите удалить панель управления '{name}'? Вы потеряете доступ к ней. Это действие нельзя отменить.", "DashboardPage.modal.deleteModalSubmitButtonText": "Удалить", "DashboardPage.modal.deleteModalTitle": "удаление панели управления", - "DashboardPage.modal.deleteModalWarningMessage": "Вы собираетесь удалить не свою панель управления. Это может повлиять на иинформацию других пользователей проекта.", + "DashboardPage.modal.deleteModalWarningMessage": "Вы собираетесь удалить не свою панель управления. Это может повлиять на информацию других пользователей проекта.", "DashboardPage.modal.modalCancelButtonText": "Отменить", "DashboardPage.noResults": "Ничего не найдено", "DashboardPage.print": "Печать", @@ -420,13 +421,10 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "Вы собираетесь удалить не свой фильтр. Это может повлиять на информацию других пользователей проекта.", "DeleteImageModal.header": "Удалить фото", "DeleteImageModal.text": "Вы уверены, что хотите удалить фото профиля?", - "DeleteLaunchDialog.deleteLaunch": "Вы уверены, что хотите удалить запуск '{name} #{number}'? Это действие нельзя отменить.", - "DeleteLaunchDialog.deleteLaunchHeader": "Удалить запуск", - "DeleteLaunchDialog.deleteLaunchWarning": "Вы собираетесь удалить запуск другого пользователя. Это может повлиять на информацию других пользователей на проекте.", "DeleteNotificationCaseModal.message": "Вы уверены, что хотите удалить правило уведомления {number}?", "DeleteNotificationCaseModal.title": "Удалить правило уведомления", - "DeleteWidgetModal.deleteOwnWidgetWarning": "Вы собираетесь удалить свой виджет. Это может повлиять на информацию на ваших панелях управления.", "DeleteWidgetModal.deleteNotOwnWidgetWarning": "Вы собираетесь удалить не свой виджет. Это может повлиять на информацию других пользователей проекта.", + "DeleteWidgetModal.deleteOwnWidgetWarning": "Вы собираетесь удалить свой виджет. Это может повлиять на информацию на ваших панелях управления.", "DeleteWidgetModal.deleteWidgetHeader": "Удаление виджета", "DeleteWidgetModal.deleteWidgetText": "Вы уверены, что хотите удалить виджет '{name}'? Вы потеряете доступ к ней. Это действие нельзя отменить.", "DemoBanner.descriptionDefault": "Вы вошли под учетной записью \"Демо\". Для безопасной работы с данными, используйте ", @@ -1334,8 +1332,8 @@ "PermissionMap.attention": "Пользователь с ролью администратора может выполнять все операции.", "PermissionMap.changeStatus": "Смена статуса", "PermissionMap.createItem": "Создать элемент", - "PermissionMap.editDeleteItem": "Изменить, удалить элемент", "PermissionMap.customer": "Заказчик", + "PermissionMap.editDeleteItem": "Изменить, удалить элемент", "PermissionMap.editProjectSettings": "Изменить настройки проекта", "PermissionMap.investigationActions": "Действия с анализом (типы дефектов и вопросы в системе отслеживания ошибок)", "PermissionMap.launches": "Запуски", @@ -1409,6 +1407,7 @@ "PluginsPage.uploadButton": "Загрузить", "PluginsTabs.installed": "Установлены", "PluginsTabs.store": "Магазин", + "PolicyBlock.privacyPolicy": "Политика конфиденциальности", "PostIssueModal.attachmentsHeader": "Вложения", "PostIssueModal.booleanFieldHint": "Это поле может содержать значения: Правда/Ложь", "PostIssueModal.commentsHeader": "Комментарии", @@ -1438,10 +1437,10 @@ "ProductStatusControls.StartTimeCriteria": "Старт", "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дублированные имена столбцов запрещены", - "ProfilePage.title": "Профиль пользователя", - "ProfilePage.projectAssignmentTab": "Заданные проекты", "ProfilePage.apiKeys": "API ключи", "ProfilePage.configurationExamples": "Примеры конфигурации", + "ProfilePage.projectAssignmentTab": "Заданные проекты", + "ProfilePage.title": "Профиль пользователя", "Project.deleteDefectSubTypeSuccess": "Тип дефекта был успешно удалён", "Project.updateDefectSubTypeSuccess": "Успешно завершено!", "ProjectActivity.april": "Апрель", @@ -1570,6 +1569,7 @@ "RemoveOrganizationModal.removeOrganizationHeader": "Удалить организацию github", "RemoveOrganizationModal.removeSuccessNotification": "Организация в GitHub удалена", "RetriesCounter.label": "{count} попыток", + "RetriesStackTrace.emptyMessage": "Нет трассировки стека для отображения", "SamlFormFields.emailAttribute": "Почтовый адрес", "SamlFormFields.firstNameAttribute": "Имя", "SamlFormFields.fullNameAttribute": "Имя и фамилия", @@ -1611,7 +1611,6 @@ "SortingControl.sortByFailedItems": "Неудачные пункты", "SortingControl.sortByPassingRate": "Проходной балл", "SortingControl.sortByTotal": "Общее количество", - "RetriesStackTrace.emptyMessage": "Нет трассировки стека для отображения", "StackTrace.jumpTo": "Перейти", "StackTrace.linkText": "Открыть логи", "StackTrace.loadLabel": "Загрузить еще", @@ -1948,6 +1947,7 @@ "administrateUsersPageToolbar.allUsers": "{count} пользователей выбрано", "administrateUsersPageToolbar.searchPlaceholder": "Поиск по имени, логину, электронному адресу", "dashboardControl.dashboardName": "Моя первая панель управления", + "dashboardControl.title": "Сохранить виджет на панели управления", "entityInputConditional.defaultPlaceholder": "Введите имя", "flakyTests.flakyTestsMatrixTooltip": "{statusNumber} {statusChange} из {possibleNumber} {possibleTimes}", "flakyTests.flakyTestsMatrixTooltipChange": "изменение статуса", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index 7652aceb3c..b09a3da92f 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -218,6 +218,7 @@ "Common.finish": "Завершити", "Common.forceFinish": "Примусово завершити", "Common.invite": "Запросити", + "Common.key": "Ключ", "Common.login": "Увійти", "Common.merge": "З'єднати", "Common.move": "Пересунути", @@ -239,9 +240,8 @@ "Common.submit": "Відправити", "Common.uninstall": "Видалити", "Common.update": "Оновити", - "Common.key": "Ключ", - "Common.value": "Значення", "Common.validation.email": "Неправильний адресу електронної пошти. Введіть правильну адресу електронної пошти", + "Common.value": "Значення", "CommonEntityChanges.create": "створив панель управління", "CommonEntityChanges.createFilter": "створив фільтр", "CommonEntityChanges.createPattern": "створити патерн", @@ -273,11 +273,11 @@ "ComponentHealthCheckControls.attributesArrayValidationError": "Введіть ключі атрибуту чиє унікальне значення буде використовуватися для групування тестів", "ComponentHealthCheckTable.automationBugColumnTitle": "Помилка автоматизації", "ComponentHealthCheckTable.customColumnHint": "Призначений для користувача стовпець:", + "ComponentHealthCheckTable.nameColumn": "Ім’я", "ComponentHealthCheckTable.nameTotal": "Всього", "ComponentHealthCheckTable.passRateColumn": "Швидкість проходження", "ComponentHealthCheckTable.passingRateHint": "Швидкість проходження:", "ComponentHealthCheckTable.productBugColumnTitle": "Проблеми продукту", - "ComponentHealthCheckTable.nameColumn": "Ім’я", "ComponentHealthCheckTable.statusColumn": "Статус", "ComponentHealthCheckTable.statusHint": "Статус", "ComponentHealthCheckTable.systemIssueColumnTitle": "Системна проблема", @@ -349,6 +349,7 @@ "DashboardForm.editModalSubmitButtonText": "Оновити", "DashboardForm.editModalTitle": "редагувати панель управління", "DashboardForm.modalCancelButtonText": "Скасувати", + "DashboardHeaderButton.buttonTooltip": "Досягнуто обмеження в 300 панелей управління. Щоб створити новий, потрібно видалити принаймні один, створений раніше", "DashboardItemPage.addNewWidget": "Додати новий віджет", "DashboardItemPage.addWidgetSuccess": "Доданий віджет", "DashboardItemPage.dashboardEmptyText": "Додайте перший віджет, щоб проаналізувати статистику", @@ -420,13 +421,10 @@ "DeleteFilterDialog.deleteFilterOwnerWarning": "Ви збираєтеся видалити свій фільтр. Це може вплинути на інформацію інших користувачів проекту.", "DeleteImageModal.header": "Фото Видалити", "DeleteImageModal.text": "Ви впевнені, що хочете видалити фото профілю?", - "DeleteLaunchDialog.deleteLaunch": "Вы уверены, что хотите удалить запуск '{name} #{number}'? Это действие нельзя отменить.", - "DeleteLaunchDialog.deleteLaunchHeader": "Видалити запуск", - "DeleteLaunchDialog.deleteLaunchWarning": "Ви збираєтеся видалити запуск іншого користувача. Це може вплинути на інформацію інших користувачів на проекті.", "DeleteNotificationCaseModal.message": "Вы уверены, что хотите удалить правило уведомления {number}?", "DeleteNotificationCaseModal.title": "Видалити правило повідомлення", - "DeleteWidgetModal.deleteOwnWidgetWarning": "Ви збираєтеся видалити свій віджет. Це може вплинути на інформацію на ваших панелях управління.", "DeleteWidgetModal.deleteNotOwnWidgetWarning": "Ви збираєтеся видалити свій віджет. Це може вплинути на інформацію інших користувачів проекту.", + "DeleteWidgetModal.deleteOwnWidgetWarning": "Ви збираєтеся видалити свій віджет. Це може вплинути на інформацію на ваших панелях управління.", "DeleteWidgetModal.deleteWidgetHeader": "Видалення міні-програми", "DeleteWidgetModal.deleteWidgetText": "Вы уверены, что хотите удалить виджет '{name}'? Вы потеряете доступ к ней. Это действие нельзя отменить.", "DemoBanner.descriptionDefault": "Ви увійшли під обліковим записом \"Демо\". Для безпечної роботи з даними, використовуйте ", @@ -1334,8 +1332,8 @@ "PermissionMap.attention": "Користувач з роллю адміністратора може виконувати всі операції.", "PermissionMap.changeStatus": "Зміна статусу", "PermissionMap.createItem": "Створити елемент", - "PermissionMap.editDeleteItem": "Змінити,видалити елемент", "PermissionMap.customer": "Замовник", + "PermissionMap.editDeleteItem": "Змінити,видалити елемент", "PermissionMap.editProjectSettings": "Змінити налаштування проекту", "PermissionMap.investigationActions": "Дії з аналізом (типи дефектів і питання в системі відслідковування помилок)", "PermissionMap.launches": "Запуски", @@ -1409,6 +1407,7 @@ "PluginsPage.uploadButton": "Завантажити", "PluginsTabs.installed": "Встановлені", "PluginsTabs.store": "Магазин", + "PolicyBlock.privacyPolicy": "Політика конфіденційності", "PostIssueModal.attachmentsHeader": "Вкладення", "PostIssueModal.booleanFieldHint": "Це поле може містити значення: Правда/Брехня", "PostIssueModal.commentsHeader": "Коментарі", @@ -1438,10 +1437,10 @@ "ProductStatusControls.StartTimeCriteria": "Старт", "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дубльовані імена стовпців заборонені", - "ProfilePage.title": "Профіль користувача", - "ProfilePage.projectAssignmentTab": "Проектне завдання", "ProfilePage.apiKeys": "API ключi", "ProfilePage.configurationExamples": "Приклади конфігурацій", + "ProfilePage.projectAssignmentTab": "Проектне завдання", + "ProfilePage.title": "Профіль користувача", "Project.deleteDefectSubTypeSuccess": "Тип дефекту був успішно видалений", "Project.updateDefectSubTypeSuccess": "Успішно завершено!", "ProjectActivity.april": "Квітень", @@ -1570,6 +1569,7 @@ "RemoveOrganizationModal.removeOrganizationHeader": "Видалити організацію на GitHub", "RemoveOrganizationModal.removeSuccessNotification": "В Організація гитхаб видалена", "RetriesCounter.label": "{count} попыток", + "RetriesStackTrace.emptyMessage": "Трасування стека Немає для відображення", "SamlFormFields.emailAttribute": "Поштова адреса", "SamlFormFields.firstNameAttribute": "Ім’я", "SamlFormFields.fullNameAttribute": "Ім’я та прізвище", @@ -1611,7 +1611,6 @@ "SortingControl.sortByFailedItems": "Невдалі пункти", "SortingControl.sortByPassingRate": "Прохідний бал", "SortingControl.sortByTotal": "Загальна кількість", - "RetriesStackTrace.emptyMessage": "Трасування стека Немає для відображення", "StackTrace.jumpTo": "Перейти", "StackTrace.linkText": "Логи Відкрити", "StackTrace.loadLabel": "Завантажити", @@ -1948,6 +1947,7 @@ "administrateUsersPageToolbar.allUsers": "{count} пользователей выбрано", "administrateUsersPageToolbar.searchPlaceholder": "Пошук по імені, логіну, електронну адресу", "dashboardControl.dashboardName": "Моя перша панель управління", + "dashboardControl.title": "Зберегти віджет на панелі управління", "entityInputConditional.defaultPlaceholder": "Введіть ім’я", "flakyTests.flakyTestsMatrixTooltip": "{statusNumber} {statusChange} з {possibleNumber} {possibleTimes}", "flakyTests.flakyTestsMatrixTooltipChange": "зміна статусу", diff --git a/app/src/common/utils/referenceDictionary.js b/app/src/common/utils/referenceDictionary.js index f2afb3db90..59ac19bee4 100644 --- a/app/src/common/utils/referenceDictionary.js +++ b/app/src/common/utils/referenceDictionary.js @@ -27,4 +27,6 @@ export const referenceDictionary = { rpEpam: 'https://www.epam.com/', rpEpamPolicy: 'https://privacy.epam.com/core/interaction/showpolicy?type=PrivacyPolicy', rpEpamNotice: 'https://privacy.epam.com/core/interaction/showpolicy?type=CommonPrivacyNotice', + rpEpamCommonPolicy: + 'https://privacy.epam.com/core/interaction/showpolicy?type=CommonPrivacyPolicy', }; diff --git a/app/src/controllers/appInfo/constants.js b/app/src/controllers/appInfo/constants.js index 39a7a223d9..e1a3d8fbc2 100644 --- a/app/src/controllers/appInfo/constants.js +++ b/app/src/controllers/appInfo/constants.js @@ -19,3 +19,8 @@ export const ANALYICS_INSTANCE_KEY = 'server.details.instance'; export const ANALYTICS_ALL_KEY = 'server.analytics.all'; export const OLD_HISTORY_KEY = 'history_old'; export const GA_MEASUREMENT_ID = 'ga_measurement_id'; +export const INSTANCE_TYPE = 'instance_type'; +export const NOT_PROVIDED = 'not provided'; +export const EPAM = 'EPAM'; +export const SAAS = 'SaaS'; +export const DEDICATED = 'Dedicated'; diff --git a/app/src/controllers/appInfo/selectors.js b/app/src/controllers/appInfo/selectors.js index 9e1645ed25..19b8450224 100644 --- a/app/src/controllers/appInfo/selectors.js +++ b/app/src/controllers/appInfo/selectors.js @@ -19,6 +19,8 @@ import { ANALYTICS_ALL_KEY, OLD_HISTORY_KEY, GA_MEASUREMENT_ID, + INSTANCE_TYPE, + NOT_PROVIDED, } from './constants'; export const appInfoSelector = (state) => state.appInfo || {}; @@ -52,3 +54,5 @@ export const flushDataInSelector = (state) => (apiJobsSelector(state).flushingDataTrigger || {}).triggersIn || null; export const gaMeasurementIdSelector = (state) => environmentSelector(state)[GA_MEASUREMENT_ID]; +export const instanceTypeSelector = (state) => + environmentSelector(state)[INSTANCE_TYPE] || NOT_PROVIDED; diff --git a/app/src/pages/outside/loginPage/loginPage.jsx b/app/src/pages/outside/loginPage/loginPage.jsx index fa0d0e266d..aa55b39143 100644 --- a/app/src/pages/outside/loginPage/loginPage.jsx +++ b/app/src/pages/outside/loginPage/loginPage.jsx @@ -22,6 +22,8 @@ import { connect } from 'react-redux'; import { referenceDictionary, connectRouter } from 'common/utils'; import { LOGIN_PAGE } from 'components/main/analytics/events'; import { showDefaultErrorNotification } from 'controllers/notification'; +import { instanceTypeSelector } from 'controllers/appInfo/selectors'; +import { EPAM, SAAS } from 'controllers/appInfo/constants'; import styles from './loginPage.scss'; import { LoginPageSection } from './loginPageSection'; import { SocialSection } from './socialSection'; @@ -30,6 +32,7 @@ import { ForgotPasswordBlock } from './pageBlocks/forgotPasswordBlock'; import { ChangePasswordBlock } from './pageBlocks/changePasswordBlock'; import { ServiceVersionsBlock } from './pageBlocks/serviceVersionsBlock'; import { MultipleAuthBlock } from './pageBlocks/multipleAuthBlock'; +import { PolicyBlock } from './pageBlocks/policyBlock'; const cx = classNames.bind(styles); @@ -39,9 +42,14 @@ const cx = classNames.bind(styles); errorAuth, multipleAuth, })) -@connect(null, { - showDefaultErrorNotification, -}) +@connect( + (state) => ({ + instanceType: instanceTypeSelector(state), + }), + { + showDefaultErrorNotification, + }, +) @track({ page: LOGIN_PAGE }) export class LoginPage extends PureComponent { static propTypes = { @@ -50,6 +58,7 @@ export class LoginPage extends PureComponent { errorAuth: PropTypes.string, multipleAuth: PropTypes.string, showDefaultErrorNotification: PropTypes.func, + instanceType: PropTypes.string.isRequired, }; static defaultProps = { forgotPass: '', @@ -93,6 +102,7 @@ export class LoginPage extends PureComponent { }; render() { + const { instanceType } = this.props; const currentBlock = this.getCurrentBlock(); return ( @@ -108,6 +118,7 @@ export class LoginPage extends PureComponent { {currentBlock} + {(instanceType === EPAM || instanceType === SAAS) && }
diff --git a/app/src/pages/outside/loginPage/pageBlocks/loginBlock/loginForm/loginForm.scss b/app/src/pages/outside/loginPage/pageBlocks/loginBlock/loginForm/loginForm.scss index c3cf53c4c6..24623f9457 100644 --- a/app/src/pages/outside/loginPage/pageBlocks/loginBlock/loginForm/loginForm.scss +++ b/app/src/pages/outside/loginPage/pageBlocks/loginBlock/loginForm/loginForm.scss @@ -94,7 +94,7 @@ .login-button-container { width: 160px; height: 40px; - margin: 0 auto 50px auto; + margin: 0 auto; @media (max-width: $SCREEN_SM_MAX) { margin-bottom: 0; diff --git a/app/src/pages/outside/loginPage/pageBlocks/policyBlock/index.js b/app/src/pages/outside/loginPage/pageBlocks/policyBlock/index.js new file mode 100644 index 0000000000..d24f14c9c4 --- /dev/null +++ b/app/src/pages/outside/loginPage/pageBlocks/policyBlock/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { PolicyBlock } from './policyBlock'; diff --git a/app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.jsx b/app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.jsx new file mode 100644 index 0000000000..95b9a28389 --- /dev/null +++ b/app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.jsx @@ -0,0 +1,31 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import classNames from 'classnames/bind'; +import { FormattedMessage } from 'react-intl'; +import { referenceDictionary } from 'common/utils'; +import styles from './policyBlock.scss'; + +const cx = classNames.bind(styles); + +export const PolicyBlock = () => ( +
+ + + +
+); diff --git a/app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.scss b/app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.scss new file mode 100644 index 0000000000..b051e18c2a --- /dev/null +++ b/app/src/pages/outside/loginPage/pageBlocks/policyBlock/policyBlock.scss @@ -0,0 +1,32 @@ +/*! + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.policy-block { + padding: 30px 50px; + box-sizing: border-box; + text-align: center; + + a { + text-decoration: none; + color: $COLOR--tealish; + font-size: 12px; + font-family: $FONT-REGULAR; + } + + @media (max-width: $SCREEN_SM_MAX) { + padding-top: 20px; + } +} diff --git a/app/src/pages/outside/loginPage/pageBlocks/serviceVersionsBlock/serviceVersionsBlock.scss b/app/src/pages/outside/loginPage/pageBlocks/serviceVersionsBlock/serviceVersionsBlock.scss index f7a7dd7845..59c12c8b7f 100644 --- a/app/src/pages/outside/loginPage/pageBlocks/serviceVersionsBlock/serviceVersionsBlock.scss +++ b/app/src/pages/outside/loginPage/pageBlocks/serviceVersionsBlock/serviceVersionsBlock.scss @@ -15,11 +15,8 @@ */ .service-versions-block { - position: absolute; - left: 60px; - bottom: 0; - width: 380px; - padding-bottom: 60px; + width: 100%; + padding: 0 50px; font-family: $FONT-REGULAR; line-height: 1em; box-sizing: border-box; @@ -27,7 +24,7 @@ @media (max-width: $SCREEN_SM_MAX) { position: static; width: 100%; - padding: 30px 30px 50px; + padding: 30px 30px 0; } @media (max-width: $SCREEN_XS_MAX) { From 636cf9b348818ed795e28af9154c34f1aa9e159a Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Wed, 10 May 2023 17:18:32 +0400 Subject: [PATCH 05/17] EPMRPP-83609 || Error occurs when opening "Project members" page with empty members list (#3471) --- app/src/controllers/fetch/reducer.js | 2 +- .../membersPage/membersGrid/membersGrid.jsx | 18 ++++++++++++------ .../pages/common/membersPage/membersPage.jsx | 7 ++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/src/controllers/fetch/reducer.js b/app/src/controllers/fetch/reducer.js index 6933011809..664774ead5 100644 --- a/app/src/controllers/fetch/reducer.js +++ b/app/src/controllers/fetch/reducer.js @@ -33,7 +33,7 @@ export const fetchReducer = (namespace, options = DEFAULT_OPTIONS) => ( const contentPath = options.contentPath || DEFAULT_OPTIONS.contentPath; switch (type) { case FETCH_SUCCESS: - return contentPath ? payload[contentPath] : payload; + return contentPath && payload[contentPath] ? payload[contentPath] : payload; case CONCAT_FETCH_SUCCESS: { const data = contentPath ? payload[contentPath] : payload; diff --git a/app/src/pages/common/membersPage/membersGrid/membersGrid.jsx b/app/src/pages/common/membersPage/membersGrid/membersGrid.jsx index 8e52438e3d..ee9ac1818c 100644 --- a/app/src/pages/common/membersPage/membersGrid/membersGrid.jsx +++ b/app/src/pages/common/membersPage/membersGrid/membersGrid.jsx @@ -19,6 +19,8 @@ import PropTypes from 'prop-types'; import classNames from 'classnames/bind'; import { injectIntl, defineMessages } from 'react-intl'; import { Grid } from 'components/main/grid'; +import { NoItemMessage } from 'components/main/noItemMessage'; +import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; import { PersonalInfo } from './personalInfo'; import { LastLogin } from './lastLogin'; import { ProjectRole } from './projectRole'; @@ -103,12 +105,14 @@ export class MembersGrid extends PureComponent { fetchData: PropTypes.func, intl: PropTypes.object.isRequired, loading: PropTypes.bool, + filter: PropTypes.string, }; static defaultProps = { data: [], fetchData: () => {}, loading: false, + filter: '', }; getColumns = () => [ @@ -149,13 +153,15 @@ export class MembersGrid extends PureComponent { COLUMNS = this.getColumns(); render() { + const { data, loading, intl, filter } = this.props; + return ( - + <> + + {!data.length && !loading && !filter && ( + + )} + ); } } diff --git a/app/src/pages/common/membersPage/membersPage.jsx b/app/src/pages/common/membersPage/membersPage.jsx index 74854cfe50..8fa6af94c6 100644 --- a/app/src/pages/common/membersPage/membersPage.jsx +++ b/app/src/pages/common/membersPage/membersPage.jsx @@ -137,7 +137,12 @@ export class MembersPage extends Component { onFilterChange={this.searchUser} onInvite={this.props.fetchMembersAction} /> - + {!loading && this.renderPageSectionFooter()} ); From f34bb1c6259a1a27977145d0dd64190e1c0afff5 Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Tue, 23 May 2023 18:12:09 +0400 Subject: [PATCH 06/17] EPMRPP-83121 || Implement the API KEYS tab view (Create/Revoke modals) (#3474) * EPMRPP-83121 || Implement the API KEYS tab view (Create/Revoke modals) * EPMRPP-83121 || code review fixes - 1 * EPMRPP-83121 || code review fixes - 2 * EPMRPP-83121 || code review fixes - 4 * EPMRPP-83121 || Update symbols message * EPMRPP-83121 || Code review fixes - 5 --------- Co-authored-by: Ilya Hancharyk --- app/localization/translated/be.json | 44 ++-- app/localization/translated/ru.json | 44 ++-- app/localization/translated/uk.json | 44 ++-- app/src/common/constants/localization.js | 8 + app/src/common/urls.js | 4 +- app/src/common/utils/validation/validate.js | 3 + .../buttons/ghostButton/ghostButton.scss | 17 ++ .../fields/fieldErrorHint/fieldErrorHint.jsx | 8 + .../notificationListItem/notificationItem.jsx | 4 + app/src/controllers/dashboard/sagas.js | 24 +-- app/src/controllers/user/actionCreators.js | 41 ++-- app/src/controllers/user/constants.js | 9 +- app/src/controllers/user/index.js | 11 +- app/src/controllers/user/reducer.js | 16 +- app/src/controllers/user/reducer.test.js | 36 ++-- app/src/controllers/user/sagas.js | 101 ++++++--- app/src/controllers/user/selectors.js | 6 +- .../accessTokenBlock/accessTokenBlock.jsx | 149 ------------- .../inside/profilePage/apiKeys/apiKeys.jsx | 52 +++++ .../index.js => apiKeys/apiKeys.scss} | 9 +- .../apiKeys/apiKeysBlock/apiKeysBlock.jsx | 110 ++++++++++ .../apiKeysBlock/apiKeysBlock.scss} | 124 +++++------ .../profilePage/apiKeys/apiKeysBlock/index.js | 17 ++ .../buttonWithTooltip/buttonWithTooltip.jsx | 0 .../buttonWithTooltip/index.js | 0 .../buttonWithTooltip/warningTooltip/index.js | 0 .../warningTooltip/warningTooltip.jsx | 0 .../warningTooltip/warningTooltip.scss | 0 .../{accessTokenBlock => apiKeys}/index.js | 2 +- .../apiKeys/noApiKeysBlock/img/key.png | Bin 0 -> 2748 bytes .../apiKeys/noApiKeysBlock/index.js | 17 ++ .../apiKeys/noApiKeysBlock/noApiKeysBlock.jsx | 60 ++++++ .../noApiKeysBlock/noApiKeysBlock.scss | 49 +++++ .../configExamplesBlock.jsx | 17 +- app/src/pages/inside/profilePage/index.js | 4 +- .../apiKeyGeneratedModal.jsx | 96 +++++++++ .../apiKeyGeneratedModal.scss} | 16 +- .../modals/apiKeyGeneratedModal/index.js | 17 ++ .../generateApiKeyModal.jsx | 197 ++++++++++++++++++ .../generateApiKeyModal.scss | 45 ++++ .../modals/generateApiKeyModal/index.js | 17 ++ .../profilePage/modals/loaderBlock/index.js | 17 ++ .../modals/loaderBlock/loaderBlock.jsx | 42 ++++ .../modals/loaderBlock/loaderBlock.scss | 34 +++ .../regenerateAccessTokenModal.jsx | 74 ------- .../modals/revokeApiKeyModal/index.js | 17 ++ .../revokeApiKeyModal/revokeApiKeyModal.jsx | 107 ++++++++++ .../revokeApiKeyModal/revokeApiKeyModal.scss | 25 +++ .../pages/inside/profilePage/profilePage.jsx | 4 +- 49 files changed, 1297 insertions(+), 441 deletions(-) delete mode 100644 app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.jsx create mode 100644 app/src/pages/inside/profilePage/apiKeys/apiKeys.jsx rename app/src/pages/inside/profilePage/{modals/regenerateAccessTokenModal/index.js => apiKeys/apiKeys.scss} (85%) create mode 100644 app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx rename app/src/pages/inside/profilePage/{accessTokenBlock/accessTokenBlock.scss => apiKeys/apiKeysBlock/apiKeysBlock.scss} (51%) create mode 100644 app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/index.js rename app/src/pages/inside/profilePage/{accessTokenBlock => apiKeys}/buttonWithTooltip/buttonWithTooltip.jsx (100%) rename app/src/pages/inside/profilePage/{accessTokenBlock => apiKeys}/buttonWithTooltip/index.js (100%) rename app/src/pages/inside/profilePage/{accessTokenBlock => apiKeys}/buttonWithTooltip/warningTooltip/index.js (100%) rename app/src/pages/inside/profilePage/{accessTokenBlock => apiKeys}/buttonWithTooltip/warningTooltip/warningTooltip.jsx (100%) rename app/src/pages/inside/profilePage/{accessTokenBlock => apiKeys}/buttonWithTooltip/warningTooltip/warningTooltip.scss (100%) rename app/src/pages/inside/profilePage/{accessTokenBlock => apiKeys}/index.js (91%) create mode 100644 app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/img/key.png create mode 100644 app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/index.js create mode 100644 app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.jsx create mode 100644 app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.scss create mode 100644 app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.jsx rename app/src/pages/inside/profilePage/modals/{regenerateAccessTokenModal/regenerateAccessTokenModal.scss => apiKeyGeneratedModal/apiKeyGeneratedModal.scss} (76%) create mode 100644 app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/index.js create mode 100644 app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.jsx create mode 100644 app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.scss create mode 100644 app/src/pages/inside/profilePage/modals/generateApiKeyModal/index.js create mode 100644 app/src/pages/inside/profilePage/modals/loaderBlock/index.js create mode 100644 app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.jsx create mode 100644 app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.scss delete mode 100644 app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.jsx create mode 100644 app/src/pages/inside/profilePage/modals/revokeApiKeyModal/index.js create mode 100644 app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.jsx create mode 100644 app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.scss diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 81dd877a22..4c3873776e 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -1,12 +1,5 @@ { "AALabel.investigatedByAA": "Прааналізавана Аўта-аналізам", - "AccessTokenBlock.header": "Токен доступу", - "AccessTokenBlock.regenerate": "Стварыць новы", - "AccessTokenBlock.regenerateSuccess": "Змены паспяхова захаваны", - "AccessTokenBlock.submitError": "Памылка пры пересоздании токена доступу", - "AccessTokenBlock.text": "Каб забяспечыць надзейнасць вашага даменнага пароля, вы можаце выкарыстоўваць карыстацкі токен доступу, каб пацвердзіць, што ваш уліковы запіс можа загружацца агентам.", - "AccessTokenBlock.warning": "Гэты токен не павінен перадавацца або публікавацца ў агульнадаступных крыніцах любога тыпу.", - "AccessTokenBlock.warningHeader": "Захоўвайце токен ў бяспецы!", "AccuracyFormBlock.allMessagesShouldMatchDescription": "Калі аналізуемы тэст змяшчае тры ці больш радкоў лога", "AccuracyFormBlock.allMessagesShouldMatchTitle": "Усе логі з 3 радкамі і больш павінны супадаць", "AccuracyFormBlock.minShouldMatchHint": "Параметр прымае значэння ад 50 да 100", @@ -108,6 +101,18 @@ "AnalyticsTab.analyticsListPoint1": "Інфармацыя пра прыладу: мадэль вашага абсталявання, версія аперацыйнай сістэмы, дазвол экрана, версія браўзэра;", "AnalyticsTab.analyticsListPoint2": "Інфармацыя пра паводзіны: падрабязнасці вашага выкарыстання ReportPortal, на што вы націскаеце і якія дзеянні вырабляеце, як доўга трымаеце прыкладанне адкрытым.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Настройкі сервера паспяхова абноўленыя", + "ApiKeyGeneratedModal.description": "Скапіруйце ключ API і захавайце яго ў надзейным месцы. \nВы не зможаце ўбачыць свой ключ, калі націснеце кнопку «Зачыніць».", + "ApiKeyGeneratedModal.header": "Створаны ключ API", + "ApiKeyGeneratedModal.loaderText": "ГЕНЕРЫРУЮЦЬ", + "ApiKeyGeneratedModal.successNotification": "Ключ API быў паспяхова скапіраваны", + "ApiKeys.ApiKeysBlock.description": "Каб забяспечыць бяспеку пароля вашага ўласнага дамена, вы можаце выкарыстоўваць ключ карыстальніка — каб пацвердзіць свой уліковы запіс і мець магчымасць адпраўляць вынікі пры дапамозе агента.", + "ApiKeys.ApiKeysBlock.generateButton": "Стварыць ключ API", + "ApiKeys.ApiKeysBlock.headerDateCol": "створаны", + "ApiKeys.ApiKeysBlock.headerNameCol": "Назва ключа API", + "ApiKeys.ApiKeysBlock.revoke": "Адклікаць", + "ApiKeys.noApiKeys.description": "Каб забяспечыць бяспеку пароля вашага ўласнага дамена, вы можаце выкарыстоўваць ключ карыстальніка — каб пацвердзіць свой уліковы запіс і мець магчымасць увайсці з дапамогай агента.", + "ApiKeys.noApiKeys.generateButton": "Стварыць ключ API", + "ApiKeys.noApiKeys.header": "Няма ключоў API", "ApiPage.title": "Дакументацыя API", "AssignedProjectsBlock.headerNameCol": "Праекты", "AssignedProjectsBlock.headerRoleCol": "Праектная роля", @@ -207,6 +212,7 @@ "Common.closeModalWarning": "Вы павінны захаваць змены або адмяніць іх перад закрыццём вокны", "Common.compare": "Параўнаць", "Common.confirm": "Пацвердзіць", + "Common.copyToClipboard": "Скапіраваць у буфер абмену", "Common.delete": "Выдаліць", "Common.disable": "Адключыць", "Common.discard": "Скасаваць", @@ -217,6 +223,7 @@ "Common.error": "Памылка", "Common.finish": "Завяршыць", "Common.forceFinish": "Скончыць прымусова", + "Common.generate": "Генераваць", "Common.invite": "Запрасіць", "Common.key": "Ключ", "Common.login": "Увайсці", @@ -726,6 +733,16 @@ "GeneralTab.week1": "7 дзён", "GeneralTab.week2": "14 дзён", "GeneralTab.week3": "21 дзень", + "GenerateApiKeyModal.apiKeyNameUniqueHint": "Ключ API з такім жа імем ужо існуе", + "GenerateApiKeyModal.apiKeyNameWrongSizeHint": "Назва ключа API павінна мець памер ад 1 да 40 сімвалаў", + "GenerateApiKeyModal.counterText": "Колькасць знакаў, якія засталіся: ", + "GenerateApiKeyModal.exceededCounterText": "Вы ўвялі {used} з {allowed} сімвалаў", + "GenerateApiKeyModal.description": "Будзе створаны новы ключ API. Захоўвайце гэты ключ у бяспецы. Мы не рэкамендуем рабіць гэты ключ агульнадаступным.", + "GenerateApiKeyModal.header": "Стварыць ключ API", + "GenerateApiKeyModal.loaderText": "ГЕНЕРЫРУЮЦЬ", + "GenerateApiKeyModal.nameLabel": "Назва ключа API", + "GenerateApiKeyModal.notificationFail": "Збой стварэння ключа API", + "GenerateApiKeyModal.successNotification": "Ключ API быў паспяхова згенераваны", "GenerateDemoDataBlock.generateButtonTitle": "Згенераваць дэма-дадзеныя", "GenerateDemoDataBlock.generateDemoDataSuccess": "Demo data has been generated", "GenerateDemoDataBlock.mobileHint": "Вы можаце генераваць дадзеныя толькі ў кампутарным выглядзе прыкладання.", @@ -1438,6 +1455,7 @@ "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дубляваныя імёны слупкоў забароненыя", "ProfilePage.apiKeys": "API ключы", + "ProfilePage.apiKeys.fetchApiKeysError": "Падчас атрымання ключоў API адбылася памылка", "ProfilePage.configurationExamples": "Прыклады канфiгурацыi", "ProfilePage.projectAssignmentTab": "Праектнае заданне", "ProfilePage.title": "Профіль карыстальніка", @@ -1536,9 +1554,6 @@ "ProjectsToolbar.export": "Экспартаваць", "RallyConnectionFormFields.accessKeyLabel": "Ключ доступу", "RallyConnectionFormFields.projectIdLabel": "ID праекта ў САД", - "RegenerateAccessTokenModal.header": "Стварыць новы токен доступу", - "RegenerateAccessTokenModal.text": "Усе настроеныя агенты са старымі токенаў доступу не будуць працаваць пасля гэтага", - "RegenerateAccessTokenModal.warning": "Увага!", "RegistrationForm.confirmPasswordHint": "Паролі не супадаюць", "RegistrationForm.emailDuplicateHint": "Уведзены email ўжо існуе ў сістэме.", "RegistrationForm.loginConstraints": "1-128 сімвалаў, лацінка, лічбавыя сімвалы, сімвалы: злучок, ніжняе падкрэсліванне, кропка", @@ -1570,6 +1585,12 @@ "RemoveOrganizationModal.removeSuccessNotification": "Арганізацыя ў GitHub выдалена", "RetriesCounter.label": "{count} спроб", "RetriesStackTrace.emptyMessage": "Няма трасіроўкі стэка для адлюстравання", + "RevokeApiKeyModal.description": "Вы ўпэўнены, што хочаце адклікаць ключ API \"{name}\"?", + "RevokeApiKeyModal.header": "Адклікаць ключ API", + "RevokeApiKeyModal.loaderText": "АДМЕНАВАННЕ", + "RevokeApiKeyModal.notificationFail": "Не атрымалася адклікаць ключ API", + "RevokeApiKeyModal.revoke": "Адклікаць", + "RevokeApiKeyModal.successNotification": "Ключ API быў паспяхова ануляваны", "SamlFormFields.emailAttribute": "Паштовы адрас", "SamlFormFields.firstNameAttribute": "Імя", "SamlFormFields.fullNameAttribute": "Імя і прозвішча", @@ -1823,9 +1844,6 @@ "ViewTabs.listView": "Спіс", "ViewTabs.logView": "Логі", "ViewTabs.uniqueErrorsView": "Унікальныя памылкі", - "WarningTooltip.description": "Калі вы хочаце абнавіць ваш токен доступу, націсніце 'стварыць новы', каб атрымаць новы..", - "WarningTooltip.warning": "Увага!", - "WarningTooltip.warningDescription": "Усе настроеныя агенты са старымі токенаў доступу не будуць працаваць пасля гэтага", "Widget.forceUpdateWidgetMessage": "Вы ўпэўненыя, што хочаце абнавіць дадзеныя ў гэтым віджэце? Гэта можа заняць да 15 хвілін у залежнасці ад памеру базы дадзеных праекта.", "Widget.forceUpdateWidgetTitle": "Абнавіць дадзеныя віджэту", "WidgetCriteriaOption.AUTOMATION_BUG": "Automation Bug", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 5c02014015..b53b5ca4ae 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -1,12 +1,5 @@ { "AALabel.investigatedByAA": "Проанализировано Авто-Анализом", - "AccessTokenBlock.header": "Токен доступа", - "AccessTokenBlock.regenerate": "Создать новый", - "AccessTokenBlock.regenerateSuccess": "Изменения успешно сохранены", - "AccessTokenBlock.submitError": "Ошибка при пересоздании токена доступа", - "AccessTokenBlock.text": "Чтобы обеспечить надежность вашего доменного пароля, вы можете использовать пользовательский токен доступа, чтобы подтвердить, что ваша учетная запись может загружаться агентом.", - "AccessTokenBlock.warning": "Этот токен не должен передаваться или публиковаться в общедоступных источниках любого типа.", - "AccessTokenBlock.warningHeader": "Храните токен в безопасности!", "AccuracyFormBlock.allMessagesShouldMatchDescription": "Когда анализируемый тест содержит три или более строк лога", "AccuracyFormBlock.allMessagesShouldMatchTitle": "Все логи с 3 строками и более должны совпадать", "AccuracyFormBlock.minShouldMatchHint": "Параметр принимает значения от '50' до '100'", @@ -108,6 +101,18 @@ "AnalyticsTab.analyticsListPoint1": "Информация об устройстве: модель вашего оборудования, версия операционной системы, разрешение экрана, версия браузера;", "AnalyticsTab.analyticsListPoint2": "Информация о поведении: подробности вашего использования ReportPortal, на что вы нажимаете и какие действия производите, как долго держите приложение открытым.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Настройки сервера успешно обновлены", + "ApiKeyGeneratedModal.description": "Скопируйте ключ API и сохраните его в надежном месте. \nВы не сможете увидеть свой ключ после нажатия кнопки «Закрыть».", + "ApiKeyGeneratedModal.header": "Ключ API сгенерирован", + "ApiKeyGeneratedModal.loaderText": "ГЕНЕРАЦИЯ", + "ApiKeyGeneratedModal.successNotification": "Ключ API успешно скопирован", + "ApiKeys.ApiKeysBlock.description": "Чтобы обеспечить безопасность вашего собственного доменного пароля, вы можете использовать ключ пользователя — чтобы подтвердить свою учетную запись, чтобы иметь возможность отправлять результаты при помощи агента.", + "ApiKeys.ApiKeysBlock.generateButton": "Создать ключ API", + "ApiKeys.ApiKeysBlock.headerDateCol": "создан", + "ApiKeys.ApiKeysBlock.headerNameCol": "Имя ключа API", + "ApiKeys.ApiKeysBlock.revoke": "Отозвать", + "ApiKeys.noApiKeys.description": "Чтобы обеспечить безопасность вашего собственного доменного пароля, вы можете использовать ключ пользователя — чтобы подтвердить свою учетную запись, чтобы иметь возможность войти в систему с помощью агента.", + "ApiKeys.noApiKeys.generateButton": "Сгенерировать API-ключ", + "ApiKeys.noApiKeys.header": "Нет ключей API", "ApiPage.title": "Документация API", "AssignedProjectsBlock.headerNameCol": "Проекты", "AssignedProjectsBlock.headerRoleCol": "Проектная роль", @@ -207,6 +212,7 @@ "Common.closeModalWarning": "Вы должны сохранить изменения или отменить их перед закрытием окна", "Common.compare": "Сравнить", "Common.confirm": "Подтвердить", + "Common.copyToClipboard": "Скопировать в буфер обмена", "Common.delete": "Удалить", "Common.disable": "Отключить", "Common.discard": "Сбросить", @@ -217,6 +223,7 @@ "Common.error": "Ошибка", "Common.finish": "Завершить", "Common.forceFinish": "Принудительно завершить", + "Common.generate": "Сгенерировать", "Common.invite": "Пригласить", "Common.key": "Ключ", "Common.login": "Войти", @@ -726,6 +733,16 @@ "GeneralTab.week1": "7 дней", "GeneralTab.week2": "14 дней", "GeneralTab.week3": "21 день", + "GenerateApiKeyModal.apiKeyNameUniqueHint": "Ключ API с таким именем уже существует", + "GenerateApiKeyModal.apiKeyNameWrongSizeHint": "Имя ключа API должно иметь размер от 1 до 40 символов.", + "GenerateApiKeyModal.counterText": "Количество оставшихся символов: ", + "GenerateApiKeyModal.exceededCounterText": "Вы ввели {used} из {allowed} символов", + "GenerateApiKeyModal.description": "Будет сгенерирован новый ключ API. Сохраните этот ключ. Мы не рекомендуем делать этот ключ общедоступным.", + "GenerateApiKeyModal.header": "Сгенерировать API-ключ", + "GenerateApiKeyModal.loaderText": "ГЕНЕРАЦИЯ", + "GenerateApiKeyModal.nameLabel": "Имя ключа API", + "GenerateApiKeyModal.notificationFail": "Не удалось сгенерировать API-ключ", + "GenerateApiKeyModal.successNotification": "API-ключ успешно сгенерирован", "GenerateDemoDataBlock.generateButtonTitle": "Сгенерировать демо-данные", "GenerateDemoDataBlock.generateDemoDataSuccess": "Demo data has been generated", "GenerateDemoDataBlock.mobileHint": "Вы можете генерировать данные только в компьютерном виде приложения.", @@ -1438,6 +1455,7 @@ "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дублированные имена столбцов запрещены", "ProfilePage.apiKeys": "API ключи", + "ProfilePage.apiKeys.fetchApiKeysError": "Произошла ошибка при получении ключей API", "ProfilePage.configurationExamples": "Примеры конфигурации", "ProfilePage.projectAssignmentTab": "Заданные проекты", "ProfilePage.title": "Профиль пользователя", @@ -1536,9 +1554,6 @@ "ProjectsToolbar.export": "Экспортировать", "RallyConnectionFormFields.accessKeyLabel": "Ключ доступа", "RallyConnectionFormFields.projectIdLabel": "ID проекта в СОД", - "RegenerateAccessTokenModal.header": "Создать новый токен доступа", - "RegenerateAccessTokenModal.text": "Все настроенные агенты со старыми токенами доступа не будут работать после этого", - "RegenerateAccessTokenModal.warning": "Внимание!", "RegistrationForm.confirmPasswordHint": "Пароли не совпадают", "RegistrationForm.emailDuplicateHint": "Введенный email уже существует в системе.", "RegistrationForm.loginConstraints": "1-128 символов, латинские буквы, цифры, знаки: дефис, нижнее подчеркивание", @@ -1570,6 +1585,12 @@ "RemoveOrganizationModal.removeSuccessNotification": "Организация в GitHub удалена", "RetriesCounter.label": "{count} попыток", "RetriesStackTrace.emptyMessage": "Нет трассировки стека для отображения", + "RevokeApiKeyModal.description": "Вы уверены, что хотите отозвать ключ API \"{name}\"?", + "RevokeApiKeyModal.header": "Отозвать ключ API", + "RevokeApiKeyModal.loaderText": "ОТЗЫВ", + "RevokeApiKeyModal.notificationFail": "Ошибка отзыва ключа API", + "RevokeApiKeyModal.revoke": "Отозвать", + "RevokeApiKeyModal.successNotification": "Ключ API успешно отозван", "SamlFormFields.emailAttribute": "Почтовый адрес", "SamlFormFields.firstNameAttribute": "Имя", "SamlFormFields.fullNameAttribute": "Имя и фамилия", @@ -1823,9 +1844,6 @@ "ViewTabs.listView": "Список", "ViewTabs.logView": "Логи", "ViewTabs.uniqueErrorsView": "Уникальные ошибки", - "WarningTooltip.description": "Если вы хотите обновить ваш токен доступа, щелкните 'создать новый', чтобы получить новый.", - "WarningTooltip.warning": "Внимание!", - "WarningTooltip.warningDescription": "Все настроенные агенты со старыми токеном доступа не будут работать после этого", "Widget.forceUpdateWidgetMessage": "Вы уверены, что хотите обновить данные в этом виджете? Это может занять до 15 минут в зависимости от размера базы данных проекта.", "Widget.forceUpdateWidgetTitle": "Обновить данные виджета", "WidgetCriteriaOption.AUTOMATION_BUG": "Automation Bug", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index b09a3da92f..e6c7df43b0 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -1,12 +1,5 @@ { "AALabel.investigatedByAA": "Проаналізовано Авто-Аналізом", - "AccessTokenBlock.header": "Токен доступу", - "AccessTokenBlock.regenerate": "Створити Новий", - "AccessTokenBlock.regenerateSuccess": "Зміни успішно збережено", - "AccessTokenBlock.submitError": "Помилка при перестворені токену доступу", - "AccessTokenBlock.text": "Щоб забезпечити надійність вашого доменного паролю, ви можете використовувати користувальницький токен доступу, щоб підтвердити, що ваш обліковий запис може завантажуватися агентом.", - "AccessTokenBlock.warning": "Цей токен не повинен передаватися або публікуватися в загальнодоступних джерелах будь-якого типу.", - "AccessTokenBlock.warningHeader": "Зберігайте токен в безпеці!", "AccuracyFormBlock.allMessagesShouldMatchDescription": "Коли аналізований тест містить три або більше рядків логу", "AccuracyFormBlock.allMessagesShouldMatchTitle": "Всі логи з 3 рядками і більш повинні збігатися", "AccuracyFormBlock.minShouldMatchHint": "Параметр приймає значення від '50' до '100'", @@ -108,6 +101,18 @@ "AnalyticsTab.analyticsListPoint1": "Інформація про пристрої: модель вашого обладнання, версію операційної системи, дозвіл екрана, версія браузера;", "AnalyticsTab.analyticsListPoint2": "Інформація про поведінку: подробиці вашого використання ReportPortal, на що ви натискаєте і які дії виробляєте, як довго тримаєте додаток відкритим.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Налаштування сервера успішно оновлено", + "ApiKeyGeneratedModal.description": "Скопіюйте ключ API та зберігайте його в безпечному місці. \nВи не зможете побачити свій ключ після натискання кнопки «Закрити».", + "ApiKeyGeneratedModal.header": "Ключ API створено", + "ApiKeyGeneratedModal.loaderText": "ГЕНЕРУЮЧИЙ", + "ApiKeyGeneratedModal.successNotification": "Ключ API успішно скопійовано", + "ApiKeys.ApiKeysBlock.description": "Щоб забезпечити безпеку власного пароля домену, ви можете використовувати ключ користувача — щоб підтвердити свій обліковий запис і мати можливість надсилати результати за допомогою агента.", + "ApiKeys.ApiKeysBlock.generateButton": "Створити ключ API", + "ApiKeys.ApiKeysBlock.headerDateCol": "створений", + "ApiKeys.ApiKeysBlock.headerNameCol": "Назва ключа API", + "ApiKeys.ApiKeysBlock.revoke": "Відкликати", + "ApiKeys.noApiKeys.description": "Щоб забезпечити безпеку власного пароля домену, ви можете використовувати ключ користувача — щоб підтвердити свій обліковий запис і мати можливість входити за допомогою агента.", + "ApiKeys.noApiKeys.generateButton": "Створити ключ API", + "ApiKeys.noApiKeys.header": "Немає ключів API", "ApiPage.title": "Документація API", "AssignedProjectsBlock.headerNameCol": "Проекти", "AssignedProjectsBlock.headerRoleCol": "Проектна роль", @@ -207,6 +212,7 @@ "Common.closeModalWarning": "Ви повинні зберегти зміни або скасувати їх перед закриттям вікна", "Common.compare": "Порівняти", "Common.confirm": "Підтвердити", + "Common.copyToClipboard": "Копіювати в буфер обміну", "Common.delete": "Видалити", "Common.disable": "Вимкнути", "Common.discard": "Скинути", @@ -217,6 +223,7 @@ "Common.error": "Помилка", "Common.finish": "Завершити", "Common.forceFinish": "Примусово завершити", + "Common.generate": "Генерувати", "Common.invite": "Запросити", "Common.key": "Ключ", "Common.login": "Увійти", @@ -726,6 +733,16 @@ "GeneralTab.week1": "7 днів", "GeneralTab.week2": "14 днів", "GeneralTab.week3": "21 день", + "GenerateApiKeyModal.apiKeyNameUniqueHint": "Ключ API з такою назвою вже існує", + "GenerateApiKeyModal.apiKeyNameWrongSizeHint": "Назва ключа API повинна мати розмір від 1 до 40 символів", + "GenerateApiKeyModal.counterText": "Залишилася кількість символів: ", + "GenerateApiKeyModal.exceededCounterText": "Ви ввели {used} з {allowed} символів", + "GenerateApiKeyModal.description": "Буде згенеровано новий ключ API. Зберігайте цей ключ у безпеці. Ми не рекомендуємо робити цей ключ загальнодоступним.", + "GenerateApiKeyModal.header": "Згенерувати ключ API", + "GenerateApiKeyModal.loaderText": "ГЕНЕРУЮЧИЙ", + "GenerateApiKeyModal.nameLabel": "Назва ключа API", + "GenerateApiKeyModal.notificationFail": "Не вдалося створити ключ API", + "GenerateApiKeyModal.successNotification": "Ключ API успішно створено", "GenerateDemoDataBlock.generateButtonTitle": "Демо-дані Згенерувати", "GenerateDemoDataBlock.generateDemoDataSuccess": "Demo data has been generated", "GenerateDemoDataBlock.mobileHint": "Ви можете генерувати дані тільки в комп'ютерному вигляді додатка.", @@ -1438,6 +1455,7 @@ "ProductStatusControls.StatusCriteria": "Статус", "ProductStatusControls.customColumnsDuplicationHint": "Дубльовані імена стовпців заборонені", "ProfilePage.apiKeys": "API ключi", + "ProfilePage.apiKeys.fetchApiKeysError": "Під час отримання ключів API сталася помилка", "ProfilePage.configurationExamples": "Приклади конфігурацій", "ProfilePage.projectAssignmentTab": "Проектне завдання", "ProfilePage.title": "Профіль користувача", @@ -1536,9 +1554,6 @@ "ProjectsToolbar.export": "Експортувати", "RallyConnectionFormFields.accessKeyLabel": "Ключ доступу", "RallyConnectionFormFields.projectIdLabel": "Ідентифікатор проекту в СОД", - "RegenerateAccessTokenModal.header": "Створити новий токен доступу", - "RegenerateAccessTokenModal.text": "Всі налаштовані агенти зі старими токенами доступу не будуть працювати після цього", - "RegenerateAccessTokenModal.warning": "Увага!", "RegistrationForm.confirmPasswordHint": "Паролі не збігаються", "RegistrationForm.emailDuplicateHint": "Введену адресу електронної пошти вже існує в системі.", "RegistrationForm.loginConstraints": "1-128 символи, латинські літери, цифри, знаки: дефіс, нижнє підкреслення", @@ -1570,6 +1585,12 @@ "RemoveOrganizationModal.removeSuccessNotification": "В Організація гитхаб видалена", "RetriesCounter.label": "{count} попыток", "RetriesStackTrace.emptyMessage": "Трасування стека Немає для відображення", + "RevokeApiKeyModal.description": "Ви впевнені, що бажаєте відкликати ключ API \"{name}\"?", + "RevokeApiKeyModal.header": "Відкликати ключ API", + "RevokeApiKeyModal.loaderText": "СКАСУВАННЯ", + "RevokeApiKeyModal.notificationFail": "Не вдалося відкликати ключ API", + "RevokeApiKeyModal.revoke": "Відкликати", + "RevokeApiKeyModal.successNotification": "Ключ API успішно відкликано", "SamlFormFields.emailAttribute": "Поштова адреса", "SamlFormFields.firstNameAttribute": "Ім’я", "SamlFormFields.fullNameAttribute": "Ім’я та прізвище", @@ -1823,9 +1844,6 @@ "ViewTabs.listView": "Список", "ViewTabs.logView": "Логи", "ViewTabs.uniqueErrorsView": "Унікальні помилки", - "WarningTooltip.description": "Якщо ви хочете оновити ваш токен доступу, натисніть кнопку 'створити', щоб отримати новий.", - "WarningTooltip.warning": "Увага!", - "WarningTooltip.warningDescription": "Всі налаштовані агенти зі старими токеном доступу не будуть працювати після цього", "Widget.forceUpdateWidgetMessage": "Ви впевнені, що хочете оновити дані в цьому віджеті? Це може зайняти до 15 хвилин в залежності від розміру бази даних проекту.", "Widget.forceUpdateWidgetTitle": "Оновити дані віджета", "WidgetCriteriaOption.AUTOMATION_BUG": "Помилка Автоматизації", diff --git a/app/src/common/constants/localization.js b/app/src/common/constants/localization.js index f9c333a7eb..bd584e4cd3 100644 --- a/app/src/common/constants/localization.js +++ b/app/src/common/constants/localization.js @@ -29,6 +29,10 @@ export const COMMON_LOCALE_KEYS = defineMessages({ id: 'Common.close', defaultMessage: 'Close', }, + COPY_TO_CLIPBOARD: { + id: 'Common.copyToClipboard', + defaultMessage: 'Copy to Clipboard', + }, UPDATE: { id: 'Common.update', defaultMessage: 'Update', @@ -41,6 +45,10 @@ export const COMMON_LOCALE_KEYS = defineMessages({ id: 'Common.confirm', defaultMessage: 'Confirm', }, + GENERATE: { + id: 'Common.generate', + defaultMessage: 'Generate', + }, SEND: { id: 'Common.send', defaultMessage: 'Send', diff --git a/app/src/common/urls.js b/app/src/common/urls.js index a88f32cc2c..236cc1a155 100644 --- a/app/src/common/urls.js +++ b/app/src/common/urls.js @@ -118,9 +118,11 @@ export const URLS = { })}`, launchAnalyze: (activeProject) => `${urlBase}${activeProject}/launch/analyze`, login: () => `${uatBase}sso/oauth/token`, - apiToken: () => `${uatBase}sso/me/apitoken`, sessionToken: () => `${uatBase}sso/me`, + apiKeys: (userId) => `${urlBase}user/${userId}/api-keys`, + apiKeyById: (userId, apiKeyId) => `${urlBase}user/${userId}/api-keys/${apiKeyId}`, + project: (activeProject) => `${urlBase}project/${activeProject}`, addProject: () => `${urlBase}project`, projectNames: () => `${urlBase}project/names`, diff --git a/app/src/common/utils/validation/validate.js b/app/src/common/utils/validation/validate.js index 9a55802ad6..b5c63189d5 100644 --- a/app/src/common/utils/validation/validate.js +++ b/app/src/common/utils/validation/validate.js @@ -114,3 +114,6 @@ export const createNotificationRecipientsValidator = (informOwner) => (value) => isNotEmptyArray(value) || informOwner; export const notificationLaunchNames = (value) => isEmpty(value) || !value.length || value.every(launchName); +export const apiKeyName = composeValidators([isNotEmpty, lengthRange(1, 40)]); +export const uniqueApiKeyName = (names) => (value) => + names.every((name) => name.toLowerCase() !== value.toLowerCase()); diff --git a/app/src/components/buttons/ghostButton/ghostButton.scss b/app/src/components/buttons/ghostButton/ghostButton.scss index 9f45fd9a1b..41ae45b705 100644 --- a/app/src/components/buttons/ghostButton/ghostButton.scss +++ b/app/src/components/buttons/ghostButton/ghostButton.scss @@ -64,6 +64,23 @@ } } + &.color-red { + color: $COLOR--tomato; + vertical-align: middle; + + &.transparent-border { + background-color: transparent; + border-color: transparent; + } + + &.transparent-border-hover { + &:hover { + background-color: transparent; + border-color: transparent; + } + } + } + &.color-topaz:not(.disabled) { border-color: $COLOR--topaz; color: $COLOR--topaz; diff --git a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx index 60fb0d118f..cb0313cbce 100644 --- a/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx +++ b/app/src/components/fields/fieldErrorHint/fieldErrorHint.jsx @@ -223,6 +223,14 @@ const messages = defineMessages({ id: 'EditItemModal.descriptionHint', defaultMessage: "Description should have size from '0' to '2048' symbols", }, + apiKeyNameWrongSizeHint: { + id: 'GenerateApiKeyModal.apiKeyNameWrongSizeHint', + defaultMessage: 'API Key name should have size from 1 to 40 characters', + }, + apiKeyNameUniqueHint: { + id: 'GenerateApiKeyModal.apiKeyNameUniqueHint', + defaultMessage: 'API Key with the same name already exists', + }, }); @injectIntl diff --git a/app/src/components/main/notification/notificationList/notificationListItem/notificationItem.jsx b/app/src/components/main/notification/notificationList/notificationListItem/notificationItem.jsx index 5ea6b25dc2..84d2f3a88e 100644 --- a/app/src/components/main/notification/notificationList/notificationListItem/notificationItem.jsx +++ b/app/src/components/main/notification/notificationList/notificationListItem/notificationItem.jsx @@ -132,6 +132,10 @@ const messages = defineMessages({ id: 'TestItemsPage.successMultiple', defaultMessage: 'Items were deleted', }, + fetchApiKeysError: { + id: 'ProfilePage.apiKeys.fetchApiKeysError', + defaultMessage: 'An error occurred during fetch API keys', + }, }); @injectIntl diff --git a/app/src/controllers/dashboard/sagas.js b/app/src/controllers/dashboard/sagas.js index 63ad8b4fe5..78caac3918 100644 --- a/app/src/controllers/dashboard/sagas.js +++ b/app/src/controllers/dashboard/sagas.js @@ -20,11 +20,10 @@ import { NOTIFICATION_TYPES } from 'controllers/notification/constants'; import { redirect } from 'redux-first-router'; import { URLS } from 'common/urls'; import { fetchDataAction, createFetchPredicate } from 'controllers/fetch'; -import { activeProjectSelector, apiTokenStringSelector, userIdSelector } from 'controllers/user'; +import { activeProjectSelector, userIdSelector } from 'controllers/user'; import { hideModalAction } from 'controllers/modal'; -import { fetch, updateToken } from 'common/utils/fetch'; +import { fetch } from 'common/utils/fetch'; import { setStorageItem } from 'common/utils/storageUtils'; -import { tokenSelector } from 'controllers/auth'; import { PROJECT_DASHBOARD_ITEM_PAGE, PROJECT_DASHBOARD_PAGE, @@ -46,16 +45,10 @@ import { UPDATE_DASHBOARD, UPDATE_DASHBOARD_WIDGETS, REMOVE_DASHBOARD_SUCCESS, - CHANGE_FULL_SCREEN_MODE, - TOGGLE_FULL_SCREEN_MODE, INCREASE_TOTAL_DASHBOARDS_LOCALLY, DECREASE_TOTAL_DASHBOARDS_LOCALLY, } from './constants'; -import { - dashboardFullScreenModeSelector, - dashboardItemsSelector, - querySelector, -} from './selectors'; +import { dashboardItemsSelector, querySelector } from './selectors'; import { addDashboardSuccessAction, deleteDashboardSuccessAction, @@ -197,13 +190,6 @@ function changeVisibilityType({ payload: visibilityType }) { setStorageItem(DASHBOARDS_VISIBILITY_TYPE_STORAGE_KEY, visibilityType); } -function* updateTokenAccordingToFullscreenMode() { - const fullScreenMode = yield select(dashboardFullScreenModeSelector); - const selector = fullScreenMode ? apiTokenStringSelector : tokenSelector; - const token = yield select(selector); - yield call(updateToken, token); -} - export function* dashboardSagas() { yield all([ yield takeEvery(FETCH_DASHBOARDS, fetchDashboards), @@ -214,9 +200,5 @@ export function* dashboardSagas() { yield takeEvery(REMOVE_DASHBOARD, removeDashboard), yield takeEvery(CHANGE_VISIBILITY_TYPE, changeVisibilityType), yield takeEvery(REMOVE_DASHBOARD_SUCCESS, redirectAfterDelete), - yield takeEvery( - [CHANGE_FULL_SCREEN_MODE, TOGGLE_FULL_SCREEN_MODE], - updateTokenAccordingToFullscreenMode, - ), ]); } diff --git a/app/src/controllers/user/actionCreators.js b/app/src/controllers/user/actionCreators.js index af320ddbc8..3a446da6fc 100644 --- a/app/src/controllers/user/actionCreators.js +++ b/app/src/controllers/user/actionCreators.js @@ -17,18 +17,21 @@ import { SET_ACTIVE_PROJECT, SET_START_TIME_FORMAT, - SET_API_TOKEN, + SET_API_KEYS, SET_PHOTO_TIME_STAMP, ASSIGN_TO_RROJECT, ASSIGN_TO_RROJECT_SUCCESS, ASSIGN_TO_RROJECT_ERROR, UNASSIGN_FROM_PROJECT, UNASSIGN_FROM_PROJECT_SUCCESS, - FETCH_API_TOKEN, - GENERATE_API_TOKEN, + FETCH_API_KEYS, + ADD_API_KEY, + DELETE_API_KEY, FETCH_USER_SUCCESS, FETCH_USER, FETCH_USER_ERROR, + DELETE_API_KEY_SUCCESS, + ADD_API_KEY_SUCCESS, } from './constants'; export const fetchUserSuccessAction = (user) => ({ @@ -46,12 +49,9 @@ export const setPhotoTimeStampAction = (timeStamp) => ({ payload: timeStamp, }); -export const setApiTokenAction = (token) => ({ - type: SET_API_TOKEN, - payload: { - type: token.token_type, - value: token.access_token, - }, +export const setApiKeysAction = (apiKeys = []) => ({ + type: SET_API_KEYS, + payload: apiKeys, }); export const setActiveProjectAction = (project) => ({ @@ -59,12 +59,27 @@ export const setActiveProjectAction = (project) => ({ payload: project, }); -export const generateApiTokenAction = ({ successMessage, errorMessage } = {}) => ({ - type: GENERATE_API_TOKEN, - payload: { successMessage, errorMessage }, +export const addApiKeyAction = (name, successMessage, errorMessage, onSuccess) => ({ + type: ADD_API_KEY, + payload: { name, successMessage, errorMessage, onSuccess }, }); -export const fetchApiTokenAction = () => ({ type: FETCH_API_TOKEN }); +export const addApiKeySuccessAction = (apiKey) => ({ + type: ADD_API_KEY_SUCCESS, + payload: apiKey, +}); + +export const deleteApiKeyAction = (apiKeyId, successMessage, errorMessage, onSuccess) => ({ + type: DELETE_API_KEY, + payload: { apiKeyId, successMessage, errorMessage, onSuccess }, +}); + +export const deleteApiKeySuccessAction = (apiKeyId) => ({ + type: DELETE_API_KEY_SUCCESS, + payload: apiKeyId, +}); + +export const fetchApiKeysAction = () => ({ type: FETCH_API_KEYS }); export const fetchUserAction = () => ({ type: FETCH_USER }); diff --git a/app/src/controllers/user/constants.js b/app/src/controllers/user/constants.js index 6d0a373245..6c498cb04b 100644 --- a/app/src/controllers/user/constants.js +++ b/app/src/controllers/user/constants.js @@ -29,12 +29,15 @@ export const SETTINGS_INITIAL_STATE = { photoTimeStamp: Date.now(), }; -export const SET_API_TOKEN = 'setApiToken'; export const ASSIGN_TO_RROJECT = 'assignToProject'; export const ASSIGN_TO_RROJECT_SUCCESS = 'assignToProjectSuccess'; export const ASSIGN_TO_RROJECT_ERROR = 'assignToProjectError'; export const UNASSIGN_FROM_PROJECT = 'unassignFromProject'; export const UNASSIGN_FROM_PROJECT_SUCCESS = 'unassignFromProjectSuccess'; -export const GENERATE_API_TOKEN = 'generateApiToken'; -export const FETCH_API_TOKEN = 'fetchApiToken'; +export const FETCH_API_KEYS = 'fetchApiKeys'; +export const SET_API_KEYS = 'setApiKeys'; +export const ADD_API_KEY = 'addApiKey'; +export const ADD_API_KEY_SUCCESS = 'addApiKeySuccess'; +export const DELETE_API_KEY = 'deleteApiKey'; +export const DELETE_API_KEY_SUCCESS = 'deleteApiKeySuccess'; diff --git a/app/src/controllers/user/index.js b/app/src/controllers/user/index.js index e085e6e92b..e49bd1bfe2 100644 --- a/app/src/controllers/user/index.js +++ b/app/src/controllers/user/index.js @@ -17,7 +17,6 @@ export { START_TIME_FORMAT_ABSOLUTE, START_TIME_FORMAT_RELATIVE, - SET_API_TOKEN, ASSIGN_TO_RROJECT, ASSIGN_TO_RROJECT_SUCCESS, ASSIGN_TO_RROJECT_ERROR, @@ -30,8 +29,11 @@ export { fetchUserAction, setActiveProjectAction, setStartTimeFormatAction, - generateApiTokenAction, - fetchApiTokenAction, + addApiKeyAction, + addApiKeySuccessAction, + fetchApiKeysAction, + deleteApiKeyAction, + deleteApiKeySuccessAction, setPhotoTimeStampAction, assignToProjectAction, assignToProjectErrorAction, @@ -51,8 +53,7 @@ export { activeProjectRoleSelector, userAccountRoleSelector, photoTimeStampSelector, - apiTokenValueSelector, - apiTokenStringSelector, + apiKeysSelector, photoIdSelector, availableProjectsSelector, } from './selectors'; diff --git a/app/src/controllers/user/reducer.js b/app/src/controllers/user/reducer.js index 107437f2d5..0a6552e41d 100644 --- a/app/src/controllers/user/reducer.js +++ b/app/src/controllers/user/reducer.js @@ -20,10 +20,12 @@ import { SET_START_TIME_FORMAT, SETTINGS_INITIAL_STATE, SET_PHOTO_TIME_STAMP, - SET_API_TOKEN, ASSIGN_TO_RROJECT_SUCCESS, UNASSIGN_FROM_PROJECT_SUCCESS, FETCH_USER_SUCCESS, + SET_API_KEYS, + ADD_API_KEY_SUCCESS, + DELETE_API_KEY_SUCCESS, } from './constants'; export const settingsReducer = (state = SETTINGS_INITIAL_STATE, { type, payload }) => { @@ -91,10 +93,14 @@ export const activeProjectReducer = (state = '', { type, payload }) => { } }; -export const apiTokenReducer = (state = {}, { type, payload }) => { +export const apiKeysReducer = (state = [], { type, payload }) => { switch (type) { - case SET_API_TOKEN: - return payload; + case SET_API_KEYS: + return payload.sort((a, b) => b.created_at - a.created_at); + case ADD_API_KEY_SUCCESS: + return [payload, ...state]; + case DELETE_API_KEY_SUCCESS: + return state.filter((key) => key.id !== payload); default: return state; } @@ -104,5 +110,5 @@ export const userReducer = combineReducers({ info: userInfoReducer, activeProject: activeProjectReducer, settings: settingsReducer, - token: apiTokenReducer, + apiKeys: apiKeysReducer, }); diff --git a/app/src/controllers/user/reducer.test.js b/app/src/controllers/user/reducer.test.js index cd4ad18390..8b392beee3 100644 --- a/app/src/controllers/user/reducer.test.js +++ b/app/src/controllers/user/reducer.test.js @@ -22,16 +22,16 @@ import { SETTINGS_INITIAL_STATE, START_TIME_FORMAT_ABSOLUTE, SET_PHOTO_TIME_STAMP, - SET_API_TOKEN, ASSIGN_TO_RROJECT_SUCCESS, UNASSIGN_FROM_PROJECT_SUCCESS, + SET_API_KEYS, } from './constants'; import { settingsReducer, userInfoReducer, activeProjectReducer, - apiTokenReducer, userAssignedProjectReducer, + apiKeysReducer, } from './reducer'; describe('user reducer', () => { @@ -107,25 +107,25 @@ describe('user reducer', () => { }); expect(newState).toEqual(payload); }); - }); - describe('apiTokenReducer', () => { - test('should return initial state', () => { - expect(apiTokenReducer(undefined, {})).toEqual({}); - }); + describe('apiKeysReducer', () => { + test('should return initial state', () => { + expect(apiKeysReducer(undefined, {})).toEqual([]); + }); - test('should return old state on unknown action', () => { - const oldState = { type: 'bearer', value: 'token' }; - expect(apiTokenReducer(oldState, { type: 'foo' })).toBe(oldState); - }); + test('should return old state on unknown action', () => { + const oldState = { type: 'bearer', value: 'apiKey' }; + expect(apiKeysReducer(oldState, { type: 'foo' })).toBe(oldState); + }); - test('should handle SET_API_TOKEN', () => { - expect( - apiTokenReducer(undefined, { - type: SET_API_TOKEN, - payload: { type: 'bearer', value: 'token' }, - }), - ).toEqual({ type: 'bearer', value: 'token' }); + test('should handle SET_API_KEYS', () => { + expect( + apiKeysReducer(undefined, { + type: SET_API_KEYS, + payload: { type: 'bearer', value: 'apiKey' }, + }), + ).toEqual({ type: 'bearer', value: 'apiKey' }); + }); }); }); diff --git a/app/src/controllers/user/sagas.js b/app/src/controllers/user/sagas.js index 8d104da981..7e237384b9 100644 --- a/app/src/controllers/user/sagas.js +++ b/app/src/controllers/user/sagas.js @@ -19,27 +19,27 @@ import { fetch } from 'common/utils/fetch'; import { URLS } from 'common/urls'; import { showNotification, NOTIFICATION_TYPES } from 'controllers/notification'; import { PROJECT_MANAGER } from 'common/constants/projectRoles'; -import { ERROR_CODE_NOT_FOUND } from 'common/constants/apiErrorCodes'; import { getStorageItem, setStorageItem } from 'common/utils/storageUtils'; import { userIdSelector, userInfoSelector } from './selectors'; import { ASSIGN_TO_RROJECT, UNASSIGN_FROM_PROJECT, SET_ACTIVE_PROJECT, - GENERATE_API_TOKEN, - FETCH_API_TOKEN, + ADD_API_KEY, + FETCH_API_KEYS, + DELETE_API_KEY, FETCH_USER, } from './constants'; import { assignToProjectSuccessAction, assignToProjectErrorAction, unassignFromProjectSuccessAction, - fetchApiTokenAction, setActiveProjectAction, - generateApiTokenAction, - setApiTokenAction, fetchUserSuccessAction, fetchUserErrorAction, + setApiKeysAction, + addApiKeySuccessAction, + deleteApiKeySuccessAction, } from './actionCreators'; function* assignToProject({ payload: project }) { @@ -131,7 +131,6 @@ function* fetchUserWorker() { savedActiveProject && savedActiveProject in user.assignedProjects ? savedActiveProject : Object.keys(user.assignedProjects)[0]; - yield put(fetchApiTokenAction()); yield put(setActiveProjectAction(activeProject)); } @@ -141,11 +140,20 @@ function* saveActiveProject({ payload: project }) { setStorageItem(`${user.userId}_settings`, { ...currentUserSettings, activeProject: project }); } -function* generateApiToken({ payload = {} }) { - const { successMessage, errorMessage } = payload; +function* addApiKey({ payload = {} }) { + const { name, successMessage, errorMessage, onSuccess } = payload; + const user = yield select(userInfoSelector); try { - const response = yield call(fetch, URLS.apiToken(), { method: 'post' }); - yield put(setApiTokenAction(response)); + const response = yield call(fetch, URLS.apiKeys(user.id), { + method: 'post', + data: { + name, + }, + }); + + // eslint-disable-next-line camelcase + const { id, created_at, api_key } = response; + onSuccess(api_key); if (successMessage) { yield put( showNotification({ @@ -154,11 +162,13 @@ function* generateApiToken({ payload = {} }) { }), ); } - } catch (err) { + yield put(addApiKeySuccessAction({ id, name, created_at })); + } catch ({ message }) { + const showingMessage = errorMessage || message; if (errorMessage) { yield put( showNotification({ - message: errorMessage, + message: showingMessage, type: NOTIFICATION_TYPES.ERROR, }), ); @@ -166,23 +176,63 @@ function* generateApiToken({ payload = {} }) { } } -function* fetchApiToken() { +function* fetchApiKeys() { + const user = yield select(userInfoSelector); try { - const response = yield call(fetch, URLS.apiToken()); - yield put(setApiTokenAction(response)); - } catch ({ errorCode }) { - if (errorCode === ERROR_CODE_NOT_FOUND) { - yield put(generateApiTokenAction()); + const response = yield call(fetch, URLS.apiKeys(user.id)); + yield put(setApiKeysAction(response.items)); + } catch ({ message }) { + yield put( + showNotification({ + messageId: 'fetchApiKeysError', + type: NOTIFICATION_TYPES.ERROR, + values: { message }, + }), + ); + } +} + +function* deleteApiKey({ payload = {} }) { + const { apiKeyId, successMessage, errorMessage, onSuccess } = payload; + const user = yield select(userInfoSelector); + + try { + yield call(fetch, URLS.apiKeyById(user.id, apiKeyId), { + method: 'delete', + }); + onSuccess(); + if (successMessage) { + yield put( + showNotification({ + message: successMessage, + type: NOTIFICATION_TYPES.SUCCESS, + }), + ); + } + yield put(deleteApiKeySuccessAction(apiKeyId)); + } catch ({ message }) { + const showingMessage = errorMessage || message; + if (errorMessage) { + yield put( + showNotification({ + message: showingMessage, + type: NOTIFICATION_TYPES.ERROR, + }), + ); } } } -function* watchGenerateApiToken() { - yield takeEvery(GENERATE_API_TOKEN, generateApiToken); +function* watchAddApiKey() { + yield takeEvery(ADD_API_KEY, addApiKey); +} + +function* watchFetchApiKeys() { + yield takeEvery(FETCH_API_KEYS, fetchApiKeys); } -function* watchFetchApiToken() { - yield takeEvery(FETCH_API_TOKEN, fetchApiToken); +function* watchDeleteApiKey() { + yield takeEvery(DELETE_API_KEY, deleteApiKey); } function* watchSetActiveProject() { @@ -207,7 +257,8 @@ export function* userSagas() { watchUnassignFromProject(), watchFetchUser(), watchSetActiveProject(), - watchGenerateApiToken(), - watchFetchApiToken(), + watchAddApiKey(), + watchFetchApiKeys(), + watchDeleteApiKey(), ]); } diff --git a/app/src/controllers/user/selectors.js b/app/src/controllers/user/selectors.js index 0460a5d0db..77a04f0a71 100644 --- a/app/src/controllers/user/selectors.js +++ b/app/src/controllers/user/selectors.js @@ -57,8 +57,4 @@ export const availableProjectsSelector = createSelector( }, ); -const apiTokenSelector = (state) => userSelector(state).token || ''; -export const apiTokenValueSelector = (state) => apiTokenSelector(state).value; -export const apiTokenTypeSelector = (state) => apiTokenSelector(state).type; -export const apiTokenStringSelector = (state) => - `${apiTokenTypeSelector(state)} ${apiTokenValueSelector(state)}`; +export const apiKeysSelector = (state) => userSelector(state).apiKeys || []; diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.jsx b/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.jsx deleted file mode 100644 index c1f983f054..0000000000 --- a/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.jsx +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2019 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, { Component } from 'react'; -import track from 'react-tracking'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { defineMessages, injectIntl } from 'react-intl'; -import classNames from 'classnames/bind'; -import { showModalAction } from 'controllers/modal'; -import { apiTokenValueSelector, generateApiTokenAction } from 'controllers/user'; -import WarningLockImage from 'common/img/warning-lock.png'; -import { GhostButton } from 'components/buttons/ghostButton'; -import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events'; -import { StripedMessage } from 'components/main/stripedMessage'; -import Parser from 'html-react-parser'; -import IconDuplicate from 'common/img/duplicate-inline.svg'; -import { CopyToClipboard } from 'react-copy-to-clipboard'; -import { ButtonWithTooltip } from './buttonWithTooltip'; -import styles from './accessTokenBlock.scss'; -import { BlockContainerHeader, BlockContainerBody } from '../blockContainer'; - -const cx = classNames.bind(styles); -const messages = defineMessages({ - header: { - id: 'AccessTokenBlock.header', - defaultMessage: 'Access token', - }, - regenerate: { - id: 'AccessTokenBlock.regenerate', - defaultMessage: 'Regenerate', - }, - text: { - id: 'AccessTokenBlock.text', - defaultMessage: - 'In order to provide security for your own domain password, you can use a user token - to verify your account to be able to log with agent.', - }, - warningHeader: { - id: 'AccessTokenBlock.warningHeader', - defaultMessage: 'Keep the token safe!', - }, - warning: { - id: 'AccessTokenBlock.warning', - defaultMessage: "This token shouldn't be shared or published at any type of public sources.", - }, - regenerateSuccess: { - id: 'AccessTokenBlock.regenerateSuccess', - defaultMessage: 'Changes have been saved successfully', - }, - regenerateError: { - id: 'AccessTokenBlock.submitError', - defaultMessage: "Error! Can't regenerate access token", - }, -}); - -@connect( - (state) => ({ - token: apiTokenValueSelector(state), - }), - { showModalAction, generateApiTokenAction }, -) -@injectIntl -@track() -export class AccessTokenBlock extends Component { - static propTypes = { - intl: PropTypes.object.isRequired, - showModalAction: PropTypes.func.isRequired, - generateApiTokenAction: PropTypes.func.isRequired, - token: PropTypes.string, - tracking: PropTypes.shape({ - trackEvent: PropTypes.func, - getTrackingData: PropTypes.func, - }).isRequired, - }; - - static defaultProps = { - token: '', - }; - - onGenerate = () => { - this.props.tracking.trackEvent(PROFILE_PAGE_EVENTS.REGENERATE_BTN); - this.props.showModalAction({ - id: 'regenerateAccessTokenModal', - data: { onRegenerate: this.regenerateHandler }, - }); - }; - - regenerateHandler = () => { - this.props.generateApiTokenAction({ - successMessage: this.props.intl.formatMessage(messages.regenerateSuccess), - errorMessage: this.props.intl.formatMessage(messages.regenerateError), - }); - }; - - render = () => { - const { - intl: { formatMessage }, - } = this.props; - - return ( -
- - {formatMessage(messages.header)} - - -
-
- {formatMessage(messages.header)} -
- {this.props.token} - - {Parser(IconDuplicate)} - -
-
- - - {formatMessage(messages.regenerate)} - - -
-
-

{formatMessage(messages.text)}

- - {formatMessage(messages.warning)} - -
-
-
- ); - }; -} diff --git a/app/src/pages/inside/profilePage/apiKeys/apiKeys.jsx b/app/src/pages/inside/profilePage/apiKeys/apiKeys.jsx new file mode 100644 index 0000000000..6c72ac9d6b --- /dev/null +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeys.jsx @@ -0,0 +1,52 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { connect, useDispatch } from 'react-redux'; +import classNames from 'classnames/bind'; +import { apiKeysSelector, fetchApiKeysAction } from 'controllers/user'; +import { NoApiKeysBlock } from 'pages/inside/profilePage/apiKeys/noApiKeysBlock'; +import { ApiKeysBlock } from 'pages/inside/profilePage/apiKeys/apiKeysBlock'; +import styles from './apiKeys.scss'; + +const cx = classNames.bind(styles); + +const ApiKeysBase = ({ apiKeys }) => { + const dispatch = useDispatch(); + + useEffect(() => { + dispatch(fetchApiKeysAction()); + }, []); + + return ( +
+ {apiKeys.length ? : } +
+ ); +}; +ApiKeysBase.propTypes = { + apiKeys: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number, + name: PropTypes.string, + created_at: PropTypes.number, + }), + ).isRequired, +}; +export const ApiKeys = connect((state) => ({ + apiKeys: apiKeysSelector(state), +}))(ApiKeysBase); diff --git a/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/index.js b/app/src/pages/inside/profilePage/apiKeys/apiKeys.scss similarity index 85% rename from app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/index.js rename to app/src/pages/inside/profilePage/apiKeys/apiKeys.scss index 1829a4b138..842ff4ac4d 100644 --- a/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/index.js +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeys.scss @@ -1,4 +1,4 @@ -/* +/*! * Copyright 2019 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,4 +14,9 @@ * limitations under the License. */ -export { RegenerateAccessTokenModal } from './regenerateAccessTokenModal'; +.api-keys { + width: 100%; + margin-bottom: 5px; + box-sizing: border-box; + padding: 0 30px; +} diff --git a/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx new file mode 100644 index 0000000000..a8674905b3 --- /dev/null +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx @@ -0,0 +1,110 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { useIntl, defineMessages } from 'react-intl'; +import PropTypes from 'prop-types'; +import classNames from 'classnames/bind'; +import { useDispatch } from 'react-redux'; +import { showModalAction } from 'controllers/modal'; +import { BlockContainerBody, BlockContainerHeader } from 'pages/inside/profilePage/blockContainer'; +import { ScrollWrapper } from 'components/main/scrollWrapper'; +import { daysFromNow } from 'common/utils'; +import { GhostButton } from 'components/buttons/ghostButton'; +import styles from './apiKeysBlock.scss'; + +const cx = classNames.bind(styles); +const messages = defineMessages({ + generateApiKey: { + id: 'ApiKeys.ApiKeysBlock.generateButton', + defaultMessage: 'Generate API Key', + }, + description: { + id: 'ApiKeys.ApiKeysBlock.description', + defaultMessage: + 'In order to provide security for your own domain password, you can use a user key — to verify your account to be able to report with agent.', + }, + headerNameCol: { + id: 'ApiKeys.ApiKeysBlock.headerNameCol', + defaultMessage: 'API key name', + }, + headerDateCol: { + id: 'ApiKeys.ApiKeysBlock.headerDateCol', + defaultMessage: 'created', + }, + revoke: { + id: 'ApiKeys.ApiKeysBlock.revoke', + defaultMessage: 'Revoke', + }, +}); + +export const ApiKeysBlock = ({ apiKeys }) => { + const { formatMessage } = useIntl(); + const dispatch = useDispatch(); + + const onGenerateClick = () => dispatch(showModalAction({ id: 'generateApiKeyModal' })); + const onRevokeClick = (key) => dispatch(showModalAction({ id: 'revokeApiKeyModal', data: key })); + + return ( +
+
{formatMessage(messages.description)}
+ + {formatMessage(messages.generateApiKey)} + +
+ +
{formatMessage(messages.headerNameCol)}
+
{formatMessage(messages.headerDateCol)}
+
+ + + + {apiKeys.map((key) => ( +
+
{key.name}
+
{daysFromNow(key.created_at)}
+
+ onRevokeClick(key)} + title={formatMessage(messages.revoke)} + transparentBorder + transparentBackground + transparentBorderHover + color="red" + > + {formatMessage(messages.revoke)} + +
+
+ ))} +
+
+
+
+ ); +}; +ApiKeysBlock.propTypes = { + apiKeys: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + name: PropTypes.string.isRequired, + created_at: PropTypes.number.isRequired, + }), + ), +}; +ApiKeysBlock.defaultProps = { + apiKeys: [], +}; diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss similarity index 51% rename from app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss rename to app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss index 625befd5a8..c071ce2064 100644 --- a/app/src/pages/inside/profilePage/accessTokenBlock/accessTokenBlock.scss +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss @@ -1,5 +1,5 @@ /*! - * Copyright 2019 EPAM Systems + * Copyright 2023 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,86 +14,92 @@ * limitations under the License. */ -.access-token-block { - width: 100%; - margin-bottom: 5px; - box-sizing: border-box; - padding: 0 30px; -} -.header-label { - width: 100%; - display: inline-block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; +.api-keys-block { + max-width: 860px; + margin: 0 auto; } -.token-value-block { - display: flex; - justify-content: space-between; - width: 100%; - margin-right: 10px; - align-items: center; - padding: 6px 10px; - border: 1px solid $COLOR--gray-80; - font-size: 13px; - line-height: 13px; - color: $COLOR--charcoal-grey; +.description { + font-family: $FONT-REGULAR; + font-size: 12px; + color: $COLOR--gray-60; + margin-bottom: 24px; } -.copy { - height: 16px; - width: 16px; - margin-left: 10px; - cursor: pointer; - stroke: $COLOR--gray-60; - &:hover { - stroke: $COLOR--black-2; - } +.api-keys { + margin: 28px auto 0; } -.body-wrapper { - padding: 15px; +.name-col { + width: 60%; + overflow: hidden; + display: inline-block; + box-sizing: border-box; + vertical-align: top; + white-space: nowrap; + text-overflow: ellipsis; @media (max-width: $SCREEN_XS_MAX) { - padding-left: 0; - padding-right: 0; + width: 100%; } } -.field-wrapper { - display: flex; - justify-content: space-between; - height: 30px; -} -.label { - margin-right: 10px; - display: block; - line-height: 30px; - font-family: $FONT-REGULAR; - font-size: 13px; - color: $COLOR--charcoal-grey; - white-space: nowrap; +.date-col { + width: 30%; + display: inline-block; + box-sizing: border-box; + vertical-align: top; + overflow: hidden; + text-overflow: ellipsis; @media (max-width: $SCREEN_XS_MAX) { display: none; } } -.regenerate-btn { - white-space: nowrap; +.revoke-col { + width: 10%; + display: inline-block; + box-sizing: border-box; + vertical-align: top; + overflow: hidden; + text-overflow: ellipsis; + margin-left: 20px; + @media (max-width: $SCREEN_XS_MAX) { display: none; } } -.tip { - margin-top: 10px; - line-height: 1.43; - font-family: $FONT-REGULAR; - font-size: 12px; - color: $COLOR--gray-60; + +.key-item { + width: 100%; + height: 35px; + padding: 0 15px; + border-bottom: 1px solid $COLOR--gray-91; + box-sizing: border-box; + line-height: 35px; + text-transform: uppercase; + white-space: nowrap; + font-size: 13px; + color: $COLOR--charcoal-grey; @media (max-width: $SCREEN_XS_MAX) { - display: none; + height: 55px; + line-height: 20px; + padding-top: 6px; + } + + .name-col { + padding-right: 15px; + font-family: $FONT-SEMIBOLD; + } + .date-col { + font-family: $FONT-REGULAR; + text-transform: none; + + @media (max-width: $SCREEN_XS_MAX) { + width: 100%; + display: block; + } } } diff --git a/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/index.js b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/index.js new file mode 100644 index 0000000000..2b1d1a3846 --- /dev/null +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { ApiKeysBlock } from './apiKeysBlock'; diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/buttonWithTooltip.jsx b/app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/buttonWithTooltip.jsx similarity index 100% rename from app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/buttonWithTooltip.jsx rename to app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/buttonWithTooltip.jsx diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/index.js b/app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/index.js similarity index 100% rename from app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/index.js rename to app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/index.js diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/warningTooltip/index.js b/app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/warningTooltip/index.js similarity index 100% rename from app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/warningTooltip/index.js rename to app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/warningTooltip/index.js diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/warningTooltip/warningTooltip.jsx b/app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/warningTooltip/warningTooltip.jsx similarity index 100% rename from app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/warningTooltip/warningTooltip.jsx rename to app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/warningTooltip/warningTooltip.jsx diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/warningTooltip/warningTooltip.scss b/app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/warningTooltip/warningTooltip.scss similarity index 100% rename from app/src/pages/inside/profilePage/accessTokenBlock/buttonWithTooltip/warningTooltip/warningTooltip.scss rename to app/src/pages/inside/profilePage/apiKeys/buttonWithTooltip/warningTooltip/warningTooltip.scss diff --git a/app/src/pages/inside/profilePage/accessTokenBlock/index.js b/app/src/pages/inside/profilePage/apiKeys/index.js similarity index 91% rename from app/src/pages/inside/profilePage/accessTokenBlock/index.js rename to app/src/pages/inside/profilePage/apiKeys/index.js index f0dbf18e57..ba050a13e6 100644 --- a/app/src/pages/inside/profilePage/accessTokenBlock/index.js +++ b/app/src/pages/inside/profilePage/apiKeys/index.js @@ -14,4 +14,4 @@ * limitations under the License. */ -export { AccessTokenBlock } from './accessTokenBlock'; +export { ApiKeys } from './apiKeys'; diff --git a/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/img/key.png b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/img/key.png new file mode 100644 index 0000000000000000000000000000000000000000..8b97145ba9fa92a74fa774ac84365344dbe88f43 GIT binary patch literal 2748 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 literal 0 HcmV?d00001 diff --git a/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/index.js b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/index.js new file mode 100644 index 0000000000..e4f3d79cb1 --- /dev/null +++ b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { NoApiKeysBlock } from './noApiKeysBlock'; diff --git a/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.jsx b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.jsx new file mode 100644 index 0000000000..16ea1f2bc2 --- /dev/null +++ b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.jsx @@ -0,0 +1,60 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { useIntl, defineMessages } from 'react-intl'; +import classNames from 'classnames/bind'; +import { useDispatch } from 'react-redux'; +import { showModalAction } from 'controllers/modal'; +import { GhostButton } from 'components/buttons/ghostButton'; +import styles from './noApiKeysBlock.scss'; + +const cx = classNames.bind(styles); +const messages = defineMessages({ + header: { + id: 'ApiKeys.noApiKeys.header', + defaultMessage: 'No API Keys', + }, + generateApiKey: { + id: 'ApiKeys.noApiKeys.generateButton', + defaultMessage: 'Generate API Key', + }, + description: { + id: 'ApiKeys.noApiKeys.description', + defaultMessage: + 'In order to provide security for your own domain password, you can use a user key — to verify your account to be able to report with agent.', + }, +}); + +export const NoApiKeysBlock = () => { + const { formatMessage } = useIntl(); + const dispatch = useDispatch(); + + const onGenerateClick = () => dispatch(showModalAction({ id: 'generateApiKeyModal' })); + + return ( +
+
+
{formatMessage(messages.header)}
+
{formatMessage(messages.description)}
+
+ + {formatMessage(messages.generateApiKey)} + +
+
+ ); +}; diff --git a/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.scss b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.scss new file mode 100644 index 0000000000..78f35b05ff --- /dev/null +++ b/app/src/pages/inside/profilePage/apiKeys/noApiKeysBlock/noApiKeysBlock.scss @@ -0,0 +1,49 @@ +/*! + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.no-api-keys-block { + margin-top: 82px; +} + +.image-holder { + width: 172px; + height: 92px; + margin: 0 auto 24px; + background-image: url(./img/key.png); +} + +.header { + font-family: $FONT-REGULAR; + font-size: 19px; + color: $COLOR--charcoal-grey; + text-align: center; + margin: 0 auto 16px; +} + +.description { + font-family: $FONT-REGULAR; + font-size: 12px; + color: $COLOR--gray-60; + text-align: center; + margin: 0 auto 20px; + max-width: 420px; +} + +.generate-button { + display: block; + width: fit-content; + margin: 0 auto 24px; +} diff --git a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx index 30e0a5342e..3b95bce288 100644 --- a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx +++ b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx @@ -18,7 +18,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { ContainerWithTabs } from 'components/main/containerWithTabs'; -import { apiTokenValueSelector, activeProjectSelector, userIdSelector } from 'controllers/user'; +import { activeProjectSelector, userIdSelector } from 'controllers/user'; import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events'; import styles from './configExamplesBlock.scss'; import { BlockContainerBody } from '../blockContainer'; @@ -26,25 +26,22 @@ import { BlockContainerBody } from '../blockContainer'; import { TabsConfig } from './tabsConfig'; const cx = classNames.bind(styles); - +const API_KEY = ''; @connect((state) => ({ - token: apiTokenValueSelector(state), activeProject: activeProjectSelector(state), login: userIdSelector(state), })) export class ConfigExamplesBlock extends Component { static propTypes = { - token: PropTypes.string, login: PropTypes.string, activeProject: PropTypes.string, }; static defaultProps = { - token: '', login: '', activeProject: '', }; render() { - const { token, activeProject, login } = this.props; + const { activeProject, login } = this.props; return (
@@ -52,11 +49,11 @@ export class ConfigExamplesBlock extends Component {
diff --git a/app/src/pages/inside/profilePage/index.js b/app/src/pages/inside/profilePage/index.js index e10dce3e57..bd47b2bd32 100644 --- a/app/src/pages/inside/profilePage/index.js +++ b/app/src/pages/inside/profilePage/index.js @@ -19,4 +19,6 @@ export { DeleteImageModal } from './modals/deleteImageModal'; export { ChangePasswordModal } from './modals/changePasswordModal'; export { ForceUpdateModal } from './modals/forceUpdateModal'; export { EditPersonalInformationModal } from './modals/editPersonalInfoModal'; -export { RegenerateAccessTokenModal } from './modals/regenerateAccessTokenModal'; +export { GenerateApiKeyModal } from './modals/generateApiKeyModal'; +export { ApiKeyGeneratedModal } from './modals/apiKeyGeneratedModal'; +export { RevokeApiKeyModal } from './modals/revokeApiKeyModal'; diff --git a/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.jsx b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.jsx new file mode 100644 index 0000000000..55480315ab --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.jsx @@ -0,0 +1,96 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import PropTypes from 'prop-types'; +import { useDispatch } from 'react-redux'; +import { defineMessages, useIntl } from 'react-intl'; +import classNames from 'classnames/bind'; +import { ModalLayout, withModal } from 'components/main/modal'; +import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; +import { Input } from 'components/inputs/input'; +import { NOTIFICATION_TYPES, showNotification } from 'controllers/notification'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import { BigButton } from 'components/buttons/bigButton'; +import styles from './apiKeyGeneratedModal.scss'; + +const cx = classNames.bind(styles); +const messages = defineMessages({ + header: { + id: 'ApiKeyGeneratedModal.header', + defaultMessage: 'API key generated', + }, + description: { + id: 'ApiKeyGeneratedModal.description', + defaultMessage: + 'Copy the API Key and store it in a safe place. \n' + + 'You won’t be able to see your Key once you click Close button.', + }, + loaderText: { + id: 'ApiKeyGeneratedModal.loaderText', + defaultMessage: 'GENERATING', + }, + successNotification: { + id: 'ApiKeyGeneratedModal.successNotification', + defaultMessage: 'API Key has been copied successfully', + }, +}); + +const ApiKeyGenerated = ({ data }) => { + const { formatMessage } = useIntl(); + const dispatch = useDispatch(); + const { apiKey } = data; + + const onCopy = () => { + dispatch( + showNotification({ + type: NOTIFICATION_TYPES.SUCCESS, + message: formatMessage(messages.successNotification), + }), + ); + }; + + const copyButton = ( + + {formatMessage(COMMON_LOCALE_KEYS.COPY_TO_CLIPBOARD)} + + ); + + const cancelButton = { + text: formatMessage(COMMON_LOCALE_KEYS.CANCEL), + }; + + return ( + +
{formatMessage(messages.description)}
+
+ +
+
+ ); +}; +ApiKeyGenerated.propTypes = { + data: PropTypes.shape({ + apiKey: PropTypes.string.isRequired, + }), +}; + +export const ApiKeyGeneratedModal = withModal('apiKeyGeneratedModal')(ApiKeyGenerated); diff --git a/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.scss b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss similarity index 76% rename from app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.scss rename to app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss index bd55789334..3f59cf1393 100644 --- a/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.scss +++ b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss @@ -1,5 +1,5 @@ /*! - * Copyright 2019 EPAM Systems + * Copyright 2023 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,13 +14,13 @@ * limitations under the License. */ -.warning { - margin-bottom: 10px; - color: $COLOR--orange-red; - text-transform: uppercase; - font-family: $FONT-SEMIBOLD; +.description { + color: $COLOR--black-3; font-size: 13px; + line-height: 20px; + margin-bottom: 24px; } -.text { - font-size: 13px; + +.input { + margin-bottom: 34px; } diff --git a/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/index.js b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/index.js new file mode 100644 index 0000000000..46e41301c2 --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { ApiKeyGeneratedModal } from './apiKeyGeneratedModal'; diff --git a/app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.jsx b/app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.jsx new file mode 100644 index 0000000000..1d61bb1117 --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.jsx @@ -0,0 +1,197 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import { defineMessages, useIntl } from 'react-intl'; +import { connect, useDispatch } from 'react-redux'; +import { formValueSelector, reduxForm } from 'redux-form'; +import classNames from 'classnames/bind'; +import { LoaderBlock } from 'pages/inside/profilePage/modals/loaderBlock'; +import { ModalLayout, withModal, ModalField } from 'components/main/modal'; +import { FieldProvider } from 'components/fields/fieldProvider'; +import { FieldErrorHint } from 'components/fields/fieldErrorHint'; +import { Input } from 'components/inputs/input'; +import { + bindMessageToValidator, + commonValidators, + composeBoundValidators, + validate, +} from 'common/utils/validation'; +import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; +import { showModalAction } from 'controllers/modal'; +import { addApiKeyAction, apiKeysSelector } from 'controllers/user'; +import styles from './generateApiKeyModal.scss'; + +const LABEL_WIDTH = 85; +const MAX_NAME_LENGTH = 40; +const cx = classNames.bind(styles); +const messages = defineMessages({ + header: { + id: 'GenerateApiKeyModal.header', + defaultMessage: 'Generate API key', + }, + description: { + id: 'GenerateApiKeyModal.description', + defaultMessage: + 'A new API Key will be generated. Keep this Key safe. We do not recommend making this Key publicly available.', + }, + nameLabel: { + id: 'GenerateApiKeyModal.nameLabel', + defaultMessage: 'API Key Name', + }, + counterText: { + id: 'GenerateApiKeyModal.counterText', + defaultMessage: 'Number of characters remaining: ', + }, + exceededCounterText: { + id: 'GenerateApiKeyModal.exceededCounterText', + defaultMessage: 'You used {used} of {allowed} symbols', + }, + loaderText: { + id: 'GenerateApiKeyModal.loaderText', + defaultMessage: 'GENERATING', + }, + successNotification: { + id: 'GenerateApiKeyModal.successNotification', + defaultMessage: 'API Key has been generated successfully', + }, + notificationFail: { + id: 'GenerateApiKeyModal.notificationFail', + defaultMessage: 'API Key generate failed', + }, +}); + +const formSelector = formValueSelector('generateApiKeyForm'); + +const lengthAndUniqueNameValidator = (existNames) => + composeBoundValidators([ + commonValidators.requiredField, + bindMessageToValidator(validate.apiKeyName, 'apiKeyNameWrongSizeHint'), + bindMessageToValidator(validate.uniqueApiKeyName(existNames), 'apiKeyNameUniqueHint'), + ]); + +const GenerateApiKey = ({ invalid, handleSubmit, apiKeyName }) => { + const { formatMessage } = useIntl(); + const dispatch = useDispatch(); + const [loading, setLoading] = useState(false); + + const onSuccessfulGeneration = (apiKey) => { + setLoading(false); + dispatch(showModalAction({ id: 'apiKeyGeneratedModal', data: { apiKey } })); + }; + + const generate = () => { + dispatch( + addApiKeyAction( + apiKeyName, + formatMessage(messages.successNotification), + formatMessage(messages.notificationFail), + onSuccessfulGeneration, + ), + ); + }; + + const okButton = { + text: formatMessage(COMMON_LOCALE_KEYS.GENERATE), + onClick: () => { + setLoading(true); + handleSubmit(generate)(); + }, + disabled: invalid, + }; + const cancelButton = { + text: formatMessage(COMMON_LOCALE_KEYS.CANCEL), + }; + + const symbolsLeft = MAX_NAME_LENGTH - apiKeyName.length; + + return ( + + {loading ? ( + + ) : ( + <> +
{formatMessage(messages.description)}
+
+ + + + + + + +
+
+ {symbolsLeft < 0 ? ( + formatMessage(messages.exceededCounterText, { + used: apiKeyName.length, + allowed: MAX_NAME_LENGTH, + }) + ) : ( + <> + {formatMessage(messages.counterText)} + {symbolsLeft} + + )} +
+ + )} +
+ ); +}; +GenerateApiKey.propTypes = { + handleSubmit: PropTypes.func.isRequired, + invalid: PropTypes.bool.isRequired, + apiKeyName: PropTypes.string, + apiKeys: PropTypes.arrayOf( + PropTypes.shape({ + name: PropTypes.string, + }), + ), +}; +GenerateApiKey.defaultProps = { + apiKeyName: '', + apiKeys: [], +}; + +export const GenerateApiKeyModal = withModal('generateApiKeyModal')( + connect( + (state) => ({ + apiKeyName: formSelector(state, 'apiKeyName'), + apiKeys: apiKeysSelector(state), + }), + { + addApiKeyAction, + }, + )( + reduxForm({ + form: 'generateApiKeyForm', + validate: (values, ownProps) => { + const { apiKeyName } = values; + const { apiKeys } = ownProps; + const names = apiKeys.map((key) => key.name); + return { + apiKeyName: lengthAndUniqueNameValidator(names)(apiKeyName), + }; + }, + })(GenerateApiKey), + ), +); diff --git a/app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.scss b/app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.scss new file mode 100644 index 0000000000..c8f236769c --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/generateApiKeyModal/generateApiKeyModal.scss @@ -0,0 +1,45 @@ +/*! + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.description { + color: $COLOR--black-3; + font-size: 13px; + line-height: 20px; + margin-bottom: 24px; +} + +.form { + margin-right: 70px; +} + +.apiKeyName { + margin-left: 127px; + margin-top: -7px; + display: flex; + align-items: center; +} + +.counter { + margin: -14px 0 0 114px; + color: $COLOR--gray-60; + font-family: $FONT-REGULAR; + font-size: 12px; + line-height: 14px; +} + +.loader-block { + margin: 64px auto 42px; +} diff --git a/app/src/pages/inside/profilePage/modals/generateApiKeyModal/index.js b/app/src/pages/inside/profilePage/modals/generateApiKeyModal/index.js new file mode 100644 index 0000000000..bfd784215e --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/generateApiKeyModal/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { GenerateApiKeyModal } from './generateApiKeyModal'; diff --git a/app/src/pages/inside/profilePage/modals/loaderBlock/index.js b/app/src/pages/inside/profilePage/modals/loaderBlock/index.js new file mode 100644 index 0000000000..e69ff9a9a7 --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/loaderBlock/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { LoaderBlock } from './loaderBlock'; diff --git a/app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.jsx b/app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.jsx new file mode 100644 index 0000000000..9a768fe2c3 --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.jsx @@ -0,0 +1,42 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import classNames from 'classnames/bind'; +import { BubblesPreloader } from 'components/preloaders/bubblesPreloader'; +import PropTypes from 'prop-types'; +import styles from './loaderBlock.scss'; + +const cx = classNames.bind(styles); + +export const LoaderBlock = ({ text, className }) => { + return ( +
+
+ +
+
{text}
+
+ ); +}; +LoaderBlock.propTypes = { + text: PropTypes.string, + className: PropTypes.string, +}; +LoaderBlock.defaultProps = { + text: '', + className: '', +}; diff --git a/app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.scss b/app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.scss new file mode 100644 index 0000000000..d122f3cb61 --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/loaderBlock/loaderBlock.scss @@ -0,0 +1,34 @@ +/*! + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.loader-block { + height: 100%; +} + +.loader { + margin: 0 auto; + height: 6px; + width: 48px; +} + +.loader-text { + margin: 6px auto 0; + color: $COLOR--dirty-gray; + font-family: $FONT-REGULAR; + font-size: 7px; + line-height: 10px; + text-align: center; +} diff --git a/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.jsx b/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.jsx deleted file mode 100644 index fdec9bfc9c..0000000000 --- a/app/src/pages/inside/profilePage/modals/regenerateAccessTokenModal/regenerateAccessTokenModal.jsx +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2019 EPAM Systems - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames/bind'; -import { defineMessages, injectIntl } from 'react-intl'; -import { ModalLayout, withModal } from 'components/main/modal'; -import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; -import styles from './regenerateAccessTokenModal.scss'; - -const cx = classNames.bind(styles); - -const messages = defineMessages({ - header: { - id: 'RegenerateAccessTokenModal.header', - defaultMessage: 'Regenerate access token', - }, - warning: { - id: 'RegenerateAccessTokenModal.warning', - defaultMessage: 'Warning!', - }, - text: { - id: 'RegenerateAccessTokenModal.text', - defaultMessage: 'All configured agents with old access token will not be working after that.', - }, -}); - -@withModal('regenerateAccessTokenModal') -@injectIntl -export class RegenerateAccessTokenModal extends Component { - static propTypes = { - data: PropTypes.shape({ - onRegenerate: PropTypes.func, - }).isRequired, - intl: PropTypes.object.isRequired, - }; - render() { - const { intl, data } = this.props; - const okButton = { - text: intl.formatMessage(COMMON_LOCALE_KEYS.OK), - onClick: (closeModal) => { - data.onRegenerate(); - closeModal(); - }, - }; - const cancelButton = { - text: intl.formatMessage(COMMON_LOCALE_KEYS.CANCEL), - }; - return ( - -

{intl.formatMessage(messages.warning)}

-

{intl.formatMessage(messages.text)}

-
- ); - } -} diff --git a/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/index.js b/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/index.js new file mode 100644 index 0000000000..d187ec0d0b --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/index.js @@ -0,0 +1,17 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { RevokeApiKeyModal } from './revokeApiKeyModal'; diff --git a/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.jsx b/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.jsx new file mode 100644 index 0000000000..87858a161e --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.jsx @@ -0,0 +1,107 @@ +/* + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { useState } from 'react'; +import { useDispatch } from 'react-redux'; +import PropTypes from 'prop-types'; +import { defineMessages, useIntl } from 'react-intl'; +import classNames from 'classnames/bind'; +import { LoaderBlock } from 'pages/inside/profilePage/modals/loaderBlock'; +import { ModalLayout, withModal } from 'components/main/modal'; +import { COMMON_LOCALE_KEYS } from 'common/constants/localization'; +import { deleteApiKeyAction } from 'controllers/user'; +import styles from './revokeApiKeyModal.scss'; + +const cx = classNames.bind(styles); +const messages = defineMessages({ + header: { + id: 'RevokeApiKeyModal.header', + defaultMessage: 'Revoke API key', + }, + description: { + id: 'RevokeApiKeyModal.description', + defaultMessage: 'Are you sure you want to revoke API Key "{name}"?', + }, + revoke: { + id: 'RevokeApiKeyModal.revoke', + defaultMessage: 'Revoke', + }, + successNotification: { + id: 'RevokeApiKeyModal.successNotification', + defaultMessage: 'API Key has been revoked successfully', + }, + notificationFail: { + id: 'RevokeApiKeyModal.notificationFail', + defaultMessage: 'API Key revoke failed', + }, + loaderText: { + id: 'RevokeApiKeyModal.loaderText', + defaultMessage: 'REVOKING', + }, +}); + +const RevokeApiKey = ({ data }) => { + const { formatMessage } = useIntl(); + const dispatch = useDispatch(); + const { name, id } = data; + const [loading, setLoading] = useState(false); + + const onRevoke = (closeModal) => { + setLoading(true); + dispatch( + deleteApiKeyAction( + id, + formatMessage(messages.successNotification), + formatMessage(messages.notificationFail), + closeModal, + ), + ); + }; + + const revokeButton = { + text: formatMessage(messages.revoke), + onClick: (closeModal) => { + setLoading(true); + onRevoke(closeModal); + }, + danger: true, + }; + const cancelButton = { + text: formatMessage(COMMON_LOCALE_KEYS.CANCEL), + }; + + return ( + + {loading ? ( + + ) : ( +
{formatMessage(messages.description, { name })}
+ )} +
+ ); +}; +RevokeApiKey.propTypes = { + data: PropTypes.shape({ + id: PropTypes.number.isRequired, + name: PropTypes.string.isRequired, + }).isRequired, +}; + +export const RevokeApiKeyModal = withModal('revokeApiKeyModal')(RevokeApiKey); diff --git a/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.scss b/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.scss new file mode 100644 index 0000000000..f11453aff3 --- /dev/null +++ b/app/src/pages/inside/profilePage/modals/revokeApiKeyModal/revokeApiKeyModal.scss @@ -0,0 +1,25 @@ +/*! + * Copyright 2023 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.description { + color: $COLOR--black-3; + font-size: 13px; + line-height: 20px; +} + +.loader-block { + margin: 18px auto -6px; +} diff --git a/app/src/pages/inside/profilePage/profilePage.jsx b/app/src/pages/inside/profilePage/profilePage.jsx index e952955526..fae7813747 100644 --- a/app/src/pages/inside/profilePage/profilePage.jsx +++ b/app/src/pages/inside/profilePage/profilePage.jsx @@ -30,7 +30,7 @@ import { PROJECT_ASSIGNMENT_ROUTE, } from 'common/constants/userProfileRoutes'; import { PersonalInfoBlock } from './personalInfoBlock'; -import { AccessTokenBlock } from './accessTokenBlock'; +import { ApiKeys } from './apiKeys'; import { AssignedProjectsBlock } from './assignedProjectsBlock'; import { ConfigExamplesBlock } from './configExamplesBlock'; import { LocalizationBlock } from './localizationBlock'; @@ -73,7 +73,7 @@ const getNavigationTabsConfig = (formatMessage) => ({ [API_KEYS_ROUTE]: { name: formatMessage(messages.profilePageProjectApiKeysTab), link: getProfilePageLink(API_KEYS_ROUTE), - component: , + component: , }, [CONFIG_EXAMPLES_ROUTE]: { name: formatMessage(messages.profilePageConfigurationExamplesTab), From ff592f25f0fa045a4a7fa6b6d3cab3cc311f9136 Mon Sep 17 00:00:00 2001 From: Ilya Date: Tue, 23 May 2023 17:25:38 +0300 Subject: [PATCH 07/17] EPMRPP-83121 || Update unit tests (#3478) --- app/src/controllers/user/reducer.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/controllers/user/reducer.test.js b/app/src/controllers/user/reducer.test.js index 8b392beee3..0e131a6561 100644 --- a/app/src/controllers/user/reducer.test.js +++ b/app/src/controllers/user/reducer.test.js @@ -114,17 +114,17 @@ describe('user reducer', () => { }); test('should return old state on unknown action', () => { - const oldState = { type: 'bearer', value: 'apiKey' }; + const oldState = [{ id: '123', name: 'apiKey' }]; expect(apiKeysReducer(oldState, { type: 'foo' })).toBe(oldState); }); - test('should handle SET_API_KEYS', () => { + test('should handle SET_API_KEYS action', () => { expect( apiKeysReducer(undefined, { type: SET_API_KEYS, - payload: { type: 'bearer', value: 'apiKey' }, + payload: [{ id: '123', name: 'apiKey' }], }), - ).toEqual({ type: 'bearer', value: 'apiKey' }); + ).toEqual([{ id: '123', name: 'apiKey' }]); }); }); }); From 8075886b64c6456e11a25323720414cd230c9d8b Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Mon, 29 May 2023 16:38:55 +0400 Subject: [PATCH 08/17] EPMRPP-84121 || Update validation for API KEY Name (#3484) EPMRPP-84140 || API Keys. Text for empty state should be updated. Lang=BY,UA, RU EPMRPP-84103 || API Keys. Unnecessary horizontal scroll in the table --- app/localization/translated/be.json | 2 +- app/localization/translated/ru.json | 2 +- app/localization/translated/uk.json | 2 +- app/src/common/utils/validation/validate.js | 2 +- .../profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss | 9 +++------ 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 4c3873776e..6a9166e961 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -110,7 +110,7 @@ "ApiKeys.ApiKeysBlock.headerDateCol": "створаны", "ApiKeys.ApiKeysBlock.headerNameCol": "Назва ключа API", "ApiKeys.ApiKeysBlock.revoke": "Адклікаць", - "ApiKeys.noApiKeys.description": "Каб забяспечыць бяспеку пароля вашага ўласнага дамена, вы можаце выкарыстоўваць ключ карыстальніка — каб пацвердзіць свой уліковы запіс і мець магчымасць увайсці з дапамогай агента.", + "ApiKeys.noApiKeys.description": "Каб забяспечыць бяспеку пароля вашага ўласнага дамена, вы можаце выкарыстоўваць ключ карыстальніка — каб пацвердзіць свой уліковы запіс і мець магчымасць адпраўляць вынікі пры дапамозе агента.", "ApiKeys.noApiKeys.generateButton": "Стварыць ключ API", "ApiKeys.noApiKeys.header": "Няма ключоў API", "ApiPage.title": "Дакументацыя API", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index b53b5ca4ae..1fba8f106d 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -110,7 +110,7 @@ "ApiKeys.ApiKeysBlock.headerDateCol": "создан", "ApiKeys.ApiKeysBlock.headerNameCol": "Имя ключа API", "ApiKeys.ApiKeysBlock.revoke": "Отозвать", - "ApiKeys.noApiKeys.description": "Чтобы обеспечить безопасность вашего собственного доменного пароля, вы можете использовать ключ пользователя — чтобы подтвердить свою учетную запись, чтобы иметь возможность войти в систему с помощью агента.", + "ApiKeys.noApiKeys.description": "Чтобы обеспечить безопасность вашего собственного доменного пароля, вы можете использовать ключ пользователя — чтобы подтвердить свою учетную запись, чтобы иметь возможность отправлять результаты при помощи агента.", "ApiKeys.noApiKeys.generateButton": "Сгенерировать API-ключ", "ApiKeys.noApiKeys.header": "Нет ключей API", "ApiPage.title": "Документация API", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index e6c7df43b0..032d888765 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -110,7 +110,7 @@ "ApiKeys.ApiKeysBlock.headerDateCol": "створений", "ApiKeys.ApiKeysBlock.headerNameCol": "Назва ключа API", "ApiKeys.ApiKeysBlock.revoke": "Відкликати", - "ApiKeys.noApiKeys.description": "Щоб забезпечити безпеку власного пароля домену, ви можете використовувати ключ користувача — щоб підтвердити свій обліковий запис і мати можливість входити за допомогою агента.", + "ApiKeys.noApiKeys.description": "Щоб забезпечити безпеку власного пароля домену, ви можете використовувати ключ користувача — щоб підтвердити свій обліковий запис і мати можливість надсилати результати за допомогою агента.", "ApiKeys.noApiKeys.generateButton": "Створити ключ API", "ApiKeys.noApiKeys.header": "Немає ключів API", "ApiPage.title": "Документація API", diff --git a/app/src/common/utils/validation/validate.js b/app/src/common/utils/validation/validate.js index b5c63189d5..582439e469 100644 --- a/app/src/common/utils/validation/validate.js +++ b/app/src/common/utils/validation/validate.js @@ -116,4 +116,4 @@ export const notificationLaunchNames = (value) => isEmpty(value) || !value.length || value.every(launchName); export const apiKeyName = composeValidators([isNotEmpty, lengthRange(1, 40)]); export const uniqueApiKeyName = (names) => (value) => - names.every((name) => name.toLowerCase() !== value.toLowerCase()); + names.every((name) => name.toLowerCase() !== value.trim().toLowerCase()); diff --git a/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss index c071ce2064..c121f4b43c 100644 --- a/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.scss @@ -45,7 +45,7 @@ } .date-col { - width: 30%; + width: 25%; display: inline-block; box-sizing: border-box; vertical-align: top; @@ -58,13 +58,11 @@ } .revoke-col { - width: 10%; + width: 15%; display: inline-block; box-sizing: border-box; vertical-align: top; - overflow: hidden; - text-overflow: ellipsis; - margin-left: 20px; + text-align: right; @media (max-width: $SCREEN_XS_MAX) { display: none; @@ -78,7 +76,6 @@ border-bottom: 1px solid $COLOR--gray-91; box-sizing: border-box; line-height: 35px; - text-transform: uppercase; white-space: nowrap; font-size: 13px; color: $COLOR--charcoal-grey; From e0540db9e87ee0ee1b5b020be72f6a2f3e1e69f3 Mon Sep 17 00:00:00 2001 From: Bam6ycha <84175555+Bam6ycha@users.noreply.github.com> Date: Tue, 30 May 2023 12:39:38 +0500 Subject: [PATCH 09/17] EPMRPP-83682 || Fix plugin fetching mechanism (#3480) * EPMRPP-83682 || Fix plugin fetching mechanism * EPMRPP-83682 || Code review fixes - 1 --- .../controllers/plugins/uiExtensions/sagas.js | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/app/src/controllers/plugins/uiExtensions/sagas.js b/app/src/controllers/plugins/uiExtensions/sagas.js index df7b7b20f3..1e4cbfde78 100644 --- a/app/src/controllers/plugins/uiExtensions/sagas.js +++ b/app/src/controllers/plugins/uiExtensions/sagas.js @@ -1,4 +1,4 @@ -import { select, call, all, put } from 'redux-saga/effects'; +import { select, put } from 'redux-saga/effects'; import { URLS } from 'common/urls'; import { fetch } from 'common/utils/fetch'; import { activeProjectSelector } from 'controllers/user'; @@ -39,7 +39,7 @@ export function* fetchUiExtensions() { url = URLS.projectIntegrationByIdCommand(activeProject, integration.id, COMMAND_GET_FILE); } - return call(fetch, url, { + return fetch(url, { method: 'PUT', data: { fileKey: 'main' }, }); @@ -49,13 +49,24 @@ export function* fetchUiExtensions() { return; } yield put(extensionLoadStartAction()); - const results = yield all(calls); + try { - results.forEach((r) => { - eval(r); // eslint-disable-line no-eval + const results = yield Promise.allSettled(calls); + + results.forEach((result) => { + if (result.status === 'fulfilled') { + try { + eval(result.value); // eslint-disable-line no-eval + } catch { + console.error('Failed to execute the code'); // eslint-disable-line no-console + } + } else { + console.error(result.reason); // eslint-disable-line no-console + } }); - } catch (err) { + } catch (error) { console.error('Plugin load error'); // eslint-disable-line no-console } + yield put(extensionLoadFinishAction()); } From 605eb74f525b18370051f077c641bf0765aa17b3 Mon Sep 17 00:00:00 2001 From: Ilya Date: Thu, 1 Jun 2023 16:38:33 +0300 Subject: [PATCH 10/17] Fix long UI service docker image builds (#3487) * Remove lint command during docker image build * Remove test command execution from Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 34f80bc6e6..ad90e78ced 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY ./app/ /usr/src/app/ RUN export NODE_OPTIONS="--max-old-space-size=4096" -RUN npm ci && npm run lint && npm run test:coverage && npm run build +RUN npm ci && npm run build FROM nginxinc/nginx-unprivileged:alpine From 941f97f5f6ebb0fd55f94b5b56f0ad7b2610fb46 Mon Sep 17 00:00:00 2001 From: Bam6ycha <84175555+Bam6ycha@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:26:59 +0500 Subject: [PATCH 11/17] EPMRPP-84065 || Change data time format for API keys (#3489) --- app/src/controllers/user/reducer.js | 2 +- .../inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/controllers/user/reducer.js b/app/src/controllers/user/reducer.js index 0a6552e41d..827586c466 100644 --- a/app/src/controllers/user/reducer.js +++ b/app/src/controllers/user/reducer.js @@ -96,7 +96,7 @@ export const activeProjectReducer = (state = '', { type, payload }) => { export const apiKeysReducer = (state = [], { type, payload }) => { switch (type) { case SET_API_KEYS: - return payload.sort((a, b) => b.created_at - a.created_at); + return payload.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); case ADD_API_KEY_SUCCESS: return [payload, ...state]; case DELETE_API_KEY_SUCCESS: diff --git a/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx index a8674905b3..49d667fce0 100644 --- a/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx +++ b/app/src/pages/inside/profilePage/apiKeys/apiKeysBlock/apiKeysBlock.jsx @@ -101,7 +101,7 @@ ApiKeysBlock.propTypes = { PropTypes.shape({ id: PropTypes.number.isRequired, name: PropTypes.string.isRequired, - created_at: PropTypes.number.isRequired, + created_at: PropTypes.string.isRequired, }), ), }; From 4014bc9fc6bc5911f5125015740621503439d61f Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Fri, 9 Jun 2023 11:26:24 +0400 Subject: [PATCH 12/17] EPMRPP-84211 || Update the 'API KEY GENERATED' modal design (#3500) --- app/localization/translated/be.json | 3 +- app/localization/translated/ru.json | 3 +- app/localization/translated/uk.json | 3 +- .../css/fonts/Roboto-Bold/Roboto-Bold.eot | Bin 0 -> 25631 bytes .../css/fonts/Roboto-Bold/Roboto-Bold.svg | 309 ++++++++++++++++++ .../css/fonts/Roboto-Bold/Roboto-Bold.ttf | Bin 0 -> 53676 bytes .../css/fonts/Roboto-Bold/Roboto-Bold.woff | Bin 0 -> 28704 bytes .../css/fonts/Roboto-Bold/Roboto-Bold.woff2 | Bin 0 -> 22352 bytes .../css/fonts/Roboto-Medium/Roboto-Medium.eot | Bin 0 -> 26071 bytes .../css/fonts/Roboto-Medium/Roboto-Medium.svg | 305 +++++++++++++++++ .../css/fonts/Roboto-Medium/Roboto-Medium.ttf | Bin 0 -> 54268 bytes .../fonts/Roboto-Medium/Roboto-Medium.woff | Bin 0 -> 29024 bytes .../fonts/Roboto-Medium/Roboto-Medium.woff2 | Bin 0 -> 22736 bytes .../fonts/Roboto-Regular/Roboto-Regular.eot | Bin 0 -> 25435 bytes .../fonts/Roboto-Regular/Roboto-Regular.svg | 308 +++++++++++++++++ .../fonts/Roboto-Regular/Roboto-Regular.ttf | Bin 0 -> 53440 bytes .../fonts/Roboto-Regular/Roboto-Regular.woff | Bin 0 -> 28508 bytes .../fonts/Roboto-Regular/Roboto-Regular.woff2 | Bin 0 -> 22164 bytes app/src/common/css/fonts/fonts.scss | 3 + app/src/common/css/variables/colors.scss | 1 + .../common/css/variables/font-variable.scss | 3 + .../apiKeyGeneratedModal.jsx | 11 +- .../apiKeyGeneratedModal.scss | 9 + 23 files changed, 951 insertions(+), 7 deletions(-) create mode 100644 app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.eot create mode 100644 app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.svg create mode 100644 app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.ttf create mode 100644 app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.woff create mode 100644 app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.woff2 create mode 100644 app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.eot create mode 100644 app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.svg create mode 100644 app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.ttf create mode 100644 app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.woff create mode 100644 app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.woff2 create mode 100644 app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.eot create mode 100644 app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.svg create mode 100644 app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.ttf create mode 100644 app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.woff create mode 100644 app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.woff2 diff --git a/app/localization/translated/be.json b/app/localization/translated/be.json index 6a9166e961..6eb2a5801e 100644 --- a/app/localization/translated/be.json +++ b/app/localization/translated/be.json @@ -101,7 +101,8 @@ "AnalyticsTab.analyticsListPoint1": "Інфармацыя пра прыладу: мадэль вашага абсталявання, версія аперацыйнай сістэмы, дазвол экрана, версія браўзэра;", "AnalyticsTab.analyticsListPoint2": "Інфармацыя пра паводзіны: падрабязнасці вашага выкарыстання ReportPortal, на што вы націскаеце і якія дзеянні вырабляеце, як доўга трымаеце прыкладанне адкрытым.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Настройкі сервера паспяхова абноўленыя", - "ApiKeyGeneratedModal.description": "Скапіруйце ключ API і захавайце яго ў надзейным месцы. \nВы не зможаце ўбачыць свой ключ, калі націснеце кнопку «Зачыніць».", + "ApiKeyGeneratedModal.description": "Скапіруйце ключ API і захавайце яго ў надзейным месцы.", + "ApiKeyGeneratedModal.descriptionNote": "Вы не зможаце ўбачыць свой ключ, калі націснеце кнопку «Зачыніць».", "ApiKeyGeneratedModal.header": "Створаны ключ API", "ApiKeyGeneratedModal.loaderText": "ГЕНЕРЫРУЮЦЬ", "ApiKeyGeneratedModal.successNotification": "Ключ API быў паспяхова скапіраваны", diff --git a/app/localization/translated/ru.json b/app/localization/translated/ru.json index 1fba8f106d..683aa0d3b3 100644 --- a/app/localization/translated/ru.json +++ b/app/localization/translated/ru.json @@ -101,7 +101,8 @@ "AnalyticsTab.analyticsListPoint1": "Информация об устройстве: модель вашего оборудования, версия операционной системы, разрешение экрана, версия браузера;", "AnalyticsTab.analyticsListPoint2": "Информация о поведении: подробности вашего использования ReportPortal, на что вы нажимаете и какие действия производите, как долго держите приложение открытым.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Настройки сервера успешно обновлены", - "ApiKeyGeneratedModal.description": "Скопируйте ключ API и сохраните его в надежном месте. \nВы не сможете увидеть свой ключ после нажатия кнопки «Закрыть».", + "ApiKeyGeneratedModal.description": "Скопируйте ключ API и сохраните его в надежном месте.", + "ApiKeyGeneratedModal.descriptionNote": "Вы не сможете увидеть свой ключ после нажатия кнопки «Закрыть».", "ApiKeyGeneratedModal.header": "Ключ API сгенерирован", "ApiKeyGeneratedModal.loaderText": "ГЕНЕРАЦИЯ", "ApiKeyGeneratedModal.successNotification": "Ключ API успешно скопирован", diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index 032d888765..7495a339d8 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -101,7 +101,8 @@ "AnalyticsTab.analyticsListPoint1": "Інформація про пристрої: модель вашого обладнання, версію операційної системи, дозвіл екрана, версія браузера;", "AnalyticsTab.analyticsListPoint2": "Інформація про поведінку: подробиці вашого використання ReportPortal, на що ви натискаєте і які дії виробляєте, як довго тримаєте додаток відкритим.", "AnalyticsTab.updateAnalyticsEnabledSuccess": "Налаштування сервера успішно оновлено", - "ApiKeyGeneratedModal.description": "Скопіюйте ключ API та зберігайте його в безпечному місці. \nВи не зможете побачити свій ключ після натискання кнопки «Закрити».", + "ApiKeyGeneratedModal.description": "Скопіюйте ключ API та зберігайте його в безпечному місці.", + "ApiKeyGeneratedModal.descriptionNote": "Ви не зможете побачити свій ключ після натискання кнопки «Закрити».", "ApiKeyGeneratedModal.header": "Ключ API створено", "ApiKeyGeneratedModal.loaderText": "ГЕНЕРУЮЧИЙ", "ApiKeyGeneratedModal.successNotification": "Ключ API успішно скопійовано", diff --git a/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.eot b/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.eot new file mode 100644 index 0000000000000000000000000000000000000000..88e17b962161854b520933f41876925297db0a86 GIT binary patch literal 25631 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 literal 0 HcmV?d00001 diff --git a/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.svg b/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.svg new file mode 100644 index 0000000000..11db87dd0e --- /dev/null +++ b/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.ttf b/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6ccf9417715b56effb8dc8cab145fa954c1b7182 GIT binary patch literal 53676 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

Jl|9Lfb6LJ7 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 N|B?TI(+HMY{x5Gar>Xz| literal 0 HcmV?d00001 diff --git a/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.woff b/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..6208290d98c7c9d0c4ce3b856afe815ae08316d5 GIT binary patch literal 28704 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%0D98NnwA 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 literal 0 HcmV?d00001 diff --git a/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.woff2 b/app/src/common/css/fonts/Roboto-Bold/Roboto-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ce41abcff513b5ec33e5108cb3d377b5077d96c8 GIT binary patch literal 22352 zcmV)JK)b(pPew8T0RR9109Q}|5&!@I0MgU|09NS$0RR9100000000000000000000 z0000Qfh-%mW*miH24Db$cnC-dgFF!o3WBAGz1_8f_?`e z41y^efxIQ`*oy+r0{~KLzm*9$hF))q5mQlq|Lj2Qb`VuYdp!I9&k0h-u%zrSMHo6? zR2ab{teLGiL05Z>ODL9r0+(9dYal(NZEHqkYUKmx z&p!TTaFU;;#uvpz{h8bMqxcey;!G5$NrB^NQ^XcOZM)8^=ihqiOx|}}PjqQd?HF}} zQe+^CF9O^qek3H1dJ=^-DkG&*_Z%V_fN{Mh;-7yAqv2_8|K8ng4Xhb`BXZ=(5w$U* zWCIzrgj9=73!}8L`@l#-zZj8NiD-XR25_50eKd+U8vGk=3=C|*Bt$8r0Z}QdG45@w z8-*PYr`uW${5Yd$hwv!DvA9+mY*7j6Vx8Ez4M*K&c%%FvrqXFu` z>HB}nN`F=TN~x*0>tzH@q2s7)CO!9urpwyX3qQoTL2B9_SN;u z4j3;{eMs8#mS^61N4-7s@1`aGT52X#eTv%Kv)-h>QH2vHO5#8MBlQgq-kG>o z;kJ9s`q2Ve5PFQrYV{ONN82ePeiFXw>YJstg^bu<4bggJ?nPuFbnaiL^}oO{e@3#B zqY{9Ma;xnGrbGd=mIH!mB=4b>6wMK|fJKEQ+Y8<8>+f)_%-mKbSBC(KGLr&;q^Q~l zBPw)-Vo12Ocv|iE?z>OKWe}c?XmzbfGB+i3%{^6P&P-^T9^wB_XW5SA1Lkgv?ry8Q zHe3=E)#z)y(#*)VEbXpwH(uEb^v<-0=yjMo0FnnsuKyy>B+}T~K zRC>!QR@?Mj6{|z03o^7jkI{Nt@osxxov_D%I*q!K zil=uWo?w<>OpdWt-5Y(z3JA!M1A_ivve|#-`4??Z4cb5h5#MAZbS_;Wv~~IC%OC_S z_<`ioK+{bJ)vE_JY6P`t0kvrZwd({eu>`crI?zTNL0fGFZMPG&TR&*fAn1huK*NSX z&%A^LJP*tT2?29;Xkc!iAP|HAwg>DC0s@*20=DJE4|e&Lkt(2n=jjziK>zL)IfX#~ zKABY|KpzG$Cj^jt-?gFyPyqo11_3nmUG@er*MR{Pc_%d~p5nBXu8C!-Y~QDJUN*%S z@kR7x&BMe0DgI$3yPVXdKcj&4=k(8bsFH+iz@(g1fMHFR<- zcrMpPM9zw&La3Y41HF}qhxbEX=nlhq227cGYaA9~;5IKg?N#UQ=x#U>zQgYbOl_A` z8+-yU6okImm7FOahSJpICz)qDAeDjtiAjN0pZ1s}Q(=ocNL2yBhtD~>s3-i+@%}_A zoO$ahhyjj?gZ#Y7muQ#q_>@9@n!wc(DhLqHFbFK|5Cao}ON>QBV#W6QZN%)+IdaG3 z$rF#1KR&q-2Ev3h5(!PjwBsgG5lNth#CA(bl37Wmjda@5(9Yubi7mB`y$$yA)ca$I zeLud!VMm4PHz2~0lcEeeBi4BrC|!3$yjyOY902Y?9hKlp1B->49E+nFF^-42ctxry zKJnL*z}V457AGAEjhpVo1ZPR&La;2Vkn|)uepV#&r`9IRv-*N{FrL$4akZXf3EzoC zipQHJUxMgY%i00r&MCkjYx5)E)Y}$wJ%^dY*S38AqnLtFgo&UO|K)^9Q%_#fWTjR* zzgfKRJ$Q~7uA7^mz#X-F6A;deCq`s%9 zGZ&KXI@!4G_MSQOpX=w0m&o}qQHU`qaZ^;0+%o?GQ1T3*@ti2>BzaHBcmB0_KG8Fu zME{&iI4$cO>Ov^uDB^}2B0_&A0;7c|5L?2;W#T$?FbQkz(LSY6I82FG4H3{Kq}RMh zjF7P~mQ=5EC?+cuVIsuOsneMpk>P$F%MG{M?TLsc8&hV?S%@-;s;6KjRa!E&8*z9p zyD_VRkR8c7>{(n^%yPS*I>^X33 zF(V|b`5DJecifvZ1%e<5g2y4VWAhs`e!u68kY8D8f0OqqYIs3U#5zd^HYM$8 z%MT1dqb~L5lB$NBBBBJ#3h*&pj^8?H`@YHrIh8;tQJNp zNzx!)&tU3+4u<}Q0o%BVy&3yRwCPAs8%7$*NaU2fMO7n!ps+}y6d;O|L?n}Bb3ZKN<<+(|aDO6f_xOaAOb&G!! zCQdT7d1RVIDI`0s_8|6gP=}Q|^8A%NDoP*1@@c7hW!DI?V$Rajdcj=w$5)k2#JS0)P-%Q|%Pwp#Xz3wL^%!_B@tKeP+TM_T zBx&v9{a0>YH!h{ywXTN~Ci+2nFC;6U)m3J1boyGC`l{7JHUIzs0002nfP_(ouf7aC zm0$zKm-Yz%To&6-YqqDrz8p9zh5J-`sdrz-W`M%0Msfmt zpom&(ZyA)bkLuy*o=vyc&U$AT+$CgUZbLkFpk|Zbe86=Xvq0Bn&6hV>p$WHUxwo1C zUM;FxLeEB=dHzcHSVUXdXPA}MylHUo-&h)LgU&`)N0fuw2!klQ+a9{>nN416@lGY2 z1z9;al1Bx~V}9=e?K0kg+GV|$_d=lox8Ar{KnSmj8wW@+x|DedQF_}+9ODNmC%khA zi1>uA6Q~;0%lL%_Tbe@#JOMY}S=N^+4*yJ&SXS6ZRZirojnW1_k9>da%pMAQrowAh z?;!q*6FdzO-u<7yPOW(D-L*ePAR?V){Zoq4bSJ3PT(arO#|5#z+6zRd6iLt6 zjvY$wdpBM0gnlPQrd5Vh2hkgPy1y}@My9WTZb(Bp3+g_cR&P)2lVqr%OaDcZ*HxKp z{wR+T&*f3;qic;n>l|IfF}dn(m;E2+Y$r;^gI^dQH`8HwD52brQDpZt`qjaX`Dw*2FqoQ%}cc`>n*p-Qzc zelO(Ns#zcBH?LO!o!pOL{eEJ}TA2OC=m+NL4%)L&dA(`26gqMBdMvUon~lXF(+W6j zmqOXQ9R5Pgi!aPQD$kUGq}_&xXk)R>VI1x?_v$4GMLc|cvW<_y0JQeE}&t6SYIMISEDT0 z!0>)oG@kr$$SLRv0}Vx*(dlv+2UAICHhU3qFPZ$PLr$^~QYeOe zCKFV_nm8CGh*AwHtR}cZOF@oQ(xeTw8BS2lh+DF(3%D&rBiqc#KnM;fVwi%4P8fw} zF-$=d7fg7DBIvq_#@H>l2i|cf=UW5+dA)@EB@~B|!%by5K?w46t&UG-03!GAIzB zzyc~BgeH?oO_HR?sbT@uw9cpoLU+`tAOZ14l$1Z-~r*$|-t z0SyeH)E1z`fTox~IT9qJipvaT1p_0C$PoDe0UbJ^%)(qR?l}Mh3b>dGxF5~UzKWS! z?ScvlRAWnNKg^wI7u0yh8RjiJnt)L!S!RQT@*WxoluK?U$3f9$aVlGWWn7>JT{k9j zD)D-O3A|BERJci8#7Ys1bsKh-yVwx)aq`v3dUqH_o=v~Y{Ys00-~U2*4UpX@e`+R( z?xA{q#(hevi$UIfO0$YUNq@WoR6W4iIpZP5>S*$Dt&eFmTM(TaNFxLX$Un0n~y?_cA&GbW@8|rxfPcW<*6Idu@bv(7?jYcB=;1==yXOT%SFGLT!+i?@NQ8hL%(2ccyA3++ zidRNWK<6miL_6K?w})j>jwLUT@~e{SJs82a!MDSA$Mtbz+!VLOCAbuq;Z^vqtw3aI z%K7(y;{S63>;SjUdb{m0! zvwoy%ggIh}o_jLz_$GYq9jI+{Ep2XMlE-QD0{hd?fI!(^w)9j+7WDye=di;GH@xsQ zXpA7b5k@cinl#5ChB1n9OoD4MFSfCZIQDUfqgHKkigR2di7QRqk{%O_<6%iW;}vPV zEwxNfe3KDt%j0iF0%B`rf~>OIngqwv+Q{MrpNP1YKX2J%Z=w)-^(ERq z`yFsFF%Bg*c!v|`NR$bPr&EbHoP>CX9E#J9dSq#!_jvS5J z5hp--i+r0}bqf)3RU2%QbJS|7J%P{R!0<*)C3wNXjsl6t_^U&3@wK;%S>7OVQX)|& zGa#-qwSh>4%ZZ^}Cx&Dyky>p}i1efso}DjD6iHp!vZkWd8;csiF;G8CV@1qF#9yV_ zK(kj*3i;|*%MlPZDpcdW+1BK?Fl2^ zvXfWH3j1lC_ycFyda!2A?nnT@WPOYZT5mFJ9+>tw4^SHrdu1YlxBi_4T*xru#apiT zX>pKri(WGz+s{R2>g6K8E~Qc-bK2>;?S0+P_6s0419rPU00+DXz<3EzCj-~H9FTyH zw~K=hk)U8EG6+Zo3Ynxh&}gXjs0&t*%|almS8F47<~ScrB0%N@=DO!V)U{y??Te^} zYei}#XD2(1hK_?W;l{ct+Z|?PT5D>`j&f5>weaat9+j1UcI@&LwBfI#P59FZ`d9?v zEtKA&wM3Tl6<&f54%gc9s*28_Lm%XLYjNqk?3``AM3jU1&M6j^T07&+)?xM{njD;N zLew`ZOYgK%s3hWSlUqmAs%B*~T5mjVs^F4|Hk=yNwj-MX`xf?@Z3U)~<5N zYm3_Ixes2AK1wB`XwSwc@06OX33mzFA-AsD1-09By6C|frOhicNQry&!FYu&c4xf7 z0TFu{?9t+?HnJGi7%x+}S;v@zT*h|7lUXC`+cOziW5_5eEz1pGxTjvX!Bo2o{QxZ5 z14)y9M~f5`KJ8 zRsQFT>S61l;J`|NhPvf5C1gGxhK{h>SRn!ze&^GPB0|@2^kEiI8MkibT_KBH2mOUv z#qu_D=mgo4o6Jld;dvFy9|=Sny3cPh>$>9N1pM1YPt2Q(t~_(=bSPa54RYQ&uVs=o zZb`?OPZwX%Q<3Onyp#nf#)HzUZiwDJDEv;`kkeHFVV^@YNPk9rtPdYGNpJ-+bU(8D$EU5aMj=mAov+= z5m!2EA*8tYvW!CHp)s=B5wxG4EzK4!cEo^(5(Dp8Wh68CR3<$wBTAxNG|+6AK!$A+ z4Y=kteJF+v#;#VC9E|BO#eMQY;&cEBdYC}AwZ~%2YC}3loj4DyFqcH(YAr-cWFXt+ zV9oyCO~4W2FR1j~z3;jhG29ZUDyIT7D*}%WSN=-Z^S!vyIpK|tZEpcKu!(Y$YkAXO zbX2Dr(dC?}A221D5ij6z4Jj)g(`1UH0YL_9U4D&>{{ zw;@tfNL$ij7?J(y918(k&87mXMq8q|K>A8}Mde+&4NHSuXu%VBPi8}EX7R2cOiHN= z3_6H(YEEGO3q=l5G%1ZLX1bzFst442I}z|qDJZPvsr7o5$reVETsc(-sl3OJ?zf!A zC;>G(;eZ-`YEp2=We|CGiOy{FTAZFT(BuzHT}#-c5lxYAum;}vNq(Ol0?lr~@Ef)x z)Ix(PS{L(J%jXnPa&0Z61~&Omgvt>Q)izy=Ufzs!#V@18BSYuF30h&EQ=YS_6m``= zd+i5`@{_*)!EDlhP|TMMG%s?(n`3FGDFH_QLX;cP3@4{ekV?N;JA_O!a#h7x0}nzs zk{|-xeZbJIP{qA&*lj}{e;S^ zdA@C_6-cAtd^ut%#DckYk;Q{6llj8SN~sG~iVQg@pV$vcYb@CW8TaNz0PCTbOS`^S zwFV!g^3`B@B$!*j>j%&aWwOyQn48ux%q(XInt)q;ojIh55-3QFN^6%SQK}hr>Qt+v zNt_P^WYtLp`x;~wmIGnH$$7w6%bH&ZVea7r43bEbiMEEhY{Y@tngLd96!wc$!Qy|I z$MUq!8J;+CsVshThGz<59^h)2mg8Rd9F_u9M&ufFOFH3s&6#HX1r6#n!q4!t&Fy3c z?>eOBOO-~zmb7yS`Ho*Yr4N~1OhY4rp{r<7A6s(#Z`v9Bok5`!Km1U9by~j%=wz{( zx4F$cSMIBuETe@C8A+sx z73aplz=Z=5h51$R=g2*Ft$N++Vmry)vJMIC*com2#-m_3_69?DG#ClMb`Z#;7`z}= z-%E0gOcgy}(4@B*YigMU6F@^AYA$|N5n&Sw9F%}8*`h2*j{35gePp_z1>vo+S1@Z> zV;LC=a(|1Xwo|{R)reSIIDP%pE%A0aX7H7>}`|=op$l8`(BVdo7k$QQ}G~T%76I zP(!`H6l&N_O5;s{Ep4ydt(=`hg4q8VrMEQPR_h#uPD5?jb!=bLV4w*T1;{dE98uy{-1p55QJ!%Ym@MW^U!c^loax4tq=8+@ ztO->jNtcG|(~Wy(=8^TJleP@*I&M&tzRS~$x1^zDm)eHhy_$IB=3|np99r_10=qWW zP#7iYER5?xiOJ>~^-x*IAy+ii+Pn+S)0hM2jM1tnYGtRHWR?yK?Wktn6fuc6bFlVO z{oz3IPceH1aZJ&Sr37xv@UDn{rR3+swOGTZec&w#dQMFls9PGEL?*b`^t^+^2%Fqd zI%%qxX}DrDD)E%K`a-mrtAXYOn`9h-wuFvolEe+HLtCSU|5AS@M{NSIZQMjRQO8>^ z>04G8iaM!D>t#wOyqZOMSSRgQ|At^kM|AzCXeM$j|GN65Nj;OzMY(WH2qILYx`F}q zmIDw@F*Z(&E8siS$eLTFp=7&kKbgXCtm9=L@kA%UC$JuBa?)dXlw#}Nws+xFj^YIB z9k}YkE6NuYJvWEWP2^Us zJRV-T(3PyH10!^e8;Sw+x>U&?W6^E#la5$Ra|k3qx~n4TBncE$8XU@T;%x~T$$aV- zwV|tlsX9Gnzz8(ZLDI~XWb%%6>B`+QdlXUjJXn9qmr^YJvr|WKW855TlbR6%S@?O% zG|AH9xy8Q@B2s<^N+Cj+!-Om=pK%5Hx*D>m@Ri zUGzyINoiiG+E_#r6%`GsW+D$YCF3mW1Xpj`N54~^OqOXbt!ruNjNDwqg#~yFXCp;eMM*`T5@s z8~X444GkwXG8gYkufCOGq?l{CxRYJNyd&8lZncXy*VV8Ujt<6Rk=D*00$D_anrQs6 zL^09hWqjQS>pUydnv!tw1zkXN)gD%^57#;#q{rNn z-vg;)Z7G-sQ9Z-1aM!l6iwD(?d0A{CmP#KCPfG3=~Qw zv))lxG?Ca>mzTd~m<>$pLd4YQBQKpoasE8l89U#$&8?p z83A-+6cr2QC5$`_$$Guz;mP3m_CR>T@wooDS(UeM@5{fOgc1_Ms9^#&_5SDO3oM!s zw7zY%fLf4tA2_%%Xnx2j-%bh-FSts4uD>2^W)^B9xb+V7rZeX8ql8M~GgiiobfWS0 zq@rMQATvKbDL#`E_U%ZqDPsDg+6AeP!;1a<=)tKc`yO{CynLEk_(}z}EAQhF%l-00 zfV=C&#dMQPxXoccywd1ceu=Nc{=H^yd!5Z3E=$&Ai~@x^ET)*Q&ooRNil5!~^z@Er zC*l)_83uHHhM0Bs$HQBapZ8ftj(!nbA9@7G-zS{w@5_o%e?X#y67ZBDvNwglXyh&=fqj%Xy`6(AtEYjh7 zv+PjNmjep0{R1ed2762kodJ-DO&a_B#qfycfP+!0X`P9;cdh({wCQaiR!uNv{)Uv? zjmN9fgF!s6q}vr9B`?8iW_y4zAP!5pEken4js2Bq>3$W{JF-*qD$15Y&r04G-m5;D zo3f*c@I!w7ylzjY^;P?;Z5DdHQvj{1|60kwnU|nDQIE%83|d&P#@b}JtX~Bai5nXm zl5NOY1<{5Gzl@A*wAOadAWrKv&i^oLWKylA+8lHv>wc-Ve8*X7?H~H@4?vP~`EjQj zUIKXP%igygooMtQ_9H7kK_3v8VL9DX;qF*>xZBM0y;Xu*6><_PaGSEdDOe>B9k_w($r?SI^(qgt&4iosfn4qABtiO?xj z?^7zXx}hYrRPQZ3XJ!gP3lN)UPEB>cYX?N<&mVUstd6f#+N<=BkE-_8*a6oPj@N(mas!H)1fGeJezpYr-^d7)NdjZ(>*Bi5zpVOKj7Azn5j*`DHr_G9D zgePZ4g19k++3{`lWm( zFCr$A>NFO2mHb#0lPnuJfD-q_&iwuPAfbZo!$#8N`upNG#BIFdh6oQ zBOk?oH#IfkVJ#Hm;Y=;vB8>X;Mz8_6e>AZM)1M!Y#S=O*T35cxb~(YarV9bGr0dB5 zKp7*<0TOZe&{lhE2ylDNk@rbaz^?nSn#_jY`B%r5Z~x+69ySM_b@RVND%ze4A0P+| zg;kRi3_(Z3t?~Sx%|oBTD?b-k3K2_iw1WEb8 z<$!yHW4!$;MCOs{+yEncHxC13AhHS)h%Y~dZO5@qVHII{Mx1VA?#cY)C**BI^(D9< zZ&0WXD6Ss67M%2E*CCAiKh5UN)vvGM^gfU>i$MqpEp63k4=Hi8J@D_D-KF}_=p!(I z3`klPh1p%xui#qWd-9t?vQ0SM2u{{wkU!+(G3^b*jmf|(P1)m3U0Bn*huM+JZuf~R zsJEd#3f-o z6d1oNhb-tyTYMW)7yHcD+&Q&BJg%Cbn!rT{al{usJN?0_i=x}Ygl2(r=7H&qn9fWk z(M8^gK7W~>QE0D^2iYgpEC3_|WFQJ}gdt&uind-v7iVvxtsR+IN+zOIRj4hk@VZHH`O!Ny%=zpc7D`jJyaO$Jwj;*Xu@MH4fvJ(=3*`3Niu{X< zZY|uFrGf5iH-=$DbhIZe!yplOB^va_5-Eu$A^$|uIK?vL_F0w17kb*SfaZ@uN9Y~| zp9IUWKO(88?V+Z`KX2NqAIR_0c?q$<`C^H}aVea#g5S($MmG*tMz@Bu_$`k1w;{iu ziDz1Zxtk(Dy3gE^pO@S@|LCv`PFltihvpiFoik?T-sIRG`oC&*xi3^G$Jqqp`=|h9@qM{vZyI2%Y-?N2oVNHG)2HS?6&H(7)D-%B4xMLd6iY`*P>4!Loh7)is`r? z^FN)Rx$*tPN~pC5j)e8FHPWXdSB_y-UJ!4V{X2Lr_qKm*N1&W^WImok^tAR-D|gs= zL~=&Wa>-WT>4B#*Rey_%qFz$J)AL7hLHcCh*c|BmF!Wq!wa6r7(^Lxfl+HMNS64xT zl%KCb*UWb2M8SZftON4P#ce{@S9ykFe*dNZMgN^Y4g?{LWNi+coF`5bO>GVv%9;?R zdgdBURE<~T{Fk1fY~&sc5O4-eC|PmD%GBZP8`-xR1Ao_kS_|rS!iI$fv*(tEZuUuE zzIkT&`LLmBql>Cr9w_1Z>JW8^_FN+KcBzpLZO>kSJkSq;UaCY$zrVRU<~`>9dQtk# zGBeZ0A%o#npy!VC!k zw{T{<8g-_uBizpt?&v{#8Y!Pf${uBl4e`PD)?1z6=!E9e z`De{)ryqfu!Jzo8P<&`e8L(E=5nAkNgxaD>w89jun~kL?WSeAan%`G%T|NK(?G?%T z$dD$|l%4(nKb5QRDR(NErn*%ly%MF-~@TpqlIUfyjBseD?eq@K& z^|7Y9M<32sM34|}7%OWREW^b)$<=w$$OMN$TDW5o#``Z74aeJ_Reeo16Os{b-;|_Y z+|yEC>rW$)>A~4R+05vWY&wO43v3m(m8;2ii5tM;8cok?O>moyTxX>w9^Afgmg0Ol z?T6zZ3JcdJshCUCGnlz^lychnYKAL5DJCO<8QC7!8)}p)u*Dea_v~TpNz2WtDax`8 zP{#SCA0Zy-$Yr?z@!kexj-_nOyiDRwdsWh1il>eTU*+L{7x$_7N`i7_Z*B^QV|7D6 zvSq9NQgF>oqpPi*TU}PJvoFfn$q7jZIu{~Zw+*!qDQ|m0@S2(;BkCJp)z?O_#kKpk zyUCmo#ttqlvorE{VR%DkD2_BGc4o(-rshlnw_TslsORT=2&(_)>_{BSQ3&yOZ6&n3i?wNDrv>r=lT+L4f1(iIaPn{7~jq=-3|QdZb4l<4-Xw&0?ltprFfHx2E?u5!kWK;?+CaBz$@kb=xLkdnL=Z2!;r=bAp{-nI^xL4c% z-M+PB^OY??B95Ot?MNdP(n)zfo=zC5mojah>gYCi*5uwoUaBdI&QjA){JuONOIo@kHVJ zsgn%z(&yHW_2=QSiRZFbhb|G3X%;>DoT;y&KH+)Lf9q;xmK|h_zjoC1sce1^;PEOU z1G`?W2R@agUdvvP-x$Tdn1}!pp|!F9NpyPj#gy16ka`=`?ctA)&!%5p?q;)k-40s1 zd%IO+l?}eUxPq_Kj77W%FpBpeVo)xV6NONRFBVNyf-;R@d(2YvQBbGBmy5t`iv3 zWt1^TV!($7PPX_0B}ywZoSlJT3zf~=T{K6{*DK^PV!!ex3Cs)c5z2n35EZ{nNqd_6 z`WyXnYq*PkrGPUP@5Zh4=c7f3s82rV4Q6(+UAf)&?Fk|-uPmJtTNoG?KT=P1Ftm_) zg^4vCs6-5!PH?oR5S(4SiEI0Ap9J}wgm|hs7B+?6o-1?u#TT#n;gr#$rqHDuC0gbg zN8F^jzQV296H4pvzS~la-hX6fV;1tR3(5OP+}^0v-{QZ;#0+|;KPs(bAy-P zn+L=uQ%yP7QO*u_wpa($;ceCSUg-VwfnHJ=GL>vpZK}i;UO8Bky6tPq{9`V@Sk6rf7i6$Jt;Y|pQLOgrf-WU;M3@7 z9e_miFmxH0vG&5rJe4&N{MU_}$AF(P2PERmiOr!=er_@=D1*lZrKO~Y?hlO&QQH?^ zLdN=QfR~P@pPlXk9lyv`N>NYq@m$6C;^Fu~OI(av(4M``(e}>eE^wDp3ui%llj?@{ zv<`%fi89?c+&{(F6&@p;_?o}quhE^$0fN?WgV>{~U8xrhUu~}aThuU-tm~e`V8!Ky z6M2b&vBU4qEKBkHMhA2N5}`A9fIm0Tx+{)^g9As40@)kaL;Sy595f|^N8C9V-!i0; z&z0^d*W=X(d^Nvn2g|I=b>+I{D^Ben-0B{oeinKb(!0N`YEN%}B}BHm1Ee+pH5x1L zI@jIUIaa-I3OXe(>Nwrl-a1+1{J5OyIf#dnpM@pv5)amqT(xqTZC+f~nFn6iM2O0> z#0s>^oq_2xoKZZ@ae&nb^qJTbsq^O{j=R&cA1{FfS~4)P2mW)Koi02le|OeQ10!*b zgpTUE?jKOZNnPdsH`>Wk{pa&lJs&Xz&v)maOvn-y%d+LxXN$W=3BX1clY)A`)^N$N0fj*ofxhJ`Fj%#Na7rXbnFlgihKr7eiIPpcvbrBwg5wX ztuE9t-SM#Q5H0W-D1H0UR19cAW(l+;eYx1j6M>V?9TBn0pk?f5qEPq0lYN3R+J1Y5 zTRWo3NE4`N978gEIcn`qCL7V3>4 zp-5;gvj&EQ)i^2?3W}geXl2;DiiiNI29tEM?L{OKiu*r13*NbRV>c3rymN8eqS(3p z26w?jA4*br!9qf-q$+3sb#y|JVH9OpV^|{;2^|U>f_bXJa4Z}Y*=vr15NHG#f%N9K zp}qW;o04(alpWykZNTd3xM9*Wx5#!>CAJs_u{ zW5>r21!rzmQTuhIZ~ZD2;aPYXu^DoBPoRV4f2fPw8}j|!0m;XJT1Qi><_vbveSG z=d;$T`Hh!DU?QF6;mu6gRcks3Q(KE_udda+vh&S_*<}3M((VoYtEZk85;lBzQaLc3 z-!$-;6`(wkNUfOho6!f~wfVytrvmG~oV_3|^ZPVs!p#pSpt%Gc5wvbTol|deWoB-1 z#N7tG=fzI5_<=d!`SnUR*N)e=KwCC74ilW)29(r{UJFiowdWwl`=4g>cH!GAI6blX zUQF!$?cA%kt7=L_hAr&Hu_h7y~-Sw{ggN|8*~#tF1K+ zT(mwit& z`(IvTGJ~C#2+Fn#%Sd7|g^A&cZo5Xi&MIa>6tm8P!NWCc^<3WgsR-P~{$^sEwS()i zD&v7IEEUx-JvFq~XBrB(8R~Bv-`>-i)LGRH{^KLqn%|(I{Uz0ermCXlR^^f8A&N6- zB8f=p+Ktn5#^*1$Th~v_)z(eTi~F_&rEqW_RBjk5(1+{p=EDt@EAzBg2^t>O21tap z3V(DI)`Aj#DM`mf`Uj+G)C;1LqsleX-Vdht7xw3}Dg&z-} z=A1_!{TQGY4z^wxhToCg3C)2aVOhqGTBIG}r`oY6bQlcz1$u&xyqnPLyovYpe~D$0u+@<1sU(k+)fO>7K9q}njxJD;@j zj;GtO%Ma}F-Iwk^q)&^vxd&kU_&uUs{~OnEp4U2Dd2#lI!}U2m*}xKKj>&4x|1M!g zk#tqaSbG9r@Bbcv$4_0WqS#soF14{Z-H8S}jeU4Ol;LGh-u zd`X68KlDi8L+?4Xl|nrI1Bm>#4OpLh63D$fH;!LVI&0#_jw^2@{{UwNDelM! zqV;$ufRT>@?bS)%$t&Ck_tAZFqwaG&c2y_S|1V%_2vGiK0U2Yfk7Pl7S(be{)7r2) z7dPzEzp%jRxJI5XaMwROKj|rl)$H_Kod02SS>|@UV8iO1T-BwiLuYHDvX6OkeuWLI zNmq4E;}Vj&&%30EH(rt()SU#kodg%01UH=ouPQHs#Bb+?KIet4-mAgMZN8c2;N=Y) z04LvOYV{X9cJg-Bf^#M!D+;a+N`}>S=}RbJD`C;H>(Kzp`y={*cS+YVIZ=GMZ|C;V z<5a7^pgMY6-g}t01Y2WOacRXj^vYbY(kX#!DdTHe%J@btWqcQ}j>R&khHFc0S8Pjs zdW# z`wF};>IJ!%8+TPI)~t}_;GOdFeHhz3Is~TMLm25rCiHiQ;e?R^Zy>$wri+gCzH&JL z2mL*DX7MNf?0o$%06caYIaMjVHbrn>rHC@SH}+NH&FX`Fr5s?~Z*)-sD$}w^5y=+}g@EGzf}T(E7$XiQK;39HAC~W#pV*Pl_p@lpwf1@{(}H)yG=Ar*h53&dhprL{6Ap*f9aQK7 zT~(#7x}nKs1gJkkb_VhSYGbqiBlx^q3fgo=e^j*4-x-V-0FCWu%nl&$9AjEoZO^UD z)p#XVe*VkHuza9)8k>SRL+}DXZEOY-c~3%T(VQ-$o7XN-3z}|ox~l1XUGQo?KL{=l zT2I)24l}uO$IkcfSD%DnpCYt6Vm@xfH1V$5_s6zqFZAR*7=Dzs|+)cG?^>_Cfsy;}6eD zzy8g|Kt3>D!?oG;axFc*l|uI^n~0k`{eyqM7w!VU#r;8x$ph#1u}oKzjB?xZDruC` z^v$@Cg%rd1|ls)VVP7{6~q;%bc+73YXNAX6m;Qn%V$RxeW2e#NwM0b*+lex)@>~A|i!&0M;sZgQ;d^aJ5f-LiD$STSi>zX z`eyN$(8!D20VyJ~la-?R*hQI26VJf?Iw}$gSj6v;1_4}$9!PUtBQ`zEN)kz!ZiV&( zR#*mi-e(QeOB4PA7Dv-+V9N(n)m;NK0J%eDYO{7SlM2DWm_H=LZ0FR~L4s%Sz^(xQ zb0Cu`JD{02PQ9u;wnRqu=ChaBpOZjuBEha0<-@u{ILK&QWbc(HOT==-6i;FaQXjq& zVgF3#9t8ah=_We+MnWk0OD6`tvN!&lXc0PKP@!t<8M=Aw zM{DTx*DGY%CGA^}9+l8PUY86e!IK0cBl2|GIS(8UD zC)C*&gWxK%6sDp}4P?dp=g;(hWe>HgB8%Hm2Osfd0%2b`rF}3;BI9YCqex%<+E>g~ zGp?t*&fSc(=a4+~`zsT1-H92ZAgVfFf>vL{foVw~`mH|o36 zMr$Z?q3iBmGj~BR=$?yR@4?G`?&j{>_ToFavClx&n;bxlC9=U9)^G7yTksl|!wRKS z!!GNaNz66~W+yr3Cd2m*;TQ2s*gQVnvVR|bKLl<`XxKjqs5y1UMmn$U4*H}O`X@c> zMc|jMm3mtEXyA5+uDlH_W>m!-_3xe8zs;jP1U}3V=B*&5t@LS+^HUGYma=CgGl7Be z8-Pv7cC{xbJPHk5TUVCsUU8)e0GQTon5>BnU=>^{hRRlc0$Z>}7)mT=H`6T$!UNLK z$m%qf_@H#fYy|=A$wkp{Hn!#m3K`u40RSu-f1VaZuC?HqKy9m!TJ>z_(BsNx!t?}g zV4Et3V5XmqfPn1DW$aXs!-RAp)l(6g6lQa_VXA5=VR6LRnx1J0-ZzM&odX%+3%-=< zq`(65pu_DMs^i5x1e?O9$~N~E{dop*w5pIC+PCAZ|2W66Qex)_i~_Of)ae}xG}ExI zK*=|%v~pOQvZnwPV?|E~7|2G%jozl`Dryah7DeMmZJ2E1O^`iFr+__iEf|P1>5|An zhNYsQ8XNV_z~_=5l*^IB{BlryY^v+1WhR#V`P>voizX_B4U)t zoqK!?G?mX+4aUQ+?SE5IF^a9`hV<38=x*5&*nk2Ens0V&XI_pq{8YVIg>-1|SF6B* zAyqtXX=Vq$w6~`cl)00j0D%@{R66SD#6yC|&}Q$lWS%~x&DrRJB_C;;B|^AdwG&b5 zN>OS#VyF#G;9-Fc9G#54;91pX?=TVOP_J+HLU1V6otNe!7%jbqk^QXCHeG_oPxWDh zxz2_;sl=KJq;sK0rKO3VJ{Cs%$dJ5g5KR6uahh84!w|eDE`}>O9L=xcfRAwU^bAoJ z=+pfa7OHBweVi1x4Y%0lpcgk{k2-IJ)Kw z64D^vJVBbW|n8TKJH`+`n!VeNs`dUUKZHyY9WG)>q~4X+QTN(q*aRF>H? zA_DK(jvmHt(>_K^f=R+@v!Eu^?9VMrNX3MeG7z(dTOq1Xn<_#SqAQ?MD24hVL{~s1 zzoGAH=^|G-T!Sc70o1~vmFa^$Of*z+&=Z4WY)6Pl*932rTu_Q|CyzO@;Ez54%jiT7 z8_IHZH%|o$zgY>YG_VaxYG(@Kz|RbEhpX{mCJ0zOKa-7yi(uhR2v6(!?g(|dW*Fj< zl*!@jh-N87op$_l}LOvH|yH4Rn`(+(ws`f zsPqVf6jwk%aLm%V^KNK!{~E?k@FaE!1qjg(zcG;@eIu29bbZ3Dav0lnmRNDwjCC#x z^4&)am&<7JhTZ9e=lG-^A+v!eJt>^ytKGd!wCwudI1D`09(sJEzcIn1o9o=qm-whJ zPQaX#+A-Pv;8Rj~FM|Xmn0bTl*4U_l?J6GDXV2qbI{B>*)_@hDza|Au()6X2^M{qO zAiw%qt~BL_`O$3glT6T`qd|t3M%h2wXx0}WMPiZk*f2UXKC%f=gjb|}#Iip6J)58m z*<&pkkA3mN9=7v+2VZaY@BRAM%=N1;o;HpfM2}ndQ}>$-@<+-9kn>jg>qCMjvt3lR ziP*o~^6AqW+tD7OS_ME3377Tj_HqPB%x|do7pYoEOn?A4&?gqJ$}r7psz58TvIH zJG!eHHxXuSze~JDksshf=G`mU7V}5U^r|_)V8rlH`#s?=F$q#$CdpVgkqaymiqzI9 ztx$j;Tya3aa>8jhK?-&C=;T&7oYJ4JI43k(f#gKCSlEe23@Vt{5%y0!=a8fJ=q`Db z-K~C*lozJQnrMoUC|W6)aFe~|ST7F$l2f(Bk%qUGp72CZ|Ao%?c9$-Fc!IezMkDXV z33|k(JBEnqOL+7mzLjaYH=;f@6!ObKZu%-qG|2yvjh=<>0c^Rb@8Swd+{()pBpI!E0B^(DnW zXNTvdc*Swn^bhOAsL_DP$_N*BvuAhm5X5T;+0#jL?uOuK?eLc46q{p^+V$gPFT2b~ z>MO9RRE4KS2)ogj{Q+E9FBi^kJae`Vd#uy-hF9w?+vM};PJ*>J6mtfk_(I7(noCT8 z=b`bpHNd$JA_*i$&9jT;(Voz&G3&^Wiy33JZZ%=Yl{iVbJ+iIEIy&Ij0^(zOGE|=%X0Q1DbLJ zS8z0#5W3Pd*hls_yw-zdtQf`

YA*>d%p{w_vi>pt`M=G1lR!r=2zF)S#EmB9kNG zQtjfu35@P%Zqm@rY5`qon`9D|tZj5xYEV!IBvun>9)FkUVWX9JBcmd!i`jOy5A|@8 ziPQ<6T0X-~H;B~){j*O-9_raWPjU0d7NGGh@mIVS>MccgYxSv@*7fzGQc(o63kLLx zmO;?ah{~RHIEbpLQU#ksxN}pjVq)NPLV*tXB#3P5R7rB2T)k#SCCEq54L4IW)5iKK zeRpELB?!;|<7zA8PAIhT6w(a^@+Pc*6a1K`rWBz~J(-D{usL|c{`qF^yajB0GdgeZ zqZ>16u$vF&(C5f=BZIpDYWINz0@Zpyb50s0mqZRA@UXd-tP@2H^`Rc|iJ&CkV;C)~ zX+z9v*kJWLDHGhvb_z8vM*@gAeuPY-A)mS zjZVN(?ixAiDsmV--f$A0D&)Q7AZlyrs*Vjg(_W%@OS7&i33^J`eWzwUYY1-((};OX z&%JFzjkc&%|K^0499u8$D0;MoVh+_|Jd>01>>yyRslur4X7yn?E-rhC{3fnu^)t%x zMcHBs7?mORk4!jk@>o5vBZuP;&%#T!&0aBMWzSduG_<A+w4}bWQxYY z&bjmOOf3=+5E9vER9M%?z`}+EwUHtfGA6IjUqm$Rw~*3&U?Ay4S8XRz zcYpH(BlBJJwbc#7lPI;T2fav(@2N97OfY+nQIhBNg^YGtN6=p28Zp!gQ@hN>Z0tKNFqZ z_lCc&V>?Sq&RJfjQrjMQ9a^NMAx!qP@DNMggN$Fv+jElWdKm?k%z5%yw9<}cmHC`1XI$) zHWEW~be;yN(-?2drK&P;A(f1q#chL!=}*HQ^)jfw{~snAlAVX$a@(&DuldKrmuxR7 zQs|U>cDG?E+;#}fT0`E}qp@c>d4SC%!@VGLhsgP|ph9IqUKMQ|syVEy69yz#5Vn_K zXLB)lg}3`K3Pw{O>XdMO(GAU1!ymJ^rX}wh!9XMWdR4bC6hhf)@K~w$6|vgbw7ZBu-nxi4+~pQQLYPHXxtNbRNC0(rOq^+ru|M8^&4QsD5u#N>kgUQk-Nb3;^eqogql4kXg%hD!liJ}fwrmAh;t%gt zS6SEt4XQ24Im5?{3G(U~wQVOF9=dC6LaA=7Lc7znxkj6fRz+vFLU>bpv4VxQ_9DXY zPGdv!oOzhXGzli84I-TtKB2Vf828%<$#AeiPrRt-&23tp{@e7&38LRluPp@CK1$w> znii{Xs2?3ddtbyThFdF;yR?yYMUObI8NAB3&!i`Qhnp>*pzz7cC78^JgYL)L>;dv2 z<)>1puczu?f7HKBaPSM@D%xs({2LE6Kk{)Tc_(iBYLfg!^(>^v-_0~xO6SGX> zC>G?_QXyq;3)*UY3Xc(;KT22VEcrGWPTvECUgGjZ zn6WCwUw2D&Xue;bF2_N8d9q$k7XqUFKJ)$t;ama*T?Yp%unh5rqI#7xny29kuDF=V z{fzAmt3Z!UX=@@sHc(Bz{4KCZkx0_eKUho}UxxQJ}SZs)e zXGet$qSXd;j))D`3>%D>SlQspVDohGXd+Rbin5@L@`hrQA~aLN1NHx~c$kNu5gCNq zCdD3qzeo#R9BD%k>{AM5*;)q{CWws$uj^RQ1~csMl&Pn6uI>r}*0(h)>)dd0Ser*x zP;KurL?JqIg-f5L0QJHIBH#2fhW;*@2|zx+bR%d~)V&0&nu~r~dlwb&YBg|*M5r^W zP9t@y?+&Y3i?l(+rEY-?e&UA^$>9=K%teNj+HAx;3TR#6aX`JaYUc4r*J+n1O)}i| zX{}TUYlhOwTynIs!|R@S7bYR)gKP#Zs;1sjo?I(w2Cf(YT_zeva6!k5@!0<%v(dK&=XOMhZJ0KktE_mkgFfA7%d zZB&A25C8$z`)o1+*ydS}HvbTk%->Cw`}Ta9yE!JA5 zYWpAdtBr^eh%)xmFnlBoBMntonbHAx#9hfTi zU0LtRYlHQWsTvk2%XHY_6Vw+-{ajcxSKIx8b`Gunc;dbgY;WaS;bfJrwBUj&Lr@Wg zw#STW0eL0JYnqCi{H&}HrA^bE<%7~nlwa9`Vo;X1y(3wjXWNgCUu*56HGa>qIQWG@ zQ!u=>aB5_`pBdBPq@dZUs}-_pM%KtPshrVUsT&k2eL~veB%v2*>l3b9OmpnDmXvMX zz?^cWZhv@Ge(2P;%Bc_9`+E_MsiT>j(*Bs&x2fs>-E>UJSrn<3SZVza`I-f(iv^BM zsr6X%V4Am_5LDGvRm{Jd1XZ5$W}syql(Cvp_8(^U0tKzhw0=)@MQa+{HH~pbLt*kp z4C{?rO^cXltWZ6q%^iQ}t>f4=DtJ_@9c`?K7L%n_*dnKT6l+^|s@t$rx7gBKerq03 z-Eif%cIc|p^F?)0RgQ+9q;%{dT5ho_L-NW~S{WLugJ9um0Ps0X&!ow?OIA<694T?B zSGpQ08mPCd-DH|~+3;WHXsPLJYQ_xo*8`Tv_{)p^o^al$`0sGd?SqO+9>|-30ATE> zXE9KmC-SmPnm>X%N?CUl+RX*Er{<0Kn%f*jjU~31FmB`AY8my0y1JpIs(2RFW4wCJ zXf1B$v|AfzNNK-$U>*f0ZsbBpD8|9#xTZEv!HryqWqpaOgEhzIpf%5aQ?ABYvy*|J zP;1VHwb#;}G7QP=Z<-;?)6=9m>zwsw00V2vZF+Eh8E{`Sm<_91DzkJ@tSu|Bt_)yc z;9_aA99jRIDmPp&m?N$kEV-!0L>R`h99wl{Wh+a$XH$c?hH%~BR5>-4gVH*|+j@@q z{!ypuo@)fB&2@rh$ziUaTvu5pSI1LS%+Kk2VAsvqw0k`;tul!T&jSeLzPbrSBY^;R z1RCU2WDu|+7Yf!kfZGAvkq}cFMW|)LNR&WDCI%x(EVWWHTJCxHw5gmDtW=rlD&(6g zPZgXCC(fMV6iStPU5n(59i~JU2O3xiMV`0_UTM*sRGXthjRmqf6oFDxRHzbyXpuAD zr3VL|5EH1B4_-39;4oRjgLg8`J>pu~!`MzG#SAXAyrtd)W}9F(dswYEsU ztb&&$Nh^^nQkY*c#70)9A0yW2zR4#gvCKZHltn!ooQ=~9!E(}G8O8SY4_vJI41epQd_;T z?D)6WRmf-2w>@J$ZVUYLSJU-5X~PF^C0KtH+pTJA9V)A+-s;aQSvrVwkz=>2tubP$ z*e&iACy!DY{%8EZ1_V3;{|BpTGQt5uRsKWN|3m+?V&MOQ zqBWBa|3~?Mds2WlzztyipL_l1)BrVr9l#dg1n>rY_%96ezgatg!+*>bU6Z|jo|GzT;Ag!aI`TySJe=s~CF$bWk z0ZeERIRAd(BY{Xe+ z_%u#r9VsDQo%NhUr#oXVwlZqIGdZjc3OC4qF|Ov$$*~|);1HcHY=q9e8qT-p*i4z^ z()ZZ9zm&mTIOpx^Qd~(QjC2>3NtfCuh`{oRo3e&0X5S6ia0Ykf+@34+^4ieZ3rq#- zf!l7ALdJG9vLY{~ZMykh*@{8wKa1%$Jh_lilX#jaAvZlFZRbX=y+TtPNIgC1iyS=SWl18Ad4O11!Nk zCr7|yz$8^*y==c_fPM#{0p^K-fByLT!3~EPKRd$bz6=oAmvBWy3Ttkz5e4$;*&3?& zeKvno`3t!+VrxhgF{_cY!I+Y!48Ag_MmSTkU_3huM5sa!OVQ;>*wNx%>b`e$jncXT z%o}~GZAAG>L8l-c6OIU{J>%QvHG0LWw!92U;IgZs`P^(o=8lq7BN;-;hswWkz8!#a z!!vBfp6X9Ip}N%bY&0ld4g1&RpQxXL1ur4GiYs41+VOLnx0j~;9eyJWmo|PQzZXJ4 z4i$Ij=;@O2qBs>{Zi-2Rx6J_^Y*Mhy(gN-Fp`3)l{8JU=F~b;!ao_dj&!2JkM=(3e zUw>3>;Ynw$HiVsDE=$jkqo^61nUDWaA;3Q?6?Qb|CttaG9M9CL=2?1DTRmPfF7bb% zvN$m%{*raiG3O{((JpP8dCnjo*)t)4P(h|kijS}nqrab%%ryJ_dFE@c5RL0Lc8u$F zOms6T^$ec-B9cxXpO5mFszWT6V-(YFzNl}1P!RsGePf`uLr}fam(PscEWwD20hf`$ zE0Xtfnbr^UE!BTBj!S8JP$SYz^{9%4MfWTl=7AVVoed+bs`65DmLEShK&N{D1d;cmNp%(L`Pjd7`$+m1begmm}DN@>7M;m8zlyIVY-mph8*^A+A@Ye$=vKp z&UXF7xBdO4{Vt9cR`rrZZ8nl@ooFY4CY+TiD8QECBFv3NT#L?%5{Ys|0OZ<=drAE( ztEU(o4t9|#`obv9tQYD#UI;aUI5j$r)>Lmmu=T4m*>$^qftEGjJhQ&N@4a!3Ta90zAME33@AuR|cIz~Vb%?Mq16=N^#WfB5YB;bP-d_hmxnT3Q+@4z^qUyB z9v@bGmpVg50!vDag_2{3Iz&c=;{x>LSZeSz{jFd_YEfwTf_LddF;Q69c;!;BizO&^ zp<);)E}G{QM(hFf-`Xg_7<7B6-(;EP1;QWFL&?O$g^?fekwQ|uX{2SoF%VZ?rr^-r z##S&xby8vA4IYX%G8bw$dMP0)F=hwX<3a_a^aNWv!l{ZF>|2JMy!&$R6v3pB5n(72 z3KH}y{-L-6^DX0?v)Dyl z>2nwv-zmlr_m9_>!6?i8K40Y?TKwIdp`0ihpo)A(4IQG1G0?<YRs{rAf=A>oxF6{=Bu zfz=XuK7u(k{9=;a`)CD|}XI*jH&sb)%_t z{7Qsc%H7)D)Gp>{kiU1fSqsLJYnPBM&zG99_o zTLqgQ%&MB%L%d%)^tBVms2EJ8Jssk7%RSUe(LyPaxDbYjGHC8eExlZaR=Ct-yu8Ha zf1(tk%xUJ}9k=}UuB|*oaCE%(@~fl`Qw8taMTRZPV#W=1_lS#HmYj>6DpmJeO7nDA zkVR$zzboyp7*qSeu*QqvxSit7)sECQ43_)}LqTzPl%j$-3?n6BZ1v};`~1*3Xm{K| z6p|)4KmBlKybr<^(VC7wVb^a|y^?ClkwuXfH&bchq1F&t%QaN3aai}?9xCOsE-r?x z`wEzSoHOE5KwgLBXIb0~B<&AU-WUN$LTVcpMCs%3{DNb+cJ{yRN@Ls<<@a3YL?ALpGI3&eCAzsZCHu_ApHY# zZrbh>;%G^9JhCU7^SpIAfuXlI`phqP^zjgb69tzCt?ASg=3hA-0roSj!a6OOZCsXN z;Yhe#Z2C9F5xV2)48$Aw6ll$;MU0kyCukn6E}|4&bwe{|;{;7DN%JYCioe)cNL?C{ zSG$;{0sZ%%09KCEJR}UIiqd-`jIB~p#;u354So;0=ixSp6GQ|Jw){=aNPaD;>DyxI zarZnqRdn!(hJNaBqC2;6pdxkA9EVx-FP26nL~*;*^d1A?Z)>X*;bUc3mehCZ1hxzE z_{6;<(4gMXq>CXj()p5oN?delkoWb_M-Yz6^hjF6ti25)v9Y}ig3Qjx(WEZLKSNI8?G57brygUaqQNnh*C3<%ZY{p`I1F2GBJY+Y@c<+E?NM6#hv@ zOJ`K8CRx+skces0B}kK`FsG5-rHMn5NoYZT@b*h8C)`^| z$BNQ4s@v57@-fc&3&Wbz6bc8M$2@9j2_Va*-$JupnQVGoSwrhEhR6Eh1f~gu;MS2z zYx7c&&5^+^?gdI&c?E_Rrf`QWGXT4G%7vNvSa~n~O`1TjU&c`JGf8+P$!i=R+23Y~ zI16eKlJgsKLcVH;}AWl!D(K?*)j*uHr#_e#eoMe^>P zh2_BbFhF}S^`ssuFPLr30ba}jRa6VYFEmDkM?^Ta+)7CnLHy-vr{neB1Y~b848?c` zRujC>Bli+r=thPS;zy*JyamDjSTEXO>g0&BTDJ|I@zqAm}8t*!Wiwk*XQH^u^xmi(ewlEHLH zPKSU}2{NPhxuzG-o$TQo;Hs2YPcwyMVp<~JQn(h~jdGmZJ?FjmD$&3?S0w{}Fkn`h zqUkei5okMceVx5)IQl95M+;*0DO8r)f=Mcro;!i#t>ht;7~&6=<&OfM|@dhh9l~6-ql4htYhC3sn+-7c0@s~0ql)$l*Yqx zFk<^7321k7t>TbeejE!Q@UB(B?jZ>p9;y75oj3zHHq!Ku`#_H3WPugjg*_@kpuDDt z^OX*rPn2?aK5(-2;ElH_l*0pXqI5`_W-0=Q`KZf`wx_Ygr~2q1*_Zi23`YI0ho3pQ zEY5Vej~MRg0(DD`b=#y@^9B)%|CZj1E7T;R%jm8U#bAQ(2cD! zS$wz_6Zi8~QkFq7UP!Hh$_0 z@k_0FdT0sy<$Rd@ov4yR1tVb-T}v&K_L+b#rr}>$+2=thy6Y*8gZ)ESnn44}bW>`c z|GeyH-yI|zwK-zZ6|!sQ+p=pL_CGUpSu~0EpIP^tYssecpM*BsB}soFxaQC=gssN# zwIZBspLz(W*Vz6B97L!|9>r|IpIOTXA)Dvf?9fv6{^>{BraWTYzb@4fLf>E*Jcm>B zUn0j-S!km7m6%T!#k0ER^!WlC=siFu?=!MABYqQMASNR|l~uGzOUvRysNSLGWjk(qy#}@0a8dn8{3;*Uw$5)5f060rNV582O^yquis@#8(&cr$<#cb;HpRmL! zdvp7d9V0S2w^*p^zPDoSN=U69C%JN&wi<3wifC$e)b?o~(x*?L zJ=&M2r7p**ux3qoNqT=7%jd&_0o%vBa>e9D$vv9>r(;Lz!9kD#q7)|=N%2!x#MK+h0I9SM>a&ZW#pU&5xX zSy$b&k%g{P8K6IsL@OD$>qPgMz2AvCD<&gYP0>D8{~FSA+Y9CK3zwpfi2Al?iWYwG zwX`XM`P*2_@o?OF;m3H@9$#i2CF1hRqwi{HZQB8&b2zj{4Ir{yazZvqC?P6dtPoMP z@+M4%-dYnOrZjxgX50vEk$qbRgl;a47>^5>ayjTDx6TZMtLl=NJ&@?_%}_Rvz?QZf zjkd%DKFbBS*tRuu!(CLUaiW+T2eWInp^PJd?l70nN;<$RWMyx%0Gks5qJ0~bu*+s- zae&hiHUhd5SBq!Q*q!ZsvoJX64ZF4^8T?_M_@#nx((LfC;NyV9_SV#TYw z>-L){Jp%Gi_?IybioTCDt1&|35)gD>4Em}3wxL-b)SGy0NpV(HnEGj4l9IZJXaLG% z#U+A{Y}q-aJDv1tuWHj$C1ur&%HyJwVZNyF-KPkcZGQzE^OIBvWg`K67fbxwA#gXS z`im!WQi7{S?FVnz;Gs0R5>5YK%_@$xOqJup?;~`GT!?Jg@c0OPb5li@4ac?;24yVI zx)GEpkE%I>5nR1^$g;EOTocc_&t)w9S@wRcMX^6fO(oXqgc;PI=yl2}IWzUdpTDzE zKgxOJcw{!zel_=|6Ycd^+PZ_@IcM-qh3U zBB%A*)Gz)0dO}FYEaHz@m=r>A?*x+Yc)Zt2zE@PZz zyoM{vy)EGYJV1I#lB#uUX3tYtkTk&pE+vn}a{W;9@>6~qu8ARgJb1Szl2Jad!KjW- zTOPkHQd8MtR*2g^^y+u3EYqvvpDZ-okxfw!n#!kxcedVWvN_#*hysOp15;{)dry5^coh@Nwsmd% zu_-*lVT1~WYln21gAQe5C4?1^yE;=yQ+9#FA%^-KzY#^fNV?Gc7oxu9Z{^qU_b>F> z^u+WIvMV&2&61j7tpnKYBO+ zPjnLza~u5c5S5E*9x9ToB-zv$Y%EhLp-bk^&Z2yJ=7_<0IFg2h`$~2Ocb%iZzdKJ& zdd-x&v8z|CVm-Kq2m<2>qsCvJ8rG1)$@eYt)8gKBkEe134n`%_(m%V^@DmLXd^P_5 zXhnLk!9E4Q(`ze%VVpQC_GykJpvkmGH3PL&i6%=Xhyp=(zi1bO&NFTP-(?NN-Yonl z{!Ey;2}Zys)SL3;VP3~Ox)>32lvW~U=Z?QI5oUstqKQx?AY;+fh?)dxyRV%goy%qf ziL>c&Xpj00xtiXpL=DDm7qGd?&#){ZU?owjnnoe;wbRTVHX05)}4zGCcqwM5_T*0)+0X3EqsLhGchg8!%;-N*({t*FtW>FJ_^s>wiX#`$?WFg)UzEIixYuX#Fx^6GlyWvlpMz?a+uopD z{RRAbbsE2@sJlM6Q=nq!_Oc>?m5w}fMj9;UxdTyoL*F~`->2VgcMik3V7`1&nMKBI zV0?0CmYok|!7LbY{KR%nim&ub+~lLy=*z$N#S1zUjcbaSdxN*&0=TS5 zqqAAK)-S%VO;RBXH14AGSBn>-DSm1RgR&&!TI!~d##1CF!@$^u>v*wL;qBiG_*Ml> zVUX?V181!?jlRfzX3;t9tayo>=Lp(##h3yD#m!ouMX(J#YRDui<=gco=GNzMHpZH0 zIjg{CmahVTLid}vZyeGi@6cBBFTDei1J?N{=pLO{ie^#M{p|Wx9v77yKJR+2pQx|> zS)~P^h+G`sW%O(or-#}xfAgDv^K^gBm~>-?KlxUY8xTH{_JCr2Yp+2m1}3jO&irG2kybbU}zd{ttIWlN}vKiBE;JL*k>+ z_4B7Dk?#~64BiewNl?sxVc$EbsB`J2L4l0RjPTQ!8<&UIlNwV!`ho(B6-Dge51=KP zbn@8pxLmX{GdfS+Z_kTv0w)9ZHJxZMt%4-q1=2m52Mi)&9kJGt3#rz0DmuS+x<-a? z`OlED16g@wIwg`!CUKmh96>b>pFi8IDpog(Z=v^X0zLX&@L{nJDpxVGpgkK;I8H|4 z4m^WX@9r;Ea8kPivh;V9#0=3DqjhO_j1r;dv)(1Ns7-Q+(Eh|gEdOl-@~exMjG*GZVs{>+lyzI4N;|1dn4m@M5LP!<3Q< zB8z1L83OToxYrIy$?_>;;Lzj>fe`#Lyg-#C(Yd!)_7|ZirMgHB4-~nyV(o-%~rL^1+T8k zFzt~+t`tFNnoLf$@tw-e_msy7E*IgjTk`N_ar))GJVsQ%Wg9)oLY}9-nlj5wm8Lhn z4)u;ih=Xeixz&>?+{hMB>1G#&s;~c|(SY`PnLX;yd+BDo7&Mz?8NQ!;ime2A}r{+o?Lhc-}sB# z8ajNnbr{@mAiS{hC%ihRL@`u3s^yOpjsS(>rJ=q;yHnawD@(bl4ZCA%EBN*3F)M$L zD3XYeEHk&C3bM#{*Ax=U8$c8-Gb!Hf$zpCh*8!q}nZfIfW;gW~by~M>oMz&95G043 z3wnl8zlp|0JpIx zvAi|XhIw%b5agmKad+JIy+>EGg62#n$?^86m>sn9{aOM(B2V6~*t+1gEA-dz1JnwW z0$@wfRI3TV-pn5vVfrjGfWd;Nn^pivAW0lmCGAgjE!pfq0L@~@O5F!Wkns|hxx@WzT<~c+JiFqu{4%pDpTw$@l0zQx${DMWd64hjILwF4j z*b!sW=h}u*go7TqUt$M)sG1>?%Y?G*7#jwf*b78tfhCe(tX9`n$26<&Ks05tZeg~5 z#Kj+ZOGY&Wa-T7f7kAZBfL4_{i3+`Ft1tB3J^pb$&z-D}`lF(jzyl5OK)jgHLm@t% zGex4m`(|XX8>TylJOl;vK9sOuJO)k+%)h92pb}QVtgXCkrFl_eamTUF3hWtZ&a*$G zfiaWE;zdC?;g}|#dXtsi){Ud`X~x_j{AYcrF+sAR6Z=2sDpQz=7stOV9EDu6Y)}f1 zS~z8AhYP9cU;kW#j6D`~pG&U)jM>wxV&Cg3ecIMz!lRw{+(GNIP4&rkgN6DXQ8mt# zUVL~#BJj`z27Z)1IP35TMb5r?Wm?}2l8F-o-@$_g#!|kQ?<$5>Cn3M3Hvhz5X=dqp zWRhdf^UcrXo{u&Cl8%MLj#T8<7DsARa7+V3zZ0n9)Vky}x%doik!vpvgmeTE(qhP_J&D9s1*mOfR zS>kp{wq)ttk`jr}Y1<+B-(3kU*+v!qWC5oHL*{Zu)9$&IQ57#TEOEXGua$?jS+%S6 z_4r{tEf0GDJjg@liWKSUFwL2V3!RyA7+pFLZ2TXhq5c+7r3nojUB7Y-a>Gu=v5H`U zR2*?0KC0ge!kb1aKngeVZxEmArvqmS^3p)=7cI+XADuXek$!ZrDcwt=lA%6&m10_O zo63WYFWXqi;x7;E>iX?AX~$LmD7p~b1;uk-!}~NovUjkB|1=J5RQ2nStfoati*&d`p;^mEjRHzMuyf| zjtjbrc}6#25{#vguPqlx{}wW@aT`8V_O5*-z3hY!Ss|cV-ZDd5=o9TkdB{rmq$@fM zOz@gwd{B7NrE>}p*x{Z8=?39lk6fRvhdhoF{bxX zlUiO@VN9ZP)VisM1FG+>8S?U;h}|yPVwgOvu1!5#CKoEJ_wke!$|$-v@{zQ6*6x&o z-he;pvvxS&Kl}u`z}Ge#%f+KZ>~5JmjyQ6%;MfFgT9{w*Ji&MF-+$1_=O`r;1lfpR zxs{*5_ZP1v_}2RTh-Se{MS`x~7 zVtOAbPIb;odBW>Rm8YIFg1eG>giw^oUY7R&6iMvz zv4aYo$*K=$JD(2CZ^o56N^s-BB&y0JgD0^*5$tj2!N-Axwm8^P!>HAOuaVq`P}G8* z=A*0iH#E@!B!xOXi>8+6{9QkAQo97#3~r92^rE6u!c4wa9G<);!p*O zB$7vngAjT-utkZjy?};V+Wk$z7qFCfu+!_$ADbN+fXTJL3{d)#Riw;wYHcF^h&aNB zypi}6&Yx1iA>5V#0ZlYEX*4n@QXR`UPx+7oX?&O-9-7i_3y&oM85RbrRQX9m8(X@q z3&sTG4`U0}+7@6i3Q@oUiJER(@1=s{>*AA0{c^j@_drco z-t$$%*{TWt!9SZ&P$ZR^s$7O+6Cf)I<1>VXqgkrf09%_79p|5t{xP>$1BpBtyKE#L z^QVlZtQvs{KXIat9^H+oYi4ZlaOG8JsW6u@>Hv;$&8^1*Y2Rm=*+X-vi;P8qA>*Db zPIGo269I{*Gyh!d%5*T5TpO0I6C%%)tmG;`fqu?|5`m%~7YMh8(`|t$q_DA=poQsK zaS`p{?`se77q&uK7L?*GYR4Z>LI$)F3G0@j+<2Ya-?WA4lRT~e7FS0pIgi~_&(zwD zD+)(r(LoDMX$R=dmyR&IuZLz};=U^1$sZ*9HeNXF%x4yn?O1NJbAVqH*XI2VVzcEP zE>jruXwn+#`RbKP+GMA_UgisGE4`yM!&K#4A9bSYS@2s&8qApj!=gbL!~1V%g~;X4 zr6e5iG;xGsr35}ey>bhF2WwsqiM9^8&q6v?Z;@fG;j?9ku~59^jw3Q1qNpnCdC(Q= zqrL7R{?flby+&IHq+J(!PO9I5Y7_kb+O%aXZUJxK53D%U{#~mI!1*tJfquqKFd>ET z9sj}iV3YgA%s+Uerw}dGl&f8eOCOJ!E9l3>MxQPvBA~K+sU8dQV3~TG9<0zEMy5Pyylzq`JpM^)N=0>e#x7s1pLns@YY8rO`V1Zk& z3vQws!C0DI4Rn@0UCPZZF=`7B2$1}zN{6YuuXhkGYfAC~*=8ROR^dRQh=#@?_aL=` zQH!N^*yQvs7&7 zArW20uBEsk`x#)+X5NqO@MAcu!Xu1%>-74yxj>&0%!nD8w!N&KVRn2+bD}V~HkWNa zZ+!+ViV$~_<$o%YCM{I`jXEF7lZEgzJQiXwm;L^8QLkGdThL=?r-fAlF z$YLu$CJ=yu)!j;Ldx@MV*HBYI;Jp^QpRrwI6pt_)SPQ&*TVA#qQAVn)> zNQ%_QLv7DxGoCiYpUxT7F_m+!AY^`VI$!634+opqh`}ziYy~la%)FHI%ycUu9gOy& z?uEWDe7s=2lQ~k7=)4)jcr!;91OcW$HFQLioAmiP#Rn^UOI0oM=A66CR7Bm=;_G-q=QVE!ZaH6{% zl^31WqA0jaewXW`1RTsIvW6i|UX)c5H3%O*Oq~6sHZfV$pNUJSHLcx{I#^Covhc(} z=bC+@4`b*ypq@+p)0#`3@!Epr9Yze)*03L?Z9(eEnF@D6N`A~%yjkG6hU zZ;0eTi?6BJYIgBOpVHb}M4=mRXRr7M23{k)151{ziD*4yi|?Tjapw+A+}Xw6#F#2# z*Kdd}{^@DtjWAMz-Pf@T2`}u7-c6kzVn;9VtUQ#yNJow{z4Q+fAiO{23{2qezF;(n zX5qY)SkL}lH%-)`%>rKUrAqZa>H`S;X^ z)C}IPj!n2RiOCWBi=bI}YD2q7iE`be2l4mFs#WvYQvJPfSPG6yA2yp1Kd9F- z6`IV?nJl|zIl{c$fLDvPX26$Fv+(%&op0*x;$cZ2X6;(e=P}pt5TzcCo*3y?vX+sF zKF&v~u$LWB74Iq}nV{73(l3s7eIy-=f^QY7{_=A#A)Ci{xlw|;?7wP}otMKOdEbgX zDPiaBwUo=F;<64`j+Eqy^07`S7v>+ht1Qsdrjq!h9;O)yN`cay0AFIE(*C0Hk3E93 zl8yTb&o*dmX+yt$tWSoDP$7-YjE^H28$|fYl-%E2kPE5gkyQXl)p>Ix4v<>K0{rS#Q>>K|5LbB{nW3!EV{3*v-iDH zQ~jQjc!?wY;4K%L``nJA#+o5>VFxdD*_W;rs1jcbPF?yWd0ug_u|r=5O5Y12okN=| zsnNX9+5Bz2?9kh2ZdQ|4$sNisE$3&Jg^A6pDMkbHa?9%AiILCTc55eNKZx%h7UNg24o8fK>pk{o zQYEH}9Zn>R6&}l?1r-y_Iz^fGlyfp2es}(}wnIrM;w>?MFr$%z>%IV+|c zMqK~FHhs}HoiIa@t0EPb=Q1|H6=PD|@xIK;rH@9P*`z>vwF+dlK^#+_)O;}gDfq>5 zmxJ%7ag4m{OwH}1w~ok>X00Sm{%jBgR=v`~9Lp-}uKf2V;hhZnNm5)qizCL=O;4}N zDWG{Q7K4$%QMb}lV6Tc2y?P|wwtQ%-lvLj%hQqxPCwsEN6_Uua^;2x%w$6v=28dFh zx6pfs(B|m=&F%PT65FEOEC5ucw7Bm=O+YYdz_N0etq?K~-Kt8Md^;jHyMRJ{pi zN3uKv6){+SFRHYr?nvtmZ=l1`EBLng8ee-#l<&QN6c)0C(_ zceZzZe5dM`}Z&nU*=(2i)D3dZF$ z(e{-fio^e4J`r0p{hQ2VoNo#gRq5^i@Y6YB`VN3BP-D$#wqpphDlg?(;jR_ILINS_ zzGvW^*T+{(i*%Lh)f?F;);3DQes|9|;4rSV&pdFI4Gg6wE3&!pRBJ;+%$!j zb&4XigvqwPa1p9tcqWTl%f9;C*>vc*P<{TW>MCqYo+9=$=r4wm{!3vLRw#tWxH%SC zuv9xdVF$hON6NmJb#{`#-sgy=0&izKexo3MP-iJg$OQDBDhH%^vJ(n!-G)xk~^0giuJURWF;p7;H}P z^mH44pq?nhG8YSRX^7WmK7YSQo18!;CdKUgTK0skcU3vNOIgDg6#A;j=k7e->!i>g z`&bew-1&JcO9syUCGH*Ek*JX`BiUbdQf>>_(A91r#2t8?*6KO39{J*1!@Rg$MYjsg zpD0TGTlH^w;Q$jZ>I&K(5csKgFdl`OZYgy;qnBRv`k;l?4AFggTu`PBnVp(Z@K%Wj zcnN?OF2y`TY|v;(<|r7^3(b0JQHk!;7EYAzl;M~~v&uB%VHH@?wBA5<4rLlxye3e} zH+j5AD-U`Q4k+-U%GcD&3x_|cPJp7rm0}+G*GV4wjFa0FeLNM$RYZih2Q&M!z(p30 z&y9HLO=R6xK7YLZeJZK=N^3i6zv=DzyGY?fciec7LX$=ubIyEZd2%+(^Q1XY7{NtO7enrOb$iZ=%N^kO33^Id$#+jT3K`#h0>Dj6oM#{F>sr_mCI=}j zOx|poC<4#dc;2XhH zp4)zb0C78=Ert=E{QeD%Dy~{~rsACa9ei@E=d1rO3<*3ccP^=gKT}<4lW0SMq8Kea zba8Vy(gy(F^s~il>w7;Gi9hRLOV+1}P{8^hbcG9DE>s-2;n1?I1gXGIe?1#qI)uR7 z;dQ|hz4j&Tc)F0iO3j??2)ZAqO%rd}TFKygxX@n&xWTX*mpVcL;G*L-ot?D+lc|$l~*T8N`lXRqr4=4Jphj#Q+bjkeiF&6`lxzS9etJhUbJnuXD}%s|>eC zjs`?(2Qms*2191mx6-xepQd(Od)fDi`}(piy~-%x z-xU05N8XFivrhCBX>1dZ$>|;Au(Wr(O%e5vF>n=*M@91ep#0#GmmbN>eeSoKRDU-q zsQ7$*)E0xxaPhYPeOUi)@g>e(D(2$5TikcAi^GOh66l*&kD=^n0Ebnb@euD0zsRPl zmql}AX{n{uQGAqTak{YW(uO<-c-)>}Vec~N_nX($gzN$w^!zo9?Q|uoaw1kxftqr( zdc=m50`6U^v;;V_ctVDhHpFRTn*=cYsD=ESd9ye**zD2;qih2&Gp5g6r00sBT1qx% z$k{i4tas#QI9AJmIk2wWel41u#RnU2v&Ebx)cX4y5*}5bl6fGO`)$$w`!-v1O{f9F+VMgNa$TamMCeU5CC%NsfiaZ#M%- z%G6A-7RZ}XEOcgR2&^Ip-l*Y0y;)M9Px!&8mF75dt<)2YR34~d*LU93D4ys1pR!1r zQc_Qx=C9V8s&VpK_uO4v%Pnj6U%8lO7_JF;ykse4dpqXWnxv zfk{D_`hlg}{EPwY9yctm=oD2J3bcu1qIz=YqCeEiA|Pld7=r=1^1*p<0UdEgYq&Q6 z@nlP0m|KFvD&{bD8X<=vG9GSE`38;$a9aoSEAsSiEYM^UW}n|ayh*YW$h)=_Kiffa zNA7DHQ(8Il{3Ft|uyXBIGmQX_m`GOsJh~UB{8WTOjKsGs172P2XS!|7K-L1B$8AY3 z@v|*Zt}2L1kzgv=A^MycPEP|Q<5YFeO(Fa~p~+#0sf5*)D&QtC>G9GM2Fj^e*K#Q^ zl$P;z74VbrD%hIEiL+r${n6$nA0L-IVTSZM9ELzDXnmI*%Q|;y3)qpi?(Ml+2|$|p z4Q;=S=a*p`eH&jb^@DIe3f&V3>t~tto37rnM3QtH${=RJdc3yV`}Q-GIm z56UTub1puFvJKGW6t3UVApW6?uV>;r9(soh*%!0wv*UopLEd>A6&}zB@1a}{5E3G^{6#l7u<@^0B1o5A>^k{SHfo3N5*0l z&!nO?kr*H@7&WvnN`^@c!C{r{G{e9d|Mn%Kvy-3i*${^}@^Rv?Cs*w|sM)h1V7`R} zEjqSBMm5Fpx-HvcQ=pLkYW8q^$p@OSRH+)Kd*RNHVYw3CArp(}+Tf$P^nH)10^0#@ zY^>lmf)k4Z?qNv(=f?2XPCy-|1L4fAXF+7ix}Z`Chze#cp9@P> zk1dK$E0O?r9P)vfnAg^TNW4-Ke?_-dqJ9W}zWq8!er{e8%)MlJ%33Gd8poRUHRAiO zMj~36Ox`aQFJ0Cy^?wTqVDq17){A8^J^9&R3LV<2SIDS)yy^5+sFz>0v#^vp1^=W_ zswXlyLk_6Y4>&!%`qhXwW~6#PxMzZA(w_nsI|dW&dJBcVw{t=yv6o92@D(z_WH?yY znnk|hEEY5@TGObikH5IlwaKRFhv5_L)rLd9iE9r94%N-vj&Nxp&0qu#O76;?kmFfk zGG=4zxg9sH$wX7bGdI%YqUtjJ?bOZ-t%7p45tyrhr~FX0Ei0UMeG>_|h`fPntWlf0 zAq?o~+Ss<0CR}IPM!$lKN7GWBxHff6EojX4#&4&>&g14Ve{r%l%G-Bod>*SNP_=Jeaf1{J;ol;abq{_vY?e(Z?6w%Bp?(i$m3aFZv4ES zH~qkm(h!A@p^V)`?K_t8`6L;fsZOG7%2o26H}fZA7|GiOkm z7-~+K4iF?+Y1o@F&BjKO!`1ty0pfta**B>`W5wwD5@4*{61{Uvk=g2Y1LbtBuOry_ znl&2LFT=(BmKw$UAuMRh!t1nmG*65wj={tUE7t+RsjzPd`M5E`ip;~zPeRYkxOfhO zwMHCQg4+g{Frh0*`|3I}Tbp@Qp-f z#D)0&SVa2oo_)Kt;nC=6Qn31~t&KSNka8=ApqtqBtv~eaOQ9SxR7EWCf1_3s}hhthPixGehNQrq-^3D1jpD;V5$9 zFV0y~i?}h&Yev)W<>knSaeZGpV_#%j`8muA%=cR*oi3e?D}VL)fe)3!qeEHj#vn?e zVAcuo#R~ls3+?MxG!Z*z-P_jHMBu)R4_WBvTn{Dvw_}A%D>LG4sDp zvNx;k*$?yjB~W~|tVWFp-4NEs!>&&6;#X*Unn>0ayP~fvX1f2y-adVfBueeQ-_lq- zS@LW)yukP)ZDPxlfs`RLncM^HE$(#i4Q9@4yn|g84d6E;h|QRAe&WGBQn25vNK|2k z-7V#606Ka>6-D}JWX36ughDY?$F7J+$t&__gC2x>_a0>b{u)q6w%z^Yz}?4Fa0~xm z0a_)c+T+nrJ1xBM}01#%x@lvRF zih8ZQbrssnyh`>A__5Qb*zjuI1aHtf-40(cZV#TjBt4x}+uA^83WpMCfgzqrR-sFmLY)^YC)q z)Q@t+K|#h5o{%iXl#?c*r3q?o)}BVRew0gIjjRT^R!UjCz<`DeQ3lC^cc}3etI@nd ziyNPS@Q)Dz>q3B&5fEsqLAJyu<{1qpufAo%!?dfI)g!|L<-bnRzxb@aMpBsnOZ5jE zyTUrveP#2{M^ekz4~i8H!kK0;Q95#DR4LW*8J^5NY$>Yp8{U;Ub~l)sf!DK?S_>-{ z8f=1g#u)luw_@&+Ho&x^!RKm4JneL1E^p%CMdU&;ies%Kkq{gAfX$~dgKAAG#M1qf z{u*1U7?h}GNA6BzKMm5xCMamw!sbb%;P@SC1YitjyF1%iB&>#Cm#TAR1RMl0wSrG` z8(Dm18PJ1h)r!J(O&(1z?)VoXB$g60315^&JGchWhgapgjPrw0oPw-m!Mh720a zV10t71kHjo8;nCJP3ASH?OPLLH&h7C(uEXXp?Zg}?&ii|BL^&d&!K`!>POK=+_0RO zCuDVt`VrC~_x}k<5~EK{qrP}R>PWCFD+CLWaEvSqs~&P}@IrMFkANZzor@WQ!NPLG z0&<+kzu3BSQw^&)*R}w{`(>Jr5Q1zvVM9x9rC=*rwH*VFQnDeq;l31p0?GVo8zBI8 zp}6_~D-Pf}-r}$Mc+z_;)e~4b;t6L*>d}U0mNk>xu~}BXGDWc06Z((5;IncqKlDsZ zt|WWYF@>9{Y5#I&Vh>p9@aec-Xko=%j6Yh4qxGqJXei(-*3N{{H#9omiv3;Qkvn%j zH)TOwh}qm9Ys<%u;ZNHA3Pw5O@kg8Z4Ga%>Bw<*Y@{j_yJAltU4!qc}7HLLot}JvQlM^CGCQVk$UXXZcv#d{hzaVKIU1+!Q;CZsB8=Wns?j!ZqY@SGOseb5-$6y+JIFcHP*Qs9wuC(pBee7Un$la(il}@($M%azg{}b{8C>rb_4S`3Kwu_AsJso<#k6_W&CXwiY z9P7n2tU6DCU>5ExrgBV#u}Psl^xogOql-2>Ky=#=pELaHjAv~d##ihqM6!uZGxy5= z#%x^FOS>P`cTe8ajWlHO?WmBWP+XXE`qR3J?F{&{umD8i3WdX>HhBt(m?Sw%-tn!l zRTX0W97;yxn%yPLu%{#aMTsud8X&Tke9vKr2GdY98juYX-Jb@`yf1377eaVgQV#0~ z_;-w^V=((L!{Jd_ESE`W7#P5H86nV0F=EtVzX}@ipbMU>G9!F`W&J>nyNgbh~P$ z+1t_tar267RdWq8MlitnQs4M%K!WTD6)u2#1)j?il~$?EIjoF82SQQZ&`r7w1uSO8Z8bs)T!XV99_nn?KzM$gc{=4oOT3R~%wuR~!nCWsZzTJ6W$v=%G?%m4>gh zV{munay|`wnSQPwVSCXE1OFxKeq4F=*c+B{=I2~wWKRFL(?{=k+LK|yh(*G@6K#CJ zB+XfXNrCBr>5Ow3GXoPpUxyqkkJ9ktk@3MX%XaAvsLAv$!%SB?>nmNy{>sVAFScl` z)H9wd-?)+3NkQz+u*ntPH5V;j{Vzf8R7^PvoQ{(Zxt4@md(S{Uuz?WiTr#~Vk63!@}Uu{VU4$h!Ervnh5jDU0#P1 zFUt)P2Y^VmC#kaU)x{OE7Ppfzbj92%u+d`IK-MO35(ia^n*{Y#LAEkGN|uF$inXzO zD-H_`sw-(2Q=R3u7))hpm4s685w5NcEW;ZniA>;NWn4sXOXy8V2Nh!`*L$SoOrV6Z zQ4Dsqx;B93(1}hY?rXV`NoMd%UKZ%Tv45)-tfqk7x~7=>BVj^G=ImoK&emTfA`t@$ zOa4HOuxQu#f*9bmj)S=1tizfWRS5ikxKn8j`ygWRA8dH zJce}~)Ld+aBxVRW09L_qiuL@WQY2ox2`7a}nPsAKmkA^mdSBrj#N$UlA4eXfrYJ-( zsV14P5<7k6iNt_}gUo`A;T;xgIrUFVIr1pA!SJo7AmR=aq_2kZBQ>*tW=Ihh{>8dx z5Kct8_A6j~#nwXhAzbi?yUNm}Z~LO$XFIS9Pt3OouGJ1@x+PaxR$u~OjU95v3f&l; ze_=$vh%c3?$QbtvA5msJ1`0&5102wu5o75rmlg365GQw>Drs~lxnI-i+nxsfWO8lM zHpEERL$eBT3lbL!2(I@69zi}ms}#Mw7IY0=OI{I*6w$}LC7^6vPvTZBC;9@08@+}0 zg0MV2dC0yp2lM85fjI3&?{5O(1hSLSTdr5`yc`Zemlm*_D;yxA(1WJwSV9HcsF^0CDm z45tv|Qn1rs4lBeqs9RPeVA6JsMQTZ@hLG4J45AqE;e0AOos5{V1^O6(`eqxk?inPw zCY-=M*xH)hm>W;~Eu+!xXCiN2yd~NwqbbX96(to2?f=IWp&*F8dT#|_<^sEA1q z_@5{@rU+j#f~1QGf5s2-C|{n)ALS?D$BjFdXcQ;7Ki8L7GO*c_RO?TF(XC#8P$JV! z4nUMNdJytrrMyGtG>TgQDUA*^2~3G35XLu*BM3|@9-~IVE{e=40$eP}F^Pm2utSnr zm^M6xhb+Vx3ovmx0ECZo|7!fBZ>ZMs35}SqgjIk50NxMDW5MAhl!}m&O;uJgH90t? zIR!a6Su}tfK{(LnI!rVgC@oe-8We}aLXqiAxq0YlfRJ`L6cmbP&c!j9jWiZC#;5|B z`eJdRLLlR3DH+VwK`KHPjT7s8Z)=kFGUV48OHlIvU6m2Zc&JzbDI8IXl>1*t)g1M zQW88&CEyw_zt@h&TSL;pddBI#6h2^vMU#8hHwP3-w@-xdyy@Df67|AG9*S8=edtG- zkzF{ff2SFK#NqH`AQ$qVEAT#d^CIIiUb&I;fSHg7GBachJZJ#Gcy@4jM}V+VV-JcZOprbfKeuMLHniC7oMXklrf7c+@}u!mHEy?jVw~CzPT+$hdfNeqQ|B8uu-z$ zERZo8!1Q1WG=769$D$4eq^Uz(ARDfokzE3|Cqh*}KmaCPq9U?wn@wjzzp-j$7Za)} zWGbGbmk2aUW+T?)4y`bQV3;%ohl4uql~UU&;Z;No1GdBwYa+Z>2W)mY4MSxNNM^iT z$fs2w^aVr~5Fj00w;RWU>CxoKynvK20j7u4TfHk29qSEXsZO!mr50)Ql_9Oepv)KM zcQ9UYKAX5GH%hJ$7IDuX9KJYo)`=|uzfORdvWIa>ahJO{iIacO|ch;*M)g zP9VxO$;IF5=}k(Jursh@BZJqt%ve#ZenRS`7xLbSL9~SYpk2aJ-o4Ix7-2j!U%(VB zr}e(^N;OYln_dURjRSrJt_94&8LZvDF%mdZ<#s*7gNG!YtZb!1G6nz7_~gB=@j-+* z$gqguO8_68{hPG!(*d++?MUh4VMf^mbv{TK<_^s7|3qZ*WqpzaTU6gGB#0EoB2+?@ zKv-txMZx+2XCV3Or)P~NVK_(nM6)W;Y)+6Lu02vrOSV*JSQA8~cG1&+t zofL*+76DHGUR%3y(5S}%eIR;+p){a;kLkIO5GqMtFocZaryMfS=F2iqa$HRz6bV{V z1A|bieK!G{OEDQj6-0=%lORdiFzreV&M}D`!f^d1jOvpzLPYmX0E}xH{K9pb()TU?X>+T?V=7fI$m{~J_h`@? zTH7y9P&gQJ6||OR7m%4cpn}q+8^@Z=UIYY+Al!vpsWYvQ*XI@l&$oa)+>^TC-E9zn zDn4*pn8+*ftsoFDD+~PLEl3>B1 zQF9hRT2A7fO0bYX)+fD0LQt_ub77;xLdMWI3(43$%Xp49hZ>JwvTY?wDX~KU;<&>eJ<@ecB!Fd)2~Q54i58QUuqZ{Tc~JD zsrxx?plB;*WQdGv$h$2%*k%I(MQ2k2K@ZP(%tx1TC5a%4cM2R^_(>7DS%F&SD}S#tlSSSYH!Z zAp9^WK~=JP944(fHMyDb_903nq|%wr+j3wbQ$V?3@Pq{MG6#W40zIKN(*)v4(-2An z17nW-Z%w>R?!yTdU^F6XiP92fXGJmQUO5R%tTFdL1f9o5AXfp^KpmGXaj5cu70JE# zBAIlF;>s~hSq5{en6H{O0xWI@Ny;uAT|9qf6Ua*^qQ#}5ZW}G~Jd-F>VF2>7TN5~t z5<*Xn#s{!L0?2ZCN|eP0puqSBs+f1rmO-y}5Se|u_nB<_2qV2nNU-t7^58r2_l_!2 z|3vDB;NukJ!2l;DPJ*w1RfMiUfwhGwXx|7E^tiKRhRnS~1e>G}mKi~7&hRVpERwn+g(C8Q9 zD85C0rriPG>@)y8X;u2!8Rp&LktwiFrbE!0r;_`1~Ymw^`W+2 z^xO=GiJB-NKGqvKCUZ0hpJ<^pcY_Kf?hOIpTu5MmlSI-Y9Z3drtAJuu1_Ew*2U%#! zLU-aI&Z7fBdcd^1nwD(PnUu%Q+6GQUtgyvW$-T5TY;RuFD3Mii4H6k!X} zCY%pG+lc|JU>LRD*6#$Ty&e+Iz>g$}5Uuc~HW4&^q=JUoWrx;ScAY|9sX{^`h2haK10EoqIV+)W3(l+0?%~ZfJXuy_XyWwFG zXt?qG*`sJYnTe1Hw;Mtr3n56jUGOf~OJm$cV8oHMzd^3@L(nCIAERlwffymzp(T7oeJ86Rw81-|8S4k&PK=?9N}b*W!D0 z4XP2SW0oJ>C@Xu17cc~{bP#^2+QFO7_!>HnZR)sUO&~{%_UW``q*h@h&@IqcDr6v@ zEA;u^mtc!?K`s~?*zdVIt|d*Uhgrt+yB8Um@=FY@cfg}2N)I0a9{Cm|8;&-zpg(RV z_ioV>y;N^0iG5JnCYlDUsPT)C?*<&qP_Jq{rSKwFMW6ct8~4tXhZ2ygp-6>nD>u1m;&4?+b`Eu-hfJIFrCq)t z(p^pOJw%~IWLn&&V;P`fxkdOL z)|T8u1wpAh_QY15=DFp7htvwM8%lw^Y)L~RWFL-s4S>2_U}9sgj9FpJk7NrO@nA>* zXi;gzgt1*2gNIOINP)HSxk*B5fgHBZ6)88T^M3%mHZgs3Fx@Z^lK`6_4hj}l*0|gy z7)8T|xuOe##Bk0LK-}?lV3KB_6B1n>!q&ibgFy-8K^Pd@#2MlO!GiJ%zSDTnJbaL^ zMi@9#)9MC(4(8{ev0DbrPr#uIAte~{Gh^f>OGRDYMgY7=ya5M!*&;D*F08wpwG9o{$)EAuu2aC^`h)?EVB+DQ2bi!q zFpMdiNu$a}Z1nZh#Auly0wk~l7=W9YAaDV*%IGO0B(M#@GkBrn0X_W$GY2FIu?iT6 zQxPFJ)$@6FXtX8}lhBehypdQ`frYkypQH|_m}SeCr5waL%M`=HrWZP9jhoJu*~CL8 zb5l7MsH}@?Ct6n*C!`Exmvd)402+EAy z8C-0A1S5F|FleX{kM@>al8j^7(201*@gLz<_VngK{&= zbY|H&(g9Ey3QAkh7Z_?8Xy6HHC#GXeM>6N>Yw2rZEA^T6Fq4oL9-Y(%oey$DP>YMx z`syw}B^Z|y27h)9IVqFL&CGcaWu`tSD&%QJkhF8f!DNIaV>t%UW7tWYdfVpxbZ`{J zu}n?kAD&1^<%>+nSG-dSb%+mnAq+|hJB#=!yA?r`Swf)2{Z&{InJ!BS<5rY6%!^b+ zE&@lHCtz9=@Wz?2EcF5h%RxlTgzp8&J%Sn>0Jzju1gXHY9GZ+NzWpq_G10N%$>BOf zfal@Cd?Z448X`Lt9D09LG z&KMlVNW6fpC3Qk}^7MeQ`AbZ8e zAw_84qQPr4io_2&sxRNhfZ`$b1=0tUF-WM2bPrpO6qaTN4(bk2zj!vG1Xw++Y+3-F*lz}y>|AitIvJCs zf=I*HqW5kv{p=#X2#~9Gx3}cZHKk&V^jbWC6k*#6#I1)nP#nX&jAeepvP49HyQjm~ zB&YvOLmn3N5%`rVEHOj73QGS^?LaptJBJZEIfM$_1>YKuiK)=4AZn?pOgfkSdX)TxN*jSWR+z zpiD8gKQPAra~*EO8#GHq){Nz}qqcdUi`M4-tPcRE-)Ue#D9MupOb!-;`W>e@ykx^X zeOwo9P;0F)Tsgd~4G#lm8yDh2g)a#aqqYao_(oqC?rFZUsIe|723U$%zS061%>;z= znz-mCFActDNzAwc=EtcvAx3Ou1D;W<*r3D&p?3dMkb~B?li~r5naQ^4q7g@COF-4j zJ`qYNVIWO?bTO6zLgW$;Hx%?_VCMNIR9;sT2MXr7BtHqXbd49Y+AC*p!zv=cqs3GS zg=8g=ph($V#S76Gq2?i(p^$MX{6UsK^?Z&56PM*Zqb#8gQ%|Xj2`qy~7DS!jWA{>Q z$oQauih-9rJ29+xYv$p>%yAE9Ad|_8^l}Brp#I|3wLPEtxMv;0V@E3`wQ-1DT>~hT2@;85Ewic<{b0`%sguTRf>2x~pU^4d zFUkJ!gLmaiR%1yed8M3Gn>be71L(8`8$OX8b=xu)3_Ehu*Su7!R*0t2=^13|dc$LB zpBx)0mmS(RIjrC=dg~xUALdXGEI^>amL;b=z$-cnek!Gk0iXro+Nv!*02Pn=vLZ|d zGQu>>%FN;=Za~6gOY*9y=6qUrCh1@aYC(`>!_fLoky>307j^y2Ia0&0ACO?o2Td^C zVvDowQz8+RMF%9k(!er$D3%ElRf`E(xI}`@9pgi5<)qRI#olSY)&sBR`zM%B^1nr5 zI}-<7k<^-Dg7GGOW>xVOw6B|LF{d{?$@HU_OZwfuEGu zzyu?2Q%`^K#Rk#pk9$Q+7g*!V~a zrrQXNdyK{afnGwytJ2rklW)2HaKJIwsF0TV7n*oVu2&*>8$hfAQHkQ@if9$tl}EuI z=#~9G=oz~{)WvGl%s5@Pv~U_P#5&stz_j5mjvLQB{zJPG=3wp_TrU%z=E%z<*9e_P z@IdAXALMNeGK3+-M@O%D6j1((WAI^6js=Cu<$r(8e^kf92nJRTDY&#kHy z_xu*^{=AetZlLUzy|VyRm%9oCY026o?GV9FC3bbEVrrJ_oyWbyOj$OG)kTTg;Wtl~(0j@b_`Kp$9ws?FEU8$ywqq>Uek36=)!GOf?9XM}#8zJRujA;Rw6sqE%qMa3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.ttf b/app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a2b79ec4a710a1026569bd3a75e96c5c46f20dfd GIT binary patch literal 54268 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 literal 0 HcmV?d00001 diff --git a/app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.woff b/app/src/common/css/fonts/Roboto-Medium/Roboto-Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..cb8ce5392f1f3f5eeb82cb838751f0e45c21aa51 GIT binary patch literal 29024 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 bySsRqZ&<7&`?lLMA)cbT#c7<5ldc8;lw&6L literal 0 HcmV?d00001 diff --git a/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.eot b/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..8b7e034543f3922e90946e11bc1f1c59bcf92a1a GIT binary patch literal 25435 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%0DDYhOk>ICg;bF9iO3gI-KEd8tqVrPggpzB1b>oZ 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 HF2>}5x&*rp literal 0 HcmV?d00001 diff --git a/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.svg b/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.svg new file mode 100644 index 0000000000..627f5a368c --- /dev/null +++ b/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.ttf b/app/src/common/css/fonts/Roboto-Regular/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5b3dbb3c9cfcf08a9ab3f307064588cde2b1e72e GIT binary patch literal 53440 zcmbrn2YeJ&+c!LCW_C9{yQ%b)B?(0hqzWocks=C6ks?ic@4X603%wgrVzZ~3 zKJDD=tSL#_qxf`hvo@{UW!22shU0G}sZv?9b{(47THKo|NgrO9B>7tFcIg@8*0PC^;kf@P99JJObj*Y*F?kClX={um+4c_^-n-Y=$3t+f&G=frI<(h> z5y}Q7Sdunf#|MeSdJXMcsY5*{;48rO$BY<0dQACHsSn@@qwhzI>O11qes@nx(i>P4 zYa!X_JEexrBPo(y3YNm8NNJ=N=5)ED>UqMP9;uXG?cz09yoQ%b9;s<3kDOk)P_EXX zvpA4&AVoFktf{huUurh}&7r>qiMPU#us^gg{gZI<=8>I+5n+GSshgDKN>W^mxtNl~ zvRRT+!~3{=Jcs|xi&@w=vcfr&y<9XY_eEE zm{jKhz=Z<1PyknGw|PQpcS`!S@*kZwW|skIox04eWGY!X8F4Z8U*tA-KuQ#@7ED-=qKe^nl})KgV#7hXe4J)!A^L8fm*ot_AM==4ODdV-vu7;$o3 zsYh~pDu_?2(F&3Py*oQ8Itl+W75bMM3nby68%Ig9m)~i#q|I#>+!WhV_4y^wv!Lgf zKL5eZrZ?`jS-O!0HRX5MTHcSXozGs%W1D$T`j^Ky&gcDPH+u>ZD&^#0LU6Ft6IM#EPI@hjW`XsBfGU~}lbxP~QV(8J>9w$C;47>v zD>W@OH9IROH#;*nE-u!cmFiBm$Hv5|IEb-3V%^#JIx{9NGb2ao^zxdI-#fZv)y~6* z=8PIY?G;vcPusI^tt`G&w0zF2)olEW(=r=h*z(%Nn9r}q-}-RT_Q}KgP3%2>xSfTyOrKYE7S;_MYT0f9Rp?Dgu0?OoTFLb0(m#yWPpPQC#knftJ5Lp7VM2f|w4?+f>Ofa@1D^_1F7EC;mVh^0;wNW%OzFd`~uapl9s3rOmd#z3-JytDbMor_S6|zVn~a zO`3l7%m}ut!sMCb7AxQOT-vVA3k{y^JRCgJUrmy{LjE{)>0|Rr9{@}8#vA)GTV-3u zm$EN$_A9)WyvjaUazR>oBGNso*#4-f+<3dJIGoXO@s89q`IU*kyqvoHa4=icVQlIv z6K~0_zhawN`==+3;930Z4tyH_W_Qn#E#F}6iEC4F&D{I0$zo*Lk(Lt`ot-7iX}NJx zQF89sUuUPSJuG+H@KW0B+vDY?U-JHZdyA3d*sm--@gf_@sZ@4SlrRRw31R`f{e6+FRs4^FQD22RPfK~|^4+oBzclEzx{i;u8Jg4cwwnvd`g z-=9*vf2#6Hm;4c|6W=Owd0~_v9gyf4& za=BfQd#+4*BU{Y}74t!Cb+Hn@k7uzD_OV@bt*ZPQ%aT5amajn9DpUhXg{~_RqSJ(s ziLuWa*j+u)n_p`_D{sfLzGv|36gfc-mk)yOqa|qrhI}TvS0qQT519z=cH<$Dms5CisX}wX8JvORduR4ty)p?{r1G+|3`7FgL zv|}``fwh}-cb&TNZkAcNN$$CEs{LWoa-+eGA>hVvVCpgbo*}qrh#{+l;38fOaTdA) zutRheRtOwoDNfm)EGya0sLYJ0=rq9}4wsNPxoXI@Ti;(-ul@AnHKl0wlEpLS`FZnS zQRJcgFh36UpZPay%pT>J`1|2MescL5|Mb?4kG{c5b_2lAY;VC%sjow317tP>vVaL9 z*@(~8^g<;7ktQqjDNGHw%a)yzDSuYX^W>V^3`PvY9$pp!GP?s%!Ser<~qHm+S5 zAGo4NF4YugJl)FaEDSb%;Us;f#l}1J8zyBlLqb65R2Kq;u_QIK>}hsqM27{V7py5_ z%4cV9!Q7c7fBuSGXZofNqn2-2c>2!Ag`enT{|zaZrUb^jnvZVuO1Q`TFG$$lsnw!nZo3*-p!jdBId*^+QHEa7S5VJPbMnN#%{C$&4xfOwA9yY zu@Hoip!Kp~m7rzmg>qmG9+<0)>>n-29*VEEaB&uaAL|wj&N5k&%c0CUbEeokP+oY# z`!YKb$G*?!Z?NZwD!-Q1lh4#3-dPK7co=Y0mHOyVFd&*4SQlGByuh4=YT)*oBb*UX zj`YGxrcZ5-O7tm^?kc67hzWe>agb7n+=xz!O;Vtvqhe#gKB;M$ab%4M?c#8pYbpQW zeeP$w zPU+S~R;toE`O|VKX7tG;U;laT0xx4Puyz-FY)*J};?yO}Y=s-tJ2z(YKR&v_e`Afk z&De6b%jO+1s^e4puO3>px`=k+Sx`d?cEJw&K!`63--|7wU9dSV3@`Z@o-sGcRW-%C z?OnNZ*)8Q$Tl2ezY!wP1gGT^25rXTJV2k?pI2L;xYhXu^9Z_0Za4cfVx|wUmEpFdFe&( z%cFXYxOJ@Lr~Gwy^H znY6ax&f+C%rMY8<&!2y7A*i5FdAV{&thBn+RmY-mi;Q(fW6{yHP9>UHhTI!T5r0Kn zN!2Ro;Y^rU3wj{)NUVuy!WHY3Z0>AGjg$hrhrl+SaQ#?~ZEU^58dz*Q`2LUM|gn zW*n+M1$h|tm&6>5n%ohj6r zI1_Z%TzXHLq_zZ|#hK^~-$K+wS7ULuSg5C179@`_Xh14pOOz|h zc~F%D_X79BrT`iXrNHik&&`4Y7bIH)|CB3bN0cV?PkCgEw`4O>{T%7Ia#ejM0FCej z2^w3e$41ZyShAJM-oZ-8vfc6mrX1mOmh)Fi0L?Sye=6g!-xa|1?ex`HG+H9|I}!U` zSUF%wXi{ZTS(@q;od000Ch1xYDlIqHXZOasbFkS^0}hzP0bjbWobl|e_QMADn^Giy zeej)2uMTZ-%;#FK9lxOc+#W**jvvzX)strn_w63iwt&AE@U;i=$LyDF`OpJRq#=?g zL$_Lj0CNy=x>Bk|W&{zLMy6}Fph)^F$XQrV4tPzmrJf9DVP(@NaCmE#dTON?x=kNO zItv>G4vBmrcZG?cnwt|vtBP0b5W%@oQc|)iJM2*^9mNYLK#q=zf;v~Dm_3d@&5b56 zzk-WUuKF`kWfi!gRUtba(53CQ zkkBx~RfrRT0-Y!V=C)xL5`u||?7+62Btno%u?A0&g_N}r@hOq80uz#CtfGAA-8lb! z`JtWi!zaAYvfFpq6h0e4n>KPKc^CKs=Ce8vutb2r5~NN#02YmE*jZYrD!I9&kEj|TLRgs$M zuv;Xk-!evgC6b~ng;6FTAvVo{3V8Ze$m6i9?nKFzokesc#k*5MKr;Mu7|l7k>Zg_Y zjh{K^r-``)hd3N$Mr@NiwXSU0>sC#)Vro6))77bgD30R&Mu=uPGL0E>~@mq4Cs-36| z5i7I6RGn7C&RG~_h7VR8EGGS*a@{*${-Uh6vcmhYJYL@7E!$x8Y~%=)>M*1OhG57O zLEH}{do5TN)+C&|`(QA6ibU~bL(*-P54;;nlsVq|a&LK-cPia30(YAPI=KouNg&xp ztn|Oo$$$5wv}(Ezu9m+4Xtndzy zyLaKU-%94s9KV9uJoo;&aO>KssS8)n^Wg~!a8!PcWT)s9a8uS9z-o`>X1H=N6eg2r)~Q~G(*Ve~8$`dsQY(#xka_!n zO%Z??n_?kjL&R&cO=LM7;*AK45t^A!qV8kI`%yZF(MWu~xL{^MVR@9`Tf(n}Tt=?-F% z5M;4hYaubh?SaJ*=Cc?C5)AYh&X*Rd2!(y0_=eUqDM64U&;;3pfPvemj?kof984xa1AXFvDtycSScBB1-YwZ_b7`| z(Fd0c_KM4Z%OECA2@>I5msS13SWGmFPDC*sHb)9v7m}a<#%&@{%jQgE>MZ_Y^EQ6` zdVt@O504zUpj=>M2)~#3`Hmk<{3FVbpmPKzo-&PMj+nQTeDRV zK^vRX6ZgMbWk$?FbLv)^)1s@iP{AM`&`q3WeL`gs;_VK2>`XU>(vsw(eD^W-)n6=l z#VpqGoOc*YTe53Q0ly+Y>wVMaxqf-xnGEmhF!_g-Q|2y3MwLlzpxZ`a7gD7@nv_<< z&p{SNV5F%$c8bE_wJ;(8jh0$TX!=yEUs*|{ZYtgHEt4xrA+!7QHN*x+wk9i8?)di& z7JYT~k1rqFxn}XEd^Y&Q-u%|h)f{5!y{!eWu9oLFJ72K(#+VN#&d#4Yyz}IKlV2NN z`0?md(`T=la(OJ)RTn#wj~#Is+Q70Pzi7r%ET(~o8WT}Nz2@_Wj`D}qezvH)Kii@< z61ElsTf1@9DCr5!79HcqmPOTAB3p*uF=LGQ#x6M=$x<2=p&nOpsk<33znXcQeFWb-b1zuE2m_CmQ@c$Wfnxc(E8WdBL5(I@XM0>UCpEi5Xm1z{6F-baFY zBZa(ILU2pXuD^wgH>^KC7a+vvBCG0VX%4((vahSuWQnh`iZv3xI>tBc;~&Mx^V9qI z<`Q9mAkJLw3(E|f1tp;)Fon|1pNxr9%?;cI!p z*X&cCc|(~gKjMAFn=C)-Jtbe0FA`280qJ2t8U(r&%F(h}7OTO4)CZh?KT?XBa$h#( z3J)paAy?&(< zr(|Kvp+}GMxoo2CyMHDWI1bU3Y9OESC}3BhpD6cEJ7n+^La3mS8Xmc)$L9HmteRkc zip>)DMN9@~vvevtFfD;xAd7h)joW6!ya;BK_?%@)5(FR;&}J2#R)Q(!ZJlhQ1l z6d?FgjloZXUczl`BpZCb@$MsgS?%ep)*kgRuO@%ut%<9tXI^X2jH~ zYoqW`LD>*xWqv+>RZqRbt{@AjNNx#t(IOe^hP0EODnrm)M5^{jBFiL``A3X$WfSLL z;%BL(-G{>J{Xu;W+147;6fM3cWlcTtPEVpw^TdM@<0;5QXfI7423 zbMuFceZPOq$lh~`N1qsX_#-uyhrY1hy^QZ2llc6c19`g+cjz^`PqVi9oesaoBUW{C zF6z?!+Q}DQqBWBgP6W;(P`A-fi>g$a)*R*ZC|GllPC&xmG?r~_gjlxF1GH>g5bdlM z5+*h{%wpM4`pc9W0^%utpXMOPB_}b;CGuYm7e$HG#BWMI91*;`XarkuqiFg3x7u{r z|H?|)b%$SCHq|b9-^=5dx!3m2x!wGs-RH35FJi}TVaKXU&uGqS34lRoSrN`NKsM|h zGwqOZgb*aMQ7H64FwX)Y;Wsk^KvMKUN4tnV*b#k*lNS!_`NZotvvW^ z(7vE00~f7ZJ8MFhZae$1G$ti%{A=EoHwMlY9arG)PGp|OgZbWG-e*ly5l%hx{>|51`=16x&iv% zf#q1>d59Jy@Jt9aEHVM00lMK7XqAFQq_h&;^GfF{!67&Ki5_d1N{iOdh3RQA&1}iY znTQ=gv^+`Vdk|hk4#1IwdKCHDtNhmFFJ8X%gV(LTx!|RFnIq@%&qfqP$<>19#jvE` zlDBx5@E^GM+07@~H0g9fIkR;|#G-X1tx%69pRvbcMSZo%IATeiZp2CweH?Dt5uu*% zUn7yWDJ?{CR#S)w($f=N3Id~85d!^K33kLmI}jU7*|wW|_7v}K)G#DHyUR;AZz_A1 z41eQ@YjyCzmqslq>j1p>$BO`NOgI zhX?Qa=i=DwkM$hCcW(ahk|RGBub#W_`3}41g3!FI_QDDGu3!AE&kMs>6fEdAgJt~w z)`d;%=XDpcHwz)azXY$iq?TGpRJ7O|r_Lin`5J39tU22YQ4hkO1gVRCG!Y_^b66IqE_4H`%1X6K-^FGsC^uLVC9wKC|*cIsi4@K8e?GDf&i!+@4BX{^pHLIWDi zVvzxcktDVz5UmLk(U{o!NLyRuHD{y{Sc|@|{~fG(-yRYO*O0Lb)m=QMsHitAS+P8MNO_%7eW=LFkhSnrhM~ z7EZG)Rb0s+Nn@#E-7z4^7?7kmsEmWkM4v2(m=6k5@E`<+Ia*(V%%XVgO+2)YpjTgQ zh})IrPA0Nt^=;$NeEodR>*H7-d(oh&{pW=i-#qwaky?Mk!Z)7l$>(}&%V)-no;<*t zA)mOluIvZ3KCMge6xQXE+H0Xco+2a0vM$R~4Am~6H+dk!J%v;VwQv_;wz3y{%s%Cm ziM`bN^VXZ$3t-7oSJ)m|fGQI8G)=XzDpiTrLB7#GS{DRn;MP!y7NrL}%9J@ErAO*o zqAEVfB*`e_6Ikpz^~)t+FxSKz%dhg=#XA-*+P-Vy{GD>zCcc25x@3ZPrad#cq0bd{tLTC}dSqXV%X3nvOc)c{rC&XB$W#X|ZD-;E|`_`?_fTyq)da?RjN`?E0Huoa+7Cc4fjseudvv-}-2k z_uk4&B*l90p2}_CN`~HNef*0GEP6zcy0H>t2ds98Wk2p;hF@K{U8Ex{M#v8*N`?o) z)GI#zebI(jw!P5l)j1pG)N)qy<)L>|Wpx6pTNYIO(Q-Lz$;Ubc%lTMCxYSHjBPgq> z3n9UB2I4K8>DLcXbfy9rEjUy!c4ANkLK6svlk;oUJ=nNtztVL_P8DUPW1Ux0>rY)4 zLEJ;u+hN?B;yS^mxQ=DhjY3RK5fznGk{d26>C6lc{FpgJV)wTDu4v||kwvz=Q3I#5glF14-hND* zR}LLn*=ks)W=}rVpyR|BmhF3SThDGoJJ7m<%WugYZH-_B_0l3tR*-P04V;SN2jjqq zu#ssa>iNh+G*yyO?T#r41@nOldZI|I!Dn@g_)KmrNFgG@UZ- z#0gs?es_ttSL4QEt7BF#kT)$sJpz;F0sB`WFPxBFh=2HZ-a@EGRf7;$7WE@s0bv=0 z3n%@4%YXu#sUmhn<_ioprN)p8uODDVr#^bR$TN8Q=@W8^x9MLSmFRo#1DYhLlwv^h zz=)B7CP8|}fnNYfqA1lLF+#;>*gJg6B0k}rdrHH5@9UDfHgeLJ@MoCRQ?m(sL#K1g zo>=JI!U4w31Re|-u1TT7J+tX=A>s{ih=>un!O_u~YRl3hequHMr(9ai-#_$m*{X8o zv3u_;S!Exn^~)|RwXpV@So;~k7HU*YSb!2SB4g1O?>G=63K8D1U4Oej76fq6aDb=) zH2mMce9AYnp_lL8{e%tW8!yZISf2NL?-y(pA1u3Nq`;*({*2-QG?B0qQF!5}3ky)f zE;N7=+X88(Nf9IhEOm(}^A9I71rV}3EiF5qY8C*<&t>oPXZv1tH_hliFu5k5c7{bN zweKbH-<0sxYOB7()JKSuIsr3p0v2n`$hfaTk7ft-|2$??U!GXDP43{`uVm%t&r>R{ znMHSO#Fxt(?N6YFB}0p@NX1nWN_!CO3Dl-(2@Vuv*#kWeS~N^w5q5)k$<359Qd^pU*p&D0A!b|~lg@{DiaKKc8y-%8)QkvaNF{+}~nckc4- zIsQ`zi5~fWBveHUDks=xpW2ueB zhxbdgP@)q`az26(fj!nCjOn;|P)xRZ`|$kcGj_GC^<4Wchw@r2^fap4s)rK1@w4oe z)dzQ%H=k>?B}5+613Ed67qEWnv%<5;GD3%xPjwTD9%A0rZ z^mpdSd+*({wKDt(hAxXx)W)VlZnf8>WVfIb()q$VH3-xnZg!NKX_RVV5G08aLL9H? zgNZ@ikXcuWP>Ee{5RpMsQF;T3Uag_WOIr3pyu|+g(xNv{ohd9@U1Hb6CF^EQ>^$vs zrSE@8W>v1bKVnsrzWOr$qt!;xgrO2oQpxv9lBR1_?uXpSWf@9dONb$s_9UchJrdX` zZAk*s=0_7iPv%IfwF=VXKwnQOLJ_2>6GUOkgBQu-V;o5cIiOT8H#-e_OZT4)-HgIi zb}XoY`~|yr=h+$=a?rNT!GE4Qa_#8!;R9y|vxf4pt82S%*bqFcXV4cLn0oT(j|vA* zSv!@NZ2%n%EdSQlRs9tfa4o5^Cf9z5Rsjbx&1VA}vV;12-~~f_nFEK2T%}pI15}yj zNCT^6<)-Bd!zMQ#tc~Uj2aAb|%MiuZsUTas+IrK4^PA?(%o{Lb#mp5O-#fl()$IIX z{g%uw>pA-PSI0+=JTYSA@zEn@&zv`R(fTvzw&u@UJz-+O{Iy%p9^bTdo;-Q-N0TOB znmp;!#0eh}e^XSxI;24yI^-nbwVL#nv0H|J1cgKyQO&`G7vwJov<1q|s2niZbciiN zAuwu(kO_oI0mA~J6<8s$#Eg*Bh_TcEu$U1OrvDM+ugtPO=F6Ckzs;WFZy)3DvIh9) z;LAQ$D$4oZI#ahz;YV1LDch#XrDP|sfJA#%NHhoaFZg7d(4ts@W@AciFdl3KvddQ# z7Z*bd#Fu@qoRa^-ue)%UIuZ1mB|Rn0*4#~>rk!*sQqlAj_>N?hUVl#ZO=`A? z&rp$9+9NUvQ$2U68bl1@P^-x)2s~5gPMiu46z8fFi<>s*W#5cA{d8XO{`K>=FTQZF zq}#zJ%~#b{OR>no*vLw~n*rRvGYAFu5b ziwZo?A8r4^UJ=*Tlh$Zy^&cZVrU`k6*Bl@BJ%SB;#Gu|B9ORHCspLFDXDjLZBb5Y2 z?xux2l0zSar0t<-nnqDC~SsV!D>BSIQ-WK9ilvpwH~YWZEHg zKpxFTt(lbV%tnAd!9<@m60+%xM5iac)RUf09ivYKz9y!#kXtT@F*74TjW!a*qU@Q> zwfIL?V zbA1-bpWR1&Cy6?DvE;pbSQ1g^pZpD_?X0Pj8)vM2qGPJFdXcNAIzw)f(*mh@CM~wb zDUaB;!Ro50F_kO^(P#z}!03I(Zc$S45pPdbc2p{SU+nX3j3Sg~Tjz}4kBEnDW~KJ$!PGGP6>frD1Bj%!x0 z{xhwIw8Wiz!K?UF{T+9XME$+!&4cCU_rVcifYJJ|UOn=`%_Swa2(lRWhuSLJMB3A@ zC1Idrsq%a_gs?UAQ9xaw94({*H4t*tY#S3PC&_!f zyVyfR8$JF^vkf~~(AvT6J#2}*ZV0Q?uW8*UTGbo1a{90VgIg~Hgbn1S@>)QcDlOC! zO%WOkgrX4)5Nc9I5yzL(4-S{6OG_lBo7ND`UOb>R zzXr$f4utz|9Efm=5fL;<(cHM9g*w9ZO?Ab^`9dm`flPx$VC`7{F((@o?+EU;dqrCW zt-W)%t}jp$@4Y{IZVO)9CSZCJRNn|zScp_xlSNIwu0ur7!$NH$o-UDHggCwnMNd=? zmE@A=wEqwPn}z&`h08(w^2g# zoVr496_r1uUeWZ14e9q|__GXMmXOy?G+QKfdgyQ&xr9K-1?bryZFk!tXc57}i5`b> z6EayT&XA;&L7JeCv|Ls-Y|Z8+j@BMEF{e&SyR#=vSp%nJM zY5=pwit<&5B_%1;Km&zEy`RxZXrpnwP_`)2`@x4_DI=7(ywAqS&v_5U$;a;QW2X{W zFTTmFxDA;^@qlz0ieZreu%Xk&kyheIBLUMPv(WlEJgP#g z)0NCE%FsE&0YG_8ZmO?$CO$XQ5f^QXiKmPQYI(EL7zDFX5WQzsufYO-z(P+U_O3*?;ZHiL^jRdl|1|A`sTyxsBa!L|odYuBBdJ$Pix zcV5UF(CLc$Lg|lhZkl?wX=ab5^IC1v9;&h~@uBX|XZ2jMpl#>#?Yj@=pMwUUE5Bu* zg3MJdbPGNqozZ07!+=rn2)Z_%o_anSv{bfLg*>Zj=z9yV`=f1gRpNCm%qFVY!cgK9 zc0LT&2C7G#fwgMUVWQxql74o5@#d+Iv+JL)4}T*ma4Ho9r34PO8v41lVP887(*s{n zDMSvq(w3+)5;>%$J z1};4G+u_lkjD~Lvy!f5BhU1M@D<`Hm+E^Ccd}GEpV;2rm+KgW1k}J)L+267I>-ihr z=rDNlu(r`l4zz36`UPJ8{b%=;XuCyqb{Z_r(``&3WKu*egaoMXo zW=vgUi{*EC|85(-OJBY|XT|q3N4>XbW$#&C>u$=)d$~{9?~gvw;^>Zr$GXa6oa6gTeYmWW@*nSJ-B9zHYn=|U`odys(4dTqF&{A9DB3d#bq0q-{aPw2zEt5M zkPL=U#jD%58USU-8G7WpL!M=?6x zGLQnI%2cIDQ5Vy67m`;dB@KX+u=%NSnk$Q1rsK)`7XL6MNfcw!;1@@5nMWJ-DqqO* z_^VTPD^F9GCUtDyTR5`c&>^qCE58@Jnnmtm*?XBQKL(AP8@y$eBhnqt)dF4;*Dm7ZCty(WIXc>d`p z8Xq5V{s(V{Nq)KzMQt1&mY^T z-)R2hnB6CaOq)HTPw$be4iA3o(@)MF{Ot1OtqUqmT@4Fhm->xj2iF7vXQJ{RQVXuL zBf$aR&8CtVu84U86+8?+G{ZZj1;sSPHxN#-Zm@MWroh?PtX{R|uMz6cA-i{nF(>(L zFRN$ePi>#Tr%Ka;eVKerj)+u{lnM@n5IlD5PdYlt$aEur$rl%pKi$Uv*q-02#nY{A zpG;h_a>CQCpKC@mKT+K;r`g-UkByOPX-cdJufTGp*@KE0x93RL8Y1;e=B%DJ5d|0` z>Ok_-CX|5)OUP+cy1qDh@}bH6z>{_BJoRMVj3%}jFN__xchaPe=}$Fzsp-?SlF904 zN(0+>;Ic;I7D$=}0ZTy%K~VX)38L``-XdWU8E^uLEn-ZE$gRffOEmJPLS0vr$?8!W zOn$NE6AgBQlsk9z81KvD?XvJPxZ8>n2+ zsSw!)gZp!3kj$pEA1M(EN2+zaO^zwkMGKOL)}_I}Lr*F^OP?$Mzk4}gC37*6kVoR; zHg?RLQKGgET)kHLpSD6=y#lI+T)vDqWnKlJ86XRP6MROjWCB@JIK#@v@)fbp`U)S644M#(SxQ zY*D;konQHLU$0)aa`Ea%yj`d<3%d=QMeop_uPKS-q3Wm>rn&*QUt)%eq#R=MWBXIoLl^V;IBH;yLr%7w{z|8p9&wbX#f!Q4p2)`3)k)NqK#P0OEC2`Os4))U zsxb~=2@CbmIDnFhJMxRp$lf)fyB?6zPmv17_&)?@MJf(1%FsLGAXSMMDCUX|B- z`v3#X`{&|GV-_mJ;~4X1`v~idm3mle+(i9@v7`s?C)GMwSTaUrU@baNl{Y^Q>=D)UUdkG(aqJ}8mrpA>o_`~d6!JJy&20Gt)_!_kw zkcLVv{IPxu)mdbn5LE^V8uc4y(d412ebHhz0OkWg5_paQhrH1-o`JC=KiQ)1w&817 zf1-s~Ayr9Ig#k<5ef59Fo&AJ%$%rPG{0pg5o_9I z+sUK%ek@_*yAO{@RQeyecUXR(N5_T_=IdBrzE)NSvA!S6!|(p2j^*v|agwT)5mU<+ zbU0TRr$(ev04oCN1~pnbLH&@^nk<{{uP=v31;Cx@TDlWr^*mn88{<(i>dlBS0zq1| zF{Oycy}6MQK=ni>iW=~W`a5;!`jTzD&oAr;{`l8y*0z$3Y}Qx&arVP)xxhPs{-NL8 zgg@*Mee^VJ%V$nGQ^cq(W#z6lGhQ#5 z{>_3vSj3d!kSACFSoYKGl7kC39Om!se{=b2wdR=liw2B2)c^DM`fjh&vHbXd`X8A! zdd>0)OtNiMrqOE23L#Dn#$-gXeHJ!-V7sU|%^yC|`$ZcCFHqO2yVYV9jj_R^g|t!d zE5WORw*?;vR;l9w)u=8IV5UoLSW@E6Ja&u*2Kk03Y$Qn10m)y0#D%VZ)l}DS0Z0@? z8lu9_z7WplO#q`>OZrJCM@hvv$(GNv$n~^EDP=Q5zJWyfS0}3M( zbCHwwk-}IL_4>U}dyZ;gZF1LY@t=OlF7b?lIXRdU%fNk-9nk4IlO&{N z$^JAwePdxug9|L(dp0;?w1YHG$M=toWPcuIzm@#+nGXd*Z{mh@Z@$Gb2!BQ*A4TNz ze{p+%-qhSYC~i+9bwZ$^EO3b3a2c?yh}!lKW)=t)PT<_+Aq)e5pvU2M+796_(&N1} zrfWsmbjDPA3vvt;XtLx}++?qrWB_T&|4EfoFSr<2Lgp%vrkkivxhv~(o2i_C<-Lrd z=3QZ>ZCbMs`umM<-#_uAVyocYX()1qJTQA5Kuq&g;!!yirN9~_HP&Z=Sd^vE zBL-y|l0%^1P>GrpEF!2EUl;0S+RH9oV$_phWO80-+ zB3?>V1M^#b7L-00CS0Ej6CUUjw7_qG{Qm-F?|(!1Z|I0hS3ooW0nMBsE!VpETCK%AU=ypO!I|>522jt9Mj9 z7SAethsiQa7IW{;pZSf-?A-okEaI1qKe3qgZ+y#?9sKO+WvBTE+wR?@eR&J{k1HZR zm?FKVp{<_cgNWWn`RK}m1&a|T#HFD$4RNVOhEQz-Mdo`%0uAMO+21;{N2EM*|B}c} zc+=7&fsOO@CH{gnhC@sJI1ph98k0|C>95tZcNnxo#u;=)jy^>3zEMW@D>TYzJO5`@ z(1ntcQe`O%dGI`=&8*f*?<_E1pK~ntfkTaCJK`umy zffgeOpt(Yf)UQdPp;VBSx5db$w34r}FxwfGi(0l! zSeg!$zvsk5yZe$Xn7GsbgFnZ8vGfZ6%lr4jmkLHsS+H$e#TEPJZQe3}!R9SW8NdCd zYt65(F!!HbSO>QJp^D8LPF+|vA+2cb?t-^ob-r=-gX3$8V7F|*&eTMpn`S~*k(Ox{ zs#YWF!`uM5lwOVgd!b$L50z{2Ol(R#f-v#t<1rU+Q~bVoP-uBP=rS@M44fX{kUk$C zKRsR^Wf@cPUx!JWX!pMilgx6bWF|V(+#A^TPj7bV^wRjxPw`TgF=q77{A1{azr1Sw z{N>L~OpKq?ZPiBhIWO+`+^Z{D9UElTTBMYkVZGMqp0O~$C-mUxp3;nm7t60JTgrOq zxq(OcyXp#oy%_Ql^*AYX3QhM6)772pT-+CcKvY@ORuPtiPKbG%chUGh0 zdn`1e3TR`Er=AFvVZbItlW|}fMc~KE|ABval>EbTdNDl3k(R~&-+7A4k28yA@(Vw( zS^U-OEPi^?G*p!J zHD@wqhO~;YLL$MIH^msChWy^+e<{&J#VVRVeTj~|CAj5{m`O; zgJupLU3B^#C8|~DeoYtc-ut1Zbfc>byBjPuHF=E2 za)m))99T9q;4wO=c~J`%Z-ChE87j?-igoVEVR^Ak38Su@N_m_^UJcx}snH zRGMNtqsx9$s+Upkt4=}aNQS4Ar^6#|WPo7d9*d3+*fGX*(cv^*^l0$;U~FJROcymK zjYeX==>AQ?`)KNDISm}e2iR`JCOO#9X>ivjtAf&Fh;7L^t8h+?I$A>}dg3Oa+jKpj%X1MuQ!rhm<*^N0~t2<=gd zMDg%dMSQ(7PkF8EMdh{C(7kCS8(QQ+lY1;X zAxoIT zCeayZp4)R>MGF=z8$5wTvxxQVgpKgJadJQz#=e~K&U)5*zGF#Pgr>@KT#=CQt`_rp7tV;G<)${bWsp`I}WWQCNUKRG65=4Vwv>2!G)F2T}!`biz zKXa)iv^yLxw2VM18dG14kUxbLFeEIf_cG78pj87sGXcG|H`%Z3$M{69Ap`klb}SZ=tMvD>Y zD9}X6)FpfmN*2S#z{3}l~Eoqr4N++^WS!H|ZeGYn@7Ybt^@waPlvRYrMF<%G)e zsQpJPpRY{xT6te(aOnBUU*b(GuS{5}Ok`WRA$>i(@^qZ69j%PmUyM`Cki3s?E8pjH z{nr_bRMim|CpX8GMUQR5@nP4vckHJtF=f#cv}C}{wIOUJ9}=<#vlhGW?9FO0soJK$ z=g_Rh!VLwRUngyq22XkpsFj|hF;xrJc^8!&@xHi_g<1_u z$f$|>F{iLy!wfmOt^3~xZPD1N5X8=IcCO-8bjr*Vi4xeJtrI1Ovz%NMNf8n!tpupiK z$h-Ab%3IhP-dinPoqt#k@%{zD6IdN9_d@az2UnCPYhhwGspN@!00$fDPprkzKH5=# ztx+WXRnaL*!Jx+D0QsO9H7?AI*`+&>5a_CwWjfb2D47&A6Ui+E?H8oKs zj#=Iw)&|#KhJ9*c8wW28&x`Q6MHUh3cf^2alSLqKOR#4uO?YrIyHlilcISd2^K7GZ!G5t>AI(5`I)(q5k|8>Ml=sJ@AL_O1EEbaC+ z1G_12v0iFi^O;MR&g?_aORUbnWsgY*aGeA{Ja}#jidc*;V@kA`t`cKkG_b2u)SG|X zV*2uNeef_$taN}{S3ZnYrAilrsQc|ALuVvDe_V}|=K#u7=~5Vdeu<$y5t5)fza;mO z{=!{dQeEHVOq$?ggWQAO{nymzj+41clfsA1i^4Oi3`Mhxwi^1`s; zooGEP%l}l*;W?goTA3aw;FqW=FGE@Vm}ZfgEA{4)K1)A&5YsXOQAKWvF|($gw*&)YKp`NG3iXs;ML`xde;BL(wEQFLBLMqU|N#zD6KNb-$ z@?_j19*tL2A0(t7j7&&KNKa6@nOl&lFbI=vFh~FuGnUvra-ZY@Q{}a!kTk=;D43D@ zd|FXjnWVJkGt~Xt#`KGsFyRjW+OFZh5LWf~L33k<4tovxz3F@gn;}q!V6b4QacUpyz1-6ceC9%iwS76CvcKp+qRn z5Jo9DNHGqCgf|Y7@eMr$Tl^*w2lTWyipro+1E~=-LOan2UC2!J$7qT-mm|Yzs~q@N zOG-%uO=+o#6ecF2g!wVXL!YTvTYnt1@sK{yjxe!ZnU2@IYvlgkvBm7s!$s>i7H{p* zv3)nzqeJ^1{Ou3C`-;xW?cZYS7t2qqJ92nyw++RIx7c19Jg8^iUV{hszPC;tc5gWz zgR(>&N&MSi$yaH1dlH@dDOk+ZQAG3=+FJ`^BC!wC z69w9Ed&3RRgkGmi2K*UgI3J!~PAkG3II0K}#%PjqZDH2JE+dvM9npn{uIRdw&9o)) zacn*xFIVIv*%I$fc8WjBPPGM%@09bDA0d_f^V)^H$5^fVv=znLexw-#avq-HE5kyQ zln=!m=8EtqgY@a+n15r~YQj7-a(EWqXfb8PbFU2}N7#1;arkS_P*-ed5f}zxYCKQCy6P%`YA}^Thg$!GpVFVzbb+k7GsOV?}XN zcYO~nX-G@Z*5G+T#eP7eECuG+w?aoCy5QT%2r^0#^wY;k>#hU2z?izB)S1%i)Xkek zd-kxB!oI9_k*#;k#le6Mz>a(U&=YqNFqLWkwLJq+rlBuwlSv#IsJ7r;FqnZ|u^i*T zqT*|T4{I6U)WkteV-wss5YKS;vp9W|=(IEdroh}pUx9UB$Y%mc-ZwitNzB7BPtqn6 zg7(NfQJXE*w`WslfCP_luU8piX6iSJ1jD@hWC!4PlvEeX^eSL&(Z^kBiL`vw!z(`_HLNZ*c9myog1NtT)6 zY^iUL^)2Tk%*)d^JFxqhC~lKp^nUF4BxtnY(?m=auOU7Erpx72Yrm>PaYfZj?Gjs2$cS*6_lf8jmw@=Bdb+!`QnaMOE=4B<@&YjJ=(2n`k6Cl zo>5g~r>-IvWZMUQhTR1d7* zMg%jA+X(qd^omf0({z1^MiWLLSwyE09`!`~7N16wr!jFcBUj!~uqbamTbH+}K;E$6 z6*X_R%9_6V#@@|~x4yA=gQH~so9`aLUNitqYXMWLPZl6)9@ zdH?gbjTIU`l==DF0qBteAoWYn-wq|sZF&ASDn^siV9#c{9CDk%gE#Q`b~bSfpZ%qa z)tXZ36})0YDzS8tivFOi$mg7ywDLImBoi-5!9U z6dm}Ej4Bes;_2J;C~M)}qggLA&cL%{L?xcPG}TRg@v zbaVFZs`DpKSvIY2?`NKB@N8|+Y)3%82QxRKq5a$HWGXn*fZYh1!pbdV0Z24^n6TgN zXvPeDO0iMXgKV+=5G*D*X>?jHN^gCS+(vCq4Hy3-zWJzeb2rV-+i~r~X_?Qu+BJOQ zxn@eWS@P%4E*n2)?e_f4(r;{h*h7iQ?K`xd(hAt7G{`o=zvicG8xZ@QTeSMC0oXLj zMv+0l1cMQlkGzd<-Ojr4$K=8CVQ*7;#Z1WI*1*Ola7(nXkEiPR5XOyhbzw7rZMEul z@wm3?=?A~8e!F^kb*0eFLbT3ZhtgRjug>287>YU-IFduP9P3vmSCt9 z<;2H2ZI0}WoU{zXn2(8Le>LqpZqe44=dV}z=-kz_CwH&a`tiqFwPcMNFPJuQ^R|^w z@IEnY`b!&|J>ITO`zISeNBl>z<~L2A>22VR zf_K_RULT zNn8)UI4wu0E?iH{%jt-7_Sg>MT0fibDY%>NNwGA#XMNmro4D3(^R+hX0qd7fYuDXZx=mX*XXx z*$>Gw=>)59K;pl4glan5e$RjQAn6}mJN`bnUFsh~iPA3WurKrfVkv8bT8I085n=xW z6DD+O9M7MkCu`#u$ZQ}kHj!N{{~K4LXOTYbXoAl%mz{7X-D6D*NR7yW9}D-NJ(ewa zz}XQ#oZWx+Vrk_A&UX56rl0NbLo!G@jV_R{b3#U@*RQe3wa3+ zDzy2ap%VMHrnARN*@3f#RZC~v^|Q;r$Jshw^lL9JZxlG&f9)V0_HvXc$=w|UyMFed z@(}^p{bz>&c0+n$wYDG!QAmb>eHrlXrx5>Y!+jJYo^I=S6lZ7ZD`n5KM~z()W*Whs zwaA>+a0st17O*f9AdWmh1~jfQ01*2x|gim7O5jcLKzOJq2Vb ziy~;HE?CiGinyUtq>9-3!&c#es0bpsp}O^pTFOo z&zXB??wK=Z&YU?jcV_OrtL5Z{u!FS}pxq_R$sO`3)9k@E7UraLOTOJ_!`Smw8nlCT z8piI1T(X0DYX0YG+A#l;G;O$7b2|(5J6n^2yq}M~RPAiW4!wN5HTfs7SEFHJ`w*tx zI#^Oe+qB96C-dan=2jWTZVT_7gS^MlmUbE5M;P9hs+G<3Lw(%Vs314yKY?yRHhF=P z3R)DBWav{$TYE+XY{dE4OV!K^VE4Kpwp&&&{4wQTss&|NLy!-*+%eDk5f_=~;Jy^* zd7khBVW>XCJZGzK`6g7r?gaRr6i#uwoM!i7Py@m#GLhn-V2a62x%zK>q$q&4wp62x zr857IGx915%Il?O379^bDV41qgAzC&d#M_K0c_s|v60u*u)M;QeL)!*$}TN~03Y*Y zb+Zh@*cr$`@3_NS+xy^mw#z03e}-Z_kbA2glCZH2nr~N-6W)q*T+{-0X<8UJG;_Jt z9l*8!3T|c?*CVU#u2}S7TMSe72Kcsjft_o50L_I*=GoO?2WujX9R=SZ8?}m2$p=O= zstn(E)P*%8%u8}mD&{Xtrgp{|>bdMt3Cqy*kGhoYgQYwld#OU;AiD;XdEfB8>rr0^7FzslujG|spIOYz^0BchOFsErO} zug;$hh2CaeH~2&e#jj0Rk274JY;?R&P|m+p*`a!G9*G9~B=gR-Cl%}s2KzR?Q9dU0 zgk$Cts1<+mdx1JMqfnDKXoew5Hos-{#!H zPhBy=+$f2=%B1caqUQ3NFuVStZbl~9H~kEy!&(x2mxu6OA$)7E2@f#gt9U-sBVztF zY{F30|0gFr*o5iz^}nnM4>#f9e|-tlUqj#Y1N2jF-4766556+?m7H~HWTX8>NOqxq z!5=D(v4AEuwujWg|HMH}_f!9m{F4^Gga1#0Z!862YF7W5~7gq~U)rgv)gJfA94||IUO$xuK}*b(HHQZQ}6& zKWdnL@<;r{1^EeB&bPr1SkBuj`D;<&NiJkL{jGu;J=;nbei2GeQ6{IAR-&V`39~VS zvIKXMaQ{scrUm>D&uY5$*~Y>KT34=G&}?Bttt&hlJ%7BEEB|hE70`7(W(??huDst| zM(UCso!CFZY?KMlv~A}b8Gq`$=k6YF+BHX?@e~PW!H1O1s_d8rrYvV0DP^(7VHlj*gC_I^Njvkgw8rnQy1> zc)C0N;`Alyd(vM`|0Lb+)V9+vJ00!Zq4T=Vr@Bnf@MYYd@p0D)U7zUsdbbJP8oPJs zUfli0?yqz|)uTg?Wj#*!T+s8wUW0mF(d*Bd8JTOcqOvNp?#ueP_k`ZR>HT`2*glu^ z@n>Cy@HNBtgx&t(Zw~)%MB0dvBZ@~uwi@RK0dGWe2kz>ln{4v+c?VGzf zFD7qF-sO2W<=vb2r@Y;Hhw@J3{VP8qe`LNs%JaA9zncG1{`Up(1w9HbE+{XURd7wg zT?LO8yioABg0BiA3)2e+7giKrT6k^YJ%x`IzF7Ef;kQLmMV*R<6jc<>D!Q)d-lB(! zb{4%+^l7marxa%vk13v9ytw$5;tj=57XP{Ulj1Watx9^7TwGFHa(PL8$%CaarOBne zO9z#XES*p~zjR6IHKi*`SCu|g`lr&zOLvvNQ2J`=o2BoTeq4I8^qaECvc$5~vV~<= zmR(nNZ`tOuC(E8Kd#mh&vVW9EmnW6CEALW1th}mxZu#=^0~M(ioho`(^s5+JadAa) zMODQ_quq|qiQgxWeP&wR@YB+keRCWyHYW7e=fkS%+aJ=-9*)Rn1zhiibm&-my;Y*0 z$jzbtMf(99ak9a2o2<0HkgKfgWTERlnQMJ7v(zk^?RZ9Ra=ap4or|TNb&Hg%JEgs2 zAoH_na=WvXU2NCM6~G^XDZo@Uu)9 zxoqj_nkm2Z-XVRxzn87JF>;K zOz!dUg)q-v_R%Ivy!#~dT=Ed~?(%e#r(A8M7Cor5?v&p-C!te^q_^8A$yU77Soh0% zs|wg4nXXgvJL`8`6X$$ey1V`&Gp*f(Yh||k7qZ@czuaMcCmq~_z^ehuWTyMqoM%cO zYmR+_@ND;f>E=F0np^C%hV~5E=)9eDx|`W(x*F4FTsf3$l-#ay#>m%iTdnl{YHkn4+TII_YRcF z!8%>Wxe^$u(*l!#YG5c(0Tj8q$TrRz=YsdG>#57@X?s2y=Db=iG3}go>zX1S-QF$; zv_I4Kbo&c}Bg;NY`}1@D3^+_Z2HKr&do4k?xfWpBoNiYa0^QDNV=Y1bVDCfU?&17b zU{|<(={D99Xj{5{g}}5e+Lz%Moz%Lf?S8 zuI;=N`}i>S^G@{mVfnST^`7}nY=Dj^`XQ~UI3n9vf1{59k5Q1*x>?=MC`erET>a74 zj)AlD4Y^dC{-F8iYPmRgl9Up_2S`ChMSEtGPT9(J-vAo>mk($F1;U$6Pa(mp7k^0jl+`{*`y%8RA z)!9KnW8zr=x3o`$R}+AFC2o%{4u_l4I9(AW;x0Wz_~3>)bP9(<7fm08blJn&_CM@nGSz-ws_f^;B?n;Fi9OLC+O+ZPD`%fP`-I4u zYk(!d&@+!8J#h3z-0q`0k3N0$$)k^d*z@RvN7o*md$ivN`#*U0{lBVD<#Qt&2!)Sg zuJkO$b>SF&p=Ti9Hp+ZX^uG%zr5wtsm^M*vxq+W)#H$3A$nOP{RI>bvemsR=rnFIQ zRjRCzn^-$)r`oekzoYWW&GKv2Q}t4rDogcNePpHF!fJ0{)sKx&1Eih}{nJ=`S)(qZ zw;im8@PsmqFV5X7Yt;z;?lDq+%li)NR1T}A_wiJ`p7&($S7TVodO+o>Je98sR3ZOl zDb{tw-wjKR4s4b!s*Gp(t+Gv(GaIm-w=ikhf?rY6aLzhsv9BPwfHH(y=5L)ka^SG3<6;hZ)#%dawhzP!1)elhc6}`b<^>6GHc@@fX8B#2B|g8iYh}&Y8vpX#G=ENRZCZM| zFVDZXvc|tRH!Z!kHp}l0^9Zlk&TSLm)|2UX_ssHp0~E&9_;b?yQd?iI>5Z%DobF#< zU!PV_2}0q$=Z1IiBFH%iJ5)}~2qciVLoKg_6sOMVX*!~FdgpXFtj*2xM`V_atI31K zbXbhc^mot8@<(O*dvJ=*2T;ij9`Pu8dO~pHUsci`g|EYwb*%@i^;_ZbR z6b|d1p2X!-j+(;3-OZJ=YRrI)6dh+xEgRmet-f*%%IwrOPG7k%pOW7%O<#HLxN7py z&icxG-R#OCsro8neBPk0hDzj>(@O@m*Ktud&MXh$MZdGHe#USe7n2kp9pTnjvBUdy zYnPy};&KM`Xm8TSSB?&FCEF6CJQN^MZ`($tsw=il)86&k>yxUMY^%`TBJJI#y)D|a zwbwCKE!8QO>J&?Lily7)I_R|8JEgsj9l)EWz1y_+SMAx_8`S~iMcV7*18)(YHVQpy zbIYZkFUuU_$*Ei>(jQNkY8l`dF3&Kp#Of?qNlnuw$#I|foaqw9d`*&dtHjfHCb`>4 zvU*q&+Q6K z2Po`+K7Jv#SkXt!;I8IMsD1sa`Q{aOX`fP7tfc}*^6iWTvF%P zEm_D{T^O>N*)x;s=d%_sq@;l^P;pOFbx35)W^yVuxDPt6jH!&NbgXpTAKfW>d-R%^ zYRB)R>!a(VzI1NX=jb)j8=ae+uSGx4?3p7bDQ2FPWTnP*iWw9$-5MNq%-S4vEb3TH z_n1L^kI@m6@A3hIVg|X!d)s;2x%)-eyJxz$#Uy#g8>(jv&3ex|Z@cJvFuHo@d;jQt zC8A$UPQ;RknpDb0&q1L2gqOs*;gSm8z0^ z)p$l5YZc!}Wkge_>KMb!K(99-kHPlayczknthL`(#hhKpAPH-c$bY<27*(Z!mx89Z zvVF)V-cFH3Aj7U^e*B+CW_kAeQowpgAy5RA0ONoOK(&2bYVFVY2k{A3!%oPp#I1q; zTHtA}Ujhz6?=9dRe%YYxYUKc&fCab!H;`t(ui63afet`Nzz3w;Csik)GtdRd0D1wL zKo-y&=mTWipR2w=KcGJ_z&@b{0>hgA$=;D_MsZ216nd;~stRB%P{sZ6oF{RvgHOE| z{`bu04Q35?C}ZehtY?g{|BmzyBfY~a)&4sYJgjCA=LO3T))!#B4u&5LKNzor;RoY& zBp-teMzhDV+WrXJs&z94`!^b0tR}ZQtf0>E6ZW_Cw!f4i_LnLJXbrRh+5*FfZ;u}H zCp#cOk8dR-=R%+eC;=t_n*Obvp9Wq64ubzCa2Plu@yPK6ay)??Paww=$ngZSIDs6r z3{I%Y;7kFg0(GQMAeRPmX&{#da%mu!26AX1hX!(JfMNp_8=%+##Re!gK(PUe4Nz== zN(22uF(s~{mzV@a4_ebe?KMz)4b)x(wbwxHHBciB=w-aU0^M7IzN|oBR-i8{jBFZ^ zO#`xNKsF7?rUBVBAe#nyI=6j5qJY8nL285f9{XErlLSPoba3 zsi}k1)InJf-Ue##A^StwM7qu3`N7%7`ElS0;7Q;qV28b5c5;3O*bVFjo(EnA4wCnq zz+vEseEv=Tf5+8G`wKMUpenJyRprE20#(G1vrnlBTu%fh5uQxiDZo_V zXT;5*4A?CDS-97npMvve;rv;+-490}ki#i*I0f}*p?C@^r_h1HlyRv2DRTH4IebdF zzar&vQXZ$wUsL8UDf0=a9H+crLFsjP{uDmHgwk>N{2JcABL7c$rz->P=>~Q$pg%y1 zB8Q{oa1`nv$c=|>sp^-jtcNBQC?UmWF&qkM7Xjz&lnWr+(& zTVg54ar&-J_6tz>D-PGxqblHz~0pDSlxYCx>WlZ zCHf3{A5)@Fpm)ra<|C+R3Lin?7!*E&!iP{e28CmW!WPcku|)f@fdL91LE#u}ZZNSU zkk}f|Yq^_hBz6+o-!S4Ci>9G*w5?ONdjjP^B`}VbPLZGi(n9QdiZEm-;(EPV`? zJ_bu4Lr>bM+5zo>4nRl12c*+4bpkpAU4RUrmwg0Vd<0v31Y3LrTYN+fKtBfprKBkX zr-Hb#oU4c%&v_E($>cKymg z4{aTQy&VWt0a~vnfurmG2z7six<5kQAEEA#Q1?gBnIqKw5$gU3eew=_C$cQXF6c2~ zB{0rjE|=KMP*e6^_Htyl9GNXgX3LS;a%8kzRde4#+PzTr)ALPY_U%#oEn=P~=lkr< zvI$G^7#47g{g`Yer#)D(7wC)j6Za~*>6Xq|ff`COi96cnY_eY>{Q<73?FGcHk_Bh? z$TdyZ$_-7=$jx>yxy3Glb``W;&^ZB{;K8D&jwR*+Vm86$0q)0OokkV0w>GiWE-4Z3n$Cr8P3 zui>mmN(-osYwW+k`v!P_4&L|5+w`~&Pd!o)?=K>s$5c^y0bAHV}WnXV^21g@4r3JVX+?ypxAqm!Q1%n*c)yBU4Wh^Ft*-je}pc?XdGywv33@h ziT0m^sWuSvJ9PLi{0Hr=_HDF8JtGotud-hZYtiEpXTQom^XrIjLkiXs?0CTFR0u0T z@xSx!lUi@^ztFt>xCQ+*6(sbjNom>`3bvI%`nR!5=O0K>ANEawbF&}RKJ?YT5`7QqTHro9qFWt@y}#)h`<=kG2@h_* z{;8|x*7IWwdyk=V2#YE9FYNgJljL z_T8bY^UwdiY|n2Efx1T)U)YD~&-4+RWjrU7fNbp-&xt%QK#SXdUQ{s1_}(1B`Z%P| z_CZ?A6ZpnnUnrg3QODZvUg(~=^Y`=b*jJxVt!2HQi`{gZ@q{^a+q3s--UF%WB_+^4 z&P{RQ5HmhMaoD-`Zo5Bzi9OQJv=@Ws5s%%?zB$yInE7?tcQ!4v$D}e|6t!?$R}cNXooEiG;4w0rEA{;7+Xhg-i`5)8>}cC&x<$*EhdriK?ZYi7PD^y z^jr;dvx&^-74UX#5w4w?&uedH@;aEAyiSauCrW4bB2SerX7;X|Sq1Dazs2?Bxo$o4 zdH3^Nm&r`tCT0sa@IRb9M&P26-$?999?s4DWj-}qfJ-*g^crbeNV5uwkHa~cAsr8no+E8#BpZQb zC&R0rBaJ}DQ)zd4j?`nM+}_AH9_emi9Q`n^Ju=>euch3^NIB6+*<+;K4k_=Y7N5g; zjI7%s>jTWtzKUyO=1yC)T69P{m>Ja8)WBO@>pJM5C+(SMS3GMwlt=NIHsw`OyaJHG zEURKAxvfMp*P6-`M4Ix6TcxXXR*>|(tCyPV$>#lDs*gCSzkz%NYmgd5+KZTp?Wl&a zZV<^#>hdBdN^Ijt1vq>f6P-abRtskQv7!RRj;k%s$4jf?UE3 zMk%WRZdJz9j2CUFAg@YhaXo4*&o;?sE;oYp<8geuZahyqUjFJbf#;z~Jat8=$vkhh zX1!t>x#&4wuhAYo^F708PlC~&1fxC4=t%Y`wYE8#p?@AfuuilO ztxKVezf8>Q@4e>qjL_UZ4RSt5k}jhjJA2uwhXjT z>zUK&nWeH-f9g_eo7ZSqJEL1^Mz`EXlN?5e97cyCjSj^b9r73*QvAfP9BNvVETc(I zqe;qWlDCB>DWgeF_9IlI{S(zhQfaO78m&q&`lQ&M@H67|%7M1IdhKf``u$UDU)lOu z35#u`eR{>qMT=!`51Qo}Ju%NG^T$+;$Iq`C?URekDoTA)Q$D&HzpA1Pe|%L5cTIYa zNpFQIXqtglG$(QHAYC0Bz|^sUyqe=2;kd||3l}Yrk(Vy6n<2UL=gzK^a^sIT{`C0^ zmoAVw^B2vSFAKR`EK4raG0T={f4SjA=j}B4MwqZ(#nWGhav0DndV%#qUFN`ApY{W| zP7`AxyA*nta@LSHv#Tdjb)|k5gQYROfE&>6FGh-ixE#W)lX5Rsj=@1OD@Pv@E^C3) zt_98~2B%U!2B*?cE5;Axpue^st>(*FHA`KpW~(`BuAEWx6f2jse75n^e)JRW5ArW~ zJtvikOT%uYNNe=Jtx3@ye7%OQQ=e%`RnsJ&W(u+B;#@V)VCpqcokHgl!q8>kPlz=q zt^(XT3Gr!fxzvR9ms2%|@8LvF$X5nCRIcIh`?-8Z{7Gq$FZf2tDQPq~A&gWozL90D XS}&1r7wt_lv29I^iEZB46WhG8t%;q9ZQHh;Ol(YSPWb1Ie zcb$Fe^zL?300IGEfUjn!13>$4JKOu!{~z;T@BeQSV&Xsm0POb{=lF$6lu8sD2}K1J z000~Y06^3R0Px<}XjqCQR8&O(0A!OdZQR$fEl8!KM1q0V~uu@}? zp*;YAD)y!8`O>*N{dD|i?CMMc0HA;S()|1nbfwT)X7=WwFHYl2$Nq&*w|@o|=7vsR zUW~8v0}%cP7y!DtjfdG6mk9tUSpoprji|Q}h889ucL2cbD?UK-m)E^%q@BXT)bJ}d zv)nI^<3GGv&3jsWkzd@(SD)ky$>1m zU)b0mgrf%;x_`w2GWfq<5{N7aSX)Do=@;k!#eM0(obgn-QS9xUoB;q^#V-#1KkX+7 zU}EoR`sKC#iU;uYrIX4xdl_?ILmUi%1UCeP>^{ANkq2;CL|`bck;2J2_=}N)!3D!e z;gL$&#_vD2&I|-$ya0NC^~a&Am<-dZldi|c*eio z&pC?=N&X%)7k<}ipSEnv1UCx-l^R_R;d_Cz1pv6O$<9JVQ3#_z?ev%(IkZpftT%(Q zLF-7<&7iM6F>Jd`) z^%XG;0Fju>7Nb%~6`6-ks6Hz;ptRNTLLP+Hvdggs4$8RwY5oWAvhYGF^3V7Ef&qpm z$x5XT0wgXzl@Ptcz*8W*W(*to9`qw=lE)l@xv8mw3FOrf-(2fpT1KY z7Y>PX@k6jfm5s^yyxTw9%5W2u6%AVCblz2Dm7$f$Hu0IZ83q~Vyhe7tb&pSvIm2N4 zfDt@UlqTknq{)+wVJ@{BHII06e)Cop%%;+%bUeN&{<9O6qP?yrM{%kood@$9?P=LV zd3L{))Qvr}B(J}*nRG7gzd^Jv30q7SVg3w&1`-^_+1a1R*Qk{LNKwqbk$rOwCdGog z$;U;D4>=qaX2?|Z7irDaXw8#tE%?FH3y~F!+zzAfEb7KxQ34}mhZ-jS9mZOWX~_^; zq!xbU?|I^P>=JPzh8?t92h3%~VEoo!Xd6R5jeTT%K(EezYv)1jPEm7kb_sPya(E4_iX^ejuk#NafY{{JopL}&oH3IFO0v~({Z9H5 z7MUx_$Svj}YGIo3*1d}(o$`%Q8kHVP zab)7nNoqh^>aW#fV_RCgE5fl65+D=Qbco%LNg5!mv{DGia842%KMAhI5>5*<^~FmV zet4vAY$ODOyL*8^7oD$Bst2m~Sf^cE7x8`P+jx6VT1yl+T^L;*o^>tOnRAZ~iEY1` z%>dH5c+_^xSG1n~*eIL}_gq(35tjWN>z~I(>a0R8tU7)?b3;6gFk{??J3qiiD#NhZv&afHR7Zr+$Bw_%(&` z_9>xNH!zv*k5`WD$jY7SqerN$`pOZ+qw99C2Cq2fttTa`7tdhfDg95-WY7y=Sftjae z3vGi%r}JxiyYj&F^s<7aSAw2bFSKI8+*k^cw}d)73%?5F)iEEI&4Q&+lh&NpM3g)0 zGFJ1qgIR`ElieZ%f7jrDkguN!kDUM1SW3?v_rCd&dHuXC`w^PhDebdd$~c1ae@Etc z5;iIBp9EIlwFHpJfzs>3fKjrTtZUcJnRFRwe214E{2Nxkn=hG zgHAE=G1f_w2V_PB=OM`C-ZoR7SIdwB1t2fT_e)PdtGQFcxoktaAl$*D@5;p zU~IEBoQVFfS9PI72ky0fkZE<*v< zH1`d5cZ?N>QHjYo(aX@hRK82W1d2HM>ry?Mgz!qD)Yi>BYe*@)3~+8uYdtLr|rUO>)s zn3Z7F+5p=+(V`#B8G*z@(6~1&^F4_?UjSJgWp zorz|Qi)@M?L4`xg(xpc;NpRlekh`rC6^;AmYRrs#*&gu#@|$QDz2X)ceW-fYPb0*m zieazQ13H@{;NZ2>U^vyaabdW*ef#N*h|ru%1ecXsw`#M?27{X2l0&VBW^*JWn#@AW zWvE7ZcN6|>%bN;DRg-zj*o^_(1SV!+DEDFPiQ)4ID>gd&sRC?`(+>e-tnNeaw_dIX zqDUR0!5!2d3rwclf;nvmqG=I@Zw9?^YFd%{MroL}3982s94mDZp+73jvrJ7hVSS#) zjuV`v;U~@Ddk#bZ##K*LV+^eN{&axi8wC^^aov+KmI?e7KrP&o3frynH?NVIx6k~WzwY(pZBpG@J)1e_9SW3P)ZwF8ATy9yMDazXm{;ze z48fegw*_>d(si3a9xWU95x!cx^TPD{8NAG~$5D#_YzPn41P3D$>#zQSK8LI^#D=W^ zs(I%Ui{|T=KAIH`F4duD;Q8PqD{&lJsan3f+aMRanl8_2f`Qp*i(_GE@j^YeV z4af$DRvgDloqgsJk>!V>x zByk1pY}2%EOE=F{YlgjUMHf4AGkUE+bc29yQ@3t@lbCK3f;^Md9CKXFuy+kXGeatw zY4udLPPjNd)lAbY16!Vsb$M9Bz$h=e_K&Bg8AY;o5T=@O5n}DQrv~WVrk)_<#|##J zv>n!72JU0s_LF}RL8G^~E0=)wK_Q~UctmD%_diF0?v02~r0YT#k1efEi>iN)?A?4A z`qLvR8QxZM0uA18?PE_%yU-QGu3Eba)+2#hyTsOaIZeNW5**3L>1J}_XcHH6f$_sX z3kus$?@RL-xT6=ifW~e=EZU0`=Mbhy7e#*Lmkw#ks>w74$EaCAQdIq+9oMQ_bZ!D# zOE#)mmsw{m&CPjMQB_Q>MK!8w1#b`qa63p*PvfL54VMZGfbf~X@9Ciw}! zMJZ!6kVok8hcFmuicyB{9fK$~tYBNxT9>6a%weB0I8Euq72f#_$&^%s%qy|@i^LQ< zr|}CrEsZ;ecng(M-M5tmYI%rnQ7!)@-?kNbo9iSl6t?wA-j@!b1`)N-+>0 zBt)MrB-g4o3zd{9rKJnV#if49NGt#TeOimu@v+Y%kEe>6U*2~t#Zz-vsHFP*y_aX* z;OpJW$iT$FV8>_$@;HJ3%_%&P`c3t2_3&RpApCH$Rkn3`^!r=QRSZQa#Y{f|_E z{bifDN9f(jL=8suU(TPvRy7?>jp-&yTbC$oEy=xfASHscO|2C6=TN7W(_IRmrhL)@9rC%%1l=#|4q`^g(L$ox6ypa4~K_OuxNE<*{2#V z{nx0%nQNGW=qA)NJuSh>QQT<8?C??RC2fxr$B2)_(De6*@Vnm^abm4Dy8uSK!TZ6PGaLxcsHE!4IWTWM_Q3?j9UlpGF zl-MZprCnGtc!R$ssrzX%0jkA2rAXgHyzInLruPGkIQqGRzdy`zVd)m7``M{foit2t)2;ij_z8!@U<}YckCk%qL*yrXe08F> z*=hTsR1@9Aw{{^m0F&iUh?bRZpY~Rj><2aF z4B-y$bx!y`I7WccZo%*R-wQ$#_i-p+bqpbU&a4KP|LO)0iBV365cOx7`bmfI#&LZi zOpGCTX050|ydm&NAii;>!*Ii3JuGFqNj*(*eSf)SafV^Brdh*qJNIF_c{iku#&M&# zjn-r`MY5I|_xgFQbrGvtojLpKlEy@U3xVTc-GiFFQBX9;s!e27^E=_HEwuTkN{XxF z5Id)nCkf~N#SymiHYQ7uZ?8y8G=6^L5?!&LCq9e;qS3d&f67;h$mYLK zhch7dM^oCc#dPizp|Y*!&ZYEKXG?xNO6zK-MhoB~&HF7|H%_k>t|$iObpgz=i(I%^ z^NH@t6E?RV{b2+KoCawZDsoZjh=KIqFWAjLh2QW=j*HkC>kpO1q-}%>zyHNnHkw^b z+$i?V{~iPp?Q3OU%6#omSOKpmow9B^Df0N!O@q5hW(j$zh8)GCjs6UMiRCuJIJ&ix zqN8cipTcMis*i{C4r1UX9QVHm2L=EKzyQEMKLN;Jd8Gxdp`!lkx9uc>W(Gw%ilj6j zjR(HgMM!wLI>Z06gH_d9l@D{NDs*-(a(qphWkGkn*oF7>R@&&g&_!@?EqDYa%iyb@ z^LaPQ&&|ns^tQF_@q|f^152_&Nkig~02StMk$N7@lrDQ1BOR;+M%*)gx|pj+=9Alt z{*IXtze75PjHF1_OKIS1@2^hY>wA&}9>l#%;FbT$fISX z<`FUtf|SCqZz|&T`LPhB2Qf-jN7<%I3;+FN&(h~_f$lMKG%e;`SlCR{T(wPM=U6%& zm31o|TT0c4moqZSTHH0$?=Ujby=VyjxLeNoXe>W3y66y~9i7VPfLZTa-MQ zQHj%!^7u?Y^E~+1yevPc(`iy6*!~u+i4L5>iEr_ceP)(XO*+Z&k%>G4myBEZ7xbI) z;+JGtsPkwr5)&^;O|KY6`d^pY@Sw2?7wXB9U{iNlBSp%-<8b&io+#;r*eu@Hoi;M} zoUFnUUHelP-k+P!=I#xU(4W7vz6KQq>%^kK(s-duVNnODywujsjHdvMwLy8&PFb{P z=bMy#dKTL3dKj{x6m^kSbI6hp)jKs; zEDbeRl{Xs-LY_`;&yVN$@neos?DW@YdOB^&Hb8&E1av#13Fcm(B!)I5g#DGGANH>1 zi6o(@S`BXe=0e3dq-;0>xH!W1$K#VnlLov(N#l`4)(E|sw&I7ORd$Lgt|cpaQLL?o z!X?=}m6;@e^A8oC;uJ8ts~6E`Si@6AS%)Guq}m?aAeBsxTK{O80TQYckq#$kC1K`T z{eiDR_Hv$i+~bF!j2RjsX3Y3oLAd1dc~?R+)L?BsFZWpgV7XAtzvX+dz#qD|NAUNT zWd%>y%}tE>yZ-5F^t5Jek;7{fO{~DpkV;}LpY2khC0%e$NcHJr^L9`yVk!*GOr+~| z#m5NFwSaQslc7Od&yDuczRbK;JDebNu=qXFZ2}*btO0<6Rupw{pEIKY#DeM!l&O?U zxg?J?dt(vwnPPxoxVjU0$;W*tT*q$3^b+KDLYpeof6Q|_Ns7oz?C1{aYFjLBU~kZ_ z3}+5L&eSxEfuf7G9IH;SIKaCCyNOQ|rR&rJ64?a;vS zX-wAwk`NXq+$42YLYV|k8G?$j{tk07@u|tkkV2lhb}kNeq}eL*2eba>Fr}t*;Lc$6 z{UE=4tf3FimM=1YyWQjT(;gj$azwp2P)DHE}qwdl4v#HuXh!>R%Dtz>OIQH@@-gO zZvQf*e4~mB3$vr}w870gYGbq0$9(-_0TP%9euBvNF=!Hh+?7=i#r^!1CGv#f-4^nq z;H#zx@n%c=%$qD61BsE9xf?}bVcfRq-9OX6U^c2F8?ToW7hIJW1IR61M}5%Gc!$H@ zeWgGNcqZq(-T3!Ehe9dl@VMq1v^VD~8A>!4E~cpA0%}Mqo5rT8)w<`zH+T z(3{6E_{4ok_vD+{&jYKhP4_xJn`LzVieN(1GQ@!hPf&4E2vN?~aNua12+RXy!7JRT z`Ha=l+7g2$SkSn+ke>e%ea{(L`F)kduYEL zRIfIk?<_84H{8<`0$_sh&wg1W=<`g%?L?Zyeb2aQGD=j_aSi+FLtx@A2tjbL3C^{e z(IdTg=Q+Td>67ZGip0(T)L%pfv%(9+X>eMP#}F`wk& z)m{B=FrHxgd$BM(bF5*)oFuF*qMZ;*SS zLE1i5L?qC);5-Qq6b*HKaT=}f`gm^T#Ok5TyE2%$>90W~9Lrm8y|6J@vgaI#|3(Hu z9S4d+5Wj|L{gFFI7NS@hDTXASvKx-vMt8FJtP5-(8&UX9`K>kv+U1awei8yUN~3{2 zq!#7EdB{;-b#v|{#)V@0b-T;jX7}UDuSfAN)H2j^vGLiug+B8}jMp(B(<4#dBTTPD zN8;UFAdOYQ!y|fR%7mmgZY+-4g9Pe)79#L;Lm93brZgTry|C8Gc{s6j4yHmB%Y~CP zXdM*H0p8$Z-M|C0IX}%VGWq+xqv!2z#bM3=y>>aAR9i(ajoJLK)mVd6r&decheLVH zM@Z~H-d#NUl($63SAmbMqF6oJ>VuMN1pk$gtUv^Ys!izF;Qf>+yr59ZAPHyt9@^%c zo)0^g+&n!lDwpn$cnozoa9N`bu`)HgP~ME0m2s@b`o$ot5%wv|T1TGD$@)w#NvC>| z&O~d?MiqX8pkXtNin+vMQhEcH01SHaF%);aV#g3GwKaiAC3Qhl_se|XHtgryhGF8V zb-5qC$Ft|y+8gBA@zXvwW4Ugl*d&4eT=V9LM~+VQtNYreD~N8`$N5rcpg9d+x~5u# zW|%RXr>?Zr6&D3(b%k0-l>&q~BV0>wmAueTiN#Q2uuD0Bj)3w<0jsLqim(f9YhLvF zUNR~CEO^Z7+t{v|UIF6W>*ZmTw)^!KNc89ukN-w;x6S%zo?VNp?*sO`=U)J3@a)No=rgOf|A&p9Jhn}`q)x++!$4|-c!$n^T!lf;j6#Hw zj(+eey*PXL`yTGb3R}~AF2s+8iTrnMOpvBbKmd;Dt^I?P&@n;|9P3auiKtCjcAZ^X zh58-+@5*B!-KmuA0Q2Dx*2~jQB|DcBa!Z4<4vh|q00fw`4Wk(+eTl)Dmyq!hQJrb; z(Q}A>o?**1^(Xq}>S4{+cvCmv5hi7@B+%kd?$n&5fcT!pPkLL@K0&qPbw%Oi+}aGR z%Dl+(fL@hoKe&YzkC6aE&-awDr_vg~Lf1z_Sy-mGS(u?OkMYj^RB15BQ#_*pu=w6Y%Tz^KL zDMMmT&LSQ zjj%NuNCteYg_Te3+T?~PYKKtqm?-$L zDYUrfvV>4mHrop`B=V=GjUt(-BsZ?CuRz5A(Thp(ee*aSwG_YCZYL(Dc2Dyau3!e) zj@2jKM--ly5p|u&d;N{{Vn}rSB$hGHw;kAUSQvp2A&SI0N|mD!p{jyjG#jq$LA%(G znX7cksA5w|)^l({CoD5?Gabry)8RvyuHz@GpXf@!>V8MQM0uw>DN~GCh>A{`s80Kdu1#e8iaZI3Z2dEhAOO) zxjLHsGr|lX{vuzVi8*vS9ehwThVg26N!uQtzvt*6Z>^_?myBlpBrhl^W=_-&Wz5@{ zW|-}(jDcJL4mG;^X^mP6%qh z*5@X9tj!&#O~UV~`)V@;T!bJnqIc+~C%mvy;I%f>=noDTHju|)Pnj0=^|lN!&ij*~ zTNi_5(!|p-{6q>a>ecUfOmIp%!We%if;_PN1?<+$tk07HQ9_eL~gcA=sU$RwVZ zf@-37rEHa8FdG<5sk8vpL2FsJ1rEQIk!Wwm3zw*mvAMjas)-*d;RZTQ5su0m#h`QJi$g%k*pcat<>PhZ&a`NVgW!NclT z#yxVCrOOZOLsj(#39!B?+H$gUV>T0uhCPGhqcB{ZaNO`_I2OoxPW9Yu%zkTI0>Mvh zm$|^sCTbeaYQmZtekOCxn?1^5@}#=5wGDQSY3s#W@tHOF;F3DzjP`yZ90*oJSQ~%1 z71$Tyt(eZ*M2h~N7LzfBai70)w`^@f49VMZf^mpJI6t$biP}*J$@?Zowcn~fRag$K zZ#^lZ4KbQ21U@rE66H7&M&qRIUj{>kMDr5*DteNKE($5;i9qfy!9{TA09mK zs>wmLl2MsoJ`&y*oMq^_r+PD10Y^>rl3bfMFKLK=Dj_J&~`7!Buw;oAc zZ^LF#CSCvdP*RsP7;#f2n1tarN~*S-#KiE}7n4`&*CI&eII?j^`6}g`X7W|0HZp(U zs?Al5Yv0#2nIMMrG(ilgt3JE>*z0gr}Zok75tUmFroKtsTL zk*Xr6^&T~Mf7N5jjkI#TW=(ejbgao4su4uWez96O&4av~>(NCr?Zr)L)I$0b2j9mW-{DCzo#GFHPvGGpX1GnGu za(wv|3qRsOd-O#9UU?Od>z8Whs3UAGPxgI{Yh?N4FJ(*%L>ROxeqA3-4MqtEi2Q@$ zkXTkhrOGQhpmMTwYP??+V%HPh%X)NgaDu0ir#8(?S)9)5IQStSLNuK?P}2yVdtG4I7Y0=&zA~ zIEJeg&?rHI-&7XB*jt6CCv&W;dT;B{XwvcrU{zq3hBQ?il+?J);raK zt9DM!=eVB`w{hKY{ZuShF$kHFa!0s43qh{qi|Ra!hhrx0CKL0+0wepEO15F*bvbQ2 zj=AKvUWQ)zYgmmlzE{p%-m?$X7)%q@qi8j03yn$Xcba8)HRD`pCjHIjGJ$AZxVf-g zgUI`>eqI*(E~Xt>EkzZw9``1vGM!O3-_%TOqn|R4P(P#!t_2uRTgR?J8g58FsEM#eFUZ~$=f5PBz>2#T9WMauy$LtQD@Wy2eAy}0KZf?n4f zAQ@8ob2&nEfc&D@9QiMl?2nrZMw`5Qr^g0o#R7}2>#l$F>g|7O zH4Bq>LAnQhXita*bnl&BU!F(!G7j(7H8`}_0_x(z9ex^ z=x@ad`t0Ohkj;h1)j!wt!(ScH3+P;|xP&$E1@FFzLxqL74?F6Jd@rG4=&jGpJ88C3 z_6BuR!lKenoc3xqzYWL$Whf^+K~cug%M@t;V&PXQ8HVFt$~V#J=n&AKeBO*rEd%BY zmbHHsk-y`a(UYVt8(NW?=`H#ktVi`!3--++8y)+Z(`)0-?00%5nTyw$nF#ye{E#En zLw;*>SIZvp!%~21vMI(9)vtuiUTl$^DrB?YK2KgZHiozmmrZnWef(4!Wlgboul$@8 zeD2yN?d~vf&$D(Ui`nAy2Pngj;ywE%XSKcMwctG#K2%Q^zv;~s5c~=@ zO1e5uj`ue@<}W4gcPXpV@{!PxqhuDxd8G^<39HT$qi4aTZiwo#iuX_Mqb+(fa8gth zP4H?g)8?N;N-ZvSk?2oCf67}cmVS8wkT9BBtL!7mT5DZYwTG-yT%2E*E}xsFkv^TK zDJZE7Mn0cTLo+sn5?FJd-vvrC8JMu>@&kOcCu&ds{2HtWJs}fNZ*G5IB;#=Ct$lqe zf~a8C;{}Z~N8xgKxQN^JG6mnq`xfsLNj~%&QGBOOk5>A|iZ5)D>%<7v<~eHSx{soL z`cikR6O}X~H@Fjl*6TNRpc>X%{=K}W{D789kWv$JpcXRuTt{D&D6=chaOLT!gVE=9 zBklw`<-qKB)<-d$`PeQ|*ArtN{8S8Hb?VJ=qMM)mRYskFoyVFt#?wUI+4|g*_LiwD zslT%Vyg^`0L}-p+&evxql)u=O!oK^WcHWt!V8tVR-_jB>h=(@}yQAB-W7j5mVqc^= z*eH#A=Pfeic#>rfSI}?P8RhWii~6e}n{U%RiK@6q=A6nRmexakIaoK8xM2{{)FEAk zk{a=twf4b_&p-{j$`BupaBx259(Q1JtNE3DqC9yY_xN4C{U+&6$?2e6D}-#4s1vph zsE<+|1F#SO6{7-RZ9?=eDsy$SkbG@dBhR9v=$5^;jBe#^}cmdKu!Zwu8 zS@ta~#u~LM2-nD%)XOrU`J4hWyGp}vni5yeQ?gQUh^)9lwC$pA*WSY1dB}GE{ zl69bQ7o`}m7W#L7n(y-+kyL1Lo^uuGJX1-AU*?J!1WHsft8}lLK&c+? zTygf8Kh@6^w?+ipsM?K!0K%wQBUNqH@>5sX)}_FDjVyM^rOr;R2b7m+qQMbZ@C!sh z9BpX(K&RCU=(=URDYlyrjc>lH(XU4uHz)o*puO38w1AALVEVn$?xfV_6sZX`3DXH} zVSu5e`6!=$G_NCapyGM|X?Q+)iBvEw(-{Au>{Y>mrhRS09R^g+nwid?X}n-H>3%po zYOa!bdOY>mN%FRNVf1i|dGATrW>t&RKFISvKLoxOAab@o2!}`t{(LYAwD5UrB2r3e zUj;#l@gCH)@BYM&FSY`X2HlzBdRm<(WxuW^e@Yu}`|@Jj4a_B#eoUYf0gXMNtd#Q@ zyV{Umt9%u7`?yjb`|#Ij>SGzT`=)2L{pOchKYMw#(w?4QA`f^5|;rwZhVLAavQHi(W^>5qydrxa)FNI*Z#DVoI zWx?7(my^kMbL3i@xxQcz`sYDpFzeWRe{~L#z=!F{!~js1C=wj$@hukAS0tN3>2;gx zLEWe_Q`}YT>h<^E31Sx2qxJI3^Px}uOEv$S(QaHLY?o#aLelo0Kspu*KopZWQZ>r= zTU#J;V0nS(Pd?&16be-E0_>Lw0KcznWm@XcK#8FLE63z_mOP3SMye(RuVT@RRi~Mp z(xKloUm2NCbCARR71olsvgX#C&`e zYkg$EN}7+48^;kxeC{04kIG;I$K8KknD}%>M?|`DXtZ0&DzsZEc!0ncz`W@ihr%%p z$2cw-+{+nGJoHmc(_5Yv{b&x2tCUe4$^AC5Ao==i@Ds7X8$ga^eQP9CsrlXdm9Q~B zY9M|E4u-xk@u!&fzRZOfQ+j#y?*#^o;-Sg4-2pLw{~bWH?jmq!G&NO>Zh(F^#9QAX zpp$9O)g+@;*!cTtVp~dl&7W%}>SxW{>3H7QRBFK~vnpc$dmd0E4lCSC&R~?Xy_z`b zC5SN|&Cw}EIv@k<)*W6mw8b(*_(zz^8$^)%RhRKejI+_gZ$(0Bx+Q4_+vH?Fo>&4Z zN-@e|3Q9`m*m1F48jPJw^C8v<{T>f=VqgB3mu&ud)p~}@i9~Ea%~z-AI)(j`MoN9% zkIqkj#+rmHEwI3W1M~Yg^ty(yRn-~04N2dnY_p4pl8Y>zMZM@XJuIR!%!*XLwrK18 z3--Ckm$pXree=DGCQ2n37Zy-Mye9!xx??PIm;sO8k)OER!RW)W5#(m4$H8?$^638K zyB>dccVM8FLip>S$4g{uzc%mN1}>pml&VC(xbMAiGjx>MDu5D8mB^8j2yYLzUIIEv zwrwl4sl+OD%7~m{S+=v(+~TTyI!dLF-NE|DyC)Z$*`no`{nadWj3$^9J`EO|S84~* zO@|=+zC|ovzUx1I{-hZPdGWXK8x3J@o>&{xBX#}5SY_O)AUv#zyV!ekEWSJH$19)7 z$v$XepNf<7Ybunevisj3f5b$&lCn`y$6hWP<%2c`rrI4zCHMM*$jvARSDUapu%Ol9 zlPpvNVT!HCW6>pp-K9pH@fhdyG>pC8=l>dM%crR!rr2nvF8W<+3+oGp2{qYCY>AQX z=4>`>O*(v&LqYf!mv)7TboYDh@`sxOEOnmQ<SNjpMHpdBQ8rbX#Mf1WwGPqVhat(3~3tHw(=lrfvxDk7Kb4<5TR4#?XE^Bz@_Q0v4>4`YK?g*6QkyEER7uR1bou13hBP47TpGo@9P z)M4A>3wqsyTrHrg(y#Sh&p2wf)A`NoaBwP)DO#NQdah%3_$-xnR4l92XmFB{q|K=2TB*B_6*7YuP)n?syOKpd|dkAg@`cydv-;AI!=O;CaJ=98KTx*+&zRI8AbYVPjf zK=T&LO5V@eB;gfU~3${s^98!BaY9k{)-i%qD3i$w}0N zn!4E9-Pris3e0+Fd7k2p*8oRI))7m$2KJhdUitfaW09_LRG}D=luJU|iiGBUrke>f zR!MvR^^dX*ngdz3E}U#jf-z>F=;)y_hMEv^&cp5gC3q_SaDm_mLGwpBXQNwVn3siA zSQU0RYFDByhOYX#U6rm3dbw?{n>2IQ?LK%%eY|-;*}Gv} zZ5HX*xfD13m-8%c?P3J$g(}mQM^SwNMYgh=E8=>oi_2EZ=-$%c?CQtl$jaB6olnJh8-t(%GZ?CCw#wm^AZ~yM&LgGd!I3t{8AVXY6);fsCASpgm(Gv&%1!U9jBLC!K z;%kkKeBtz{*SF6NB`25Z4`y~Gmr2m54@Ojs;?ZGK%{P-?NfB3<3wDUl6Sfj3AJRFgvdJfxI7l$3fDuVP5{`tB;n^YkkLlh4lw+TCnQtI{T0jdmZh zCR%4?xFr}M&~}Z?i{o4T`f10g+K~W;!!-cTyyA}YHvNy!Zl>mseGbkubWo)=D`Nc7 zzM2$aIv9yYQJtiMHJosu5aigT(T*4^Q~U08QOSjLbgEw<=#)G z(<=4K+!CB}2?DBatY?8{9uXz8iNI)Mi5h)DPg!|W<&hYvu`Hf3(}EUTTviUMk@?Hj z-}1U6Zr>0@!3wtz^p81TMZAVf(0%NK>VVaH@hvbkbN`qk>jqWOEBh?J$HzLICgQ#4PVjHU65b6@iT`qiR+p3Dit|Ks_!%>x(h#<v*2-RiU6qvN!iDF9OH#>}Cq6qf;UJ(2XHq1kHKO(cXeCRqA z9Sc1ip^K+k0rYB9@}}F60s^gD?SB+Sy4szswSz*d-VfrZ@C1|4^!-*UE9b@_AkJ!t zc+D?cOVT-_X9oQZlD*-VT}?Wfr`(Ny7ekpzYna>Pu~JZ^gQaju{eFIx6C~}i{R7@M z#I3`|@~*@28)?%TCsL#;?_Q5^#=htQzxIx)@flnJ>SX*Yn&Am`h!?Ov7U`y z`$$}~pN|_JMl<7T6T1SOm$Tt`0#adKNJ|;J|DQnPb3EEqn8mk*fFjJN;bJdF80KD)+4H&>3TNA?wy|9~MFsFKIn9b_kGH@yw)tb5n+l;)qQ zmQ#O(IfxspsI0!0Bw)|_8l>H-MGP-f$0X%wAGZwZS4@xq zn?@6q!j_8z7u&0Sv=QKCVDvcIoODEN3ZO7#22d8<;a>vC=(K3VBr>zbt{cO?DV)n+ zAEZl4z-AwZz9G-q3$|Ci3i5tZ^xpGg(1e(01zKE@vy0F(!^>c}M@ZBbYViyKr6#Xs zE=6j9!=1K=V^iAl*(7#3TkMVMGkv07uEc?Vch|T0Iy&|rIk%|)6f0!2)vVzD#(eGacZ4feU<=qJ6zhEb!QH23r-Q9iIm#zOP##R6d4wv@k~nfZJ5tQG+=T>1i)zVjpIDR|*2 z`0fc1ax}(g3H5MhE&OfPJ|<$2jR^=bVZ`$(5H?0?%oQ8-{-darI@8LPG~n?NF^)W|twssr|`1H8cNHB&oAL`cF#dOn}B z;PMAydcYMR@WWoUoeUXT!98RdlIi*YeqhB5hg|+B0pT3XV^oz+Po?_U1o=b4s&Irj z&m_1K<^<(5mM39gT#Lak zrc&er%r;@sZq_u_$?Cbk-ydWNrbx(Q_&k?1Hs2D`JW*7B@_m#_H1s*P?0bvC>Zbl_!iuLaEx?&}Cd z15rVNmra{~2=K{dWt00?64hwcZcp{^WHZHo)lYN3Fe|i~0E{7<07pDs{w)JTUjKD? zs{l0AZ5rS=6!-EKrlC>+)?v7HFx*Y0oLz@@1ml;nJW zRY=I+s^S7fcf%W;mx+=0me#ME8@LUQs1uL#Z~Gcm#BBZ!((VJmd=o_U(VR=GkpcaI z;t`4c8Z$`9Y3tON3CRx`Ea&p0;WhgeaIixjuHJw`#VWAF%nFVmSbn<>H7!S9-;zY1 zYJv-2@^-^Sitv3F-t5y1{`T!3ZFbL`HFh~pMRIRD>@vJ|>UfJ=XiFA~vB9KgDQ;JO zRm-^!2gY%^GJjjvRvod|2E;6&QZOg^5zH|7bf>FlmV#~I^EgQ_bD@~mLPT3v_lv$N zXq3PHx$EBLFNG{3F6|G2Q3;>wmt2SDW4tWWEGw7xpfW`GQy=X4min#NW>QESi`S)! zxfM~;1JCvz#CbOb=tAKkOYQSa@HSju{IOyPj0~f%#tMpl2x_+-9UQq`$`SCJ4c+7@ z$kIf}_<$xmKI@hjx|$tC)oda`m?4krd)@AqLmFl4zoRJ$8dr4Y&1dsA-j+RMGuZ1o zK2OQ`y<9J3XnV4ior|50=PNT~q_%g%`Sm3e(U43+8MKi74H@=Ft?`9n*b18)s^?U! zMte&2xVhx!nV#6f?Q*LldMx*5BFMg_SGH!x5l3%zphZ^A(SwhwVMM=6F_Xi6;i^VFMYUp$?dF3*IwS0)p+Ht4rPmuJ^RDqQyoU*@az}Y?%Xqf&L&L&`Gbr~ z+h$+$@+XVef4yMxn=3aAUpTPI_N45W(<^>?rdfwGdsdwL>^PHg?ckvNlw3-md4m;t zDmoRduj8JHjz#L+3wf|r=k?ec(z@D3#>Y1n$1~L%Lyzq;)8l9IQx!qdSM~zcP*bnC z-*J?}Ew<*(D+n+1k($b*Ju~G5`8da~MZ*Y1<{mivp-ogx=+X1 z>F?NvqQ1@BFW-wt_9X|CTV?N|5Cwa7gAMO&CS}{mvdE2BHlpM=GVsx`TSty&*t-RO zYy%7%DOw?>285wkbsXpa9;0BYhEa&&7zJDA8#O=_bOrXyi$sh9f-MZMBd56Gb%LIN z*C}NwSims4@*ACjGxsAQM?rO?xDGKE1(l1X!$fEBiQJ_kA2<00K3u%V7Mn#;WqC5` z-%C)^%!pxo6UUem{MdqcOv%)!I0#<&MQ5leQYP;tD^NDsIeWjEQK!Tx_-|B!$`Y>n&39w1gCi0M^ zmf0EX+E`rUV#-#42|9HETM;@BF2bAehoUC2u3EUrDgb>Iv--C|{DIphLPWagsmJ@m zV&zwdl(upeSRJwxRVA;7W_`SB*;~z8o||;-fjv(5>f)0#IxhQd$vdgdFD|}K{;(Bf zFDuxwe92Dvso^;m?6VBV6p&>vrH`CKzL~oJ{P?+xCZ!M0M2(5z*oPlnJ^Io6@9$b3 zG$)5~-sCSNtrkEJ2`ciQN-gR->q2$ZchksB_y!hf7edf*8fX^LyL`^_6H+${-5`Sttb9OHC?< zJ&p_D4-3h!yK_5tXxmluLDu>WGun3T(vGe9EV%^7XuE*{%+NrQ0(f{uQfm)NRb5b0 zbtsL$$i=XqBV)<4g&O_^e1LJx?13-Nnss~@InugGE&vVvpSe5g%eE=n9vDtpi&|aoUVa!AQ zw}gJhqQ;vo)Y7wDv*1kSnuQUVEhtl|WY1#RWw3?iY3ZfdDoWGZV!A!_NwolURE|2z z0o-9o5J+vmk!ENNH2l-en3ILdK-1N`!*$Rj0 ziXkGh%4-P}y%rIXF9M7Z=&R^0AkLXl6}3dTPh(;HPaUJrW2~j3CAm3H z_D2ryM*bd+xr?-f+_m2z5aiqc;F{EWY3T``b)@NN@QR)J%PDL5iuB`^3%|%3Kl>SS zm)u^4^RaH+gJ19)_NVM++ZN5=iUBa&N%|K!Gc6ciQILwgL{99bAMKT&NKAG!j6_Tz zVBf0ZTCx{bm#*m6^QG%ADoV54CXII)0FKdq?AA@jSIf}Y&k!P&_v|<9ac9p;tI*(8 z1$oP*XQ`^(CVh75%-1sBYEP#lfb74mnmKia1S~QPpt(u=832O?jGKTWsBu1v%x+uK ztXKObVElm>4E2A!0WDVAaM#_p+x}z0;fFskfGeUCmqE zz}{TlcSU5AT*(=D9ayYiSapJ|6R=$ZenW`7NKD)E+5oDADmqKYkhC~U;%M2C?==1o zyOB+36k7{B0c0krydVGuRq-L1z?RCzoi9o(PjPs#Czn`Q93F$a+aB&R#m;pdZf}Lg zeu03Hd-ivwdGv1Z>g}6W(t+wMeR1ym1DVdM(S9dy{;XAe^~RCS8kHj)0BMS!+G0PZ ziMSdU8!c)EmZQUNwcg5U!kvjRqgZl+H<-(JDL%}56bWf zlSZ9>bOK)>{sG?O$QCq$Y{t@9G~zv+@$ftOCDQ8=VY3?ypi5-y(7lSMNO%{Spie40 zBjU?(RVG}CHBzy9jb7Y%xQgBpVPr`ce=s^?!Sp}kaJzUD{m+5*^4_gwg(Uq)^nf(| z94#y?+lCf?Mw+4rKj1w3X!aukF0wDhGx$&Uib@Cbc`Vf#_24B%s^6eyonfIjma3H_ z3G6p&11V7!t}~)&4Y4SuETT}RD=bzqsm8s9Ic*F$QAe01SCSlOa?2|4;juYojN+xX zqz(Hv%|BE&?~CQXBA?kA2$9>ruKjLN+0hmGC&-&6udmCI>rY*_a`e>WqdtCf#O}s@ zD$jj2>h!`Xo7T-hpxGwP1=R}SJJkSbqH=gLT~rL8$bdO9cDcM+-Y=KRa++eOdg&Fz zMnj?Dh(TtlI)NK~=>QIEOkGK>nS!!~|UxndAC}28neD#O({> zBpBQw{iaA!3CX{g*?)IcIjk+!l?<;*SNV;6g}17c&??>#v5<3h7BRD|U7Mo#>Wq)M zyNr}aaZPcl7{%j!)b*a-o-iP5U{{NF;F$QpXkz>T50_qe)OzaBctf5%BB8&W1QPVD zJg50w^DWoy4XC{EQc+f3%u{FAh;ram%~&NsrA7sCc!ELYY8qmhfCvzkwn4ybGj@I; z`y4iB7Bwrbi=>!1mKrzuF&1aMq())*PE-9GX+~%vGUn!yUtf(Zt-Xi*keiE4duo@y zfAZs7XM##=pZVZ}H#K!o9{H_sH~BdipF5X_yigb9m3NhFx&O}9FQrixo4&bx=>c#w z<_=9R*B(v(UVGH6FtkpE5iil%Kg<-yCci_EKB!U{KM_EK0YMIce2Lo*?W!~Pg|Dbq z3d0wW8rot4SX^yd2M}9L8_Ji?jyX8-Pp&w3oj%V?Weu!j{qP>TLE`cjC*h+^X98$H zP<5u*1R-lBY)fGm2$3mGIUfSVM?n2SndrAO=;yLOKT?N){W!S&MP!F=EYFhkX3OW_ zd_5QUHGVxSsYAJASZD{E4QE@{`xX9acWKUj;(-R!c3?09XpUFu@u3RhT2W0nii0B- zZ^WP~Zf>u63X!@RRJq6nkE^E2jd&m$@B@+w`ON-48ALF2 z9PQ`0<;jnYksD>IB_j1LE0YFQvqkJIQ4JV&aSO^(7slHhP*u$o3GEk}{C{iZ@aiqB z-a4N3rkeRz?#-=Jyj;9Fp4O;dM4Yivgi4|M+Dv{kfBy%4rJlKRdgj3CQD(^*{WbQ& zc0F_J)K{5Xr)O>*y$B|jztAa0qw-}-+`@ccyj}R{ zKAV?gH2-mn#|NX}RV7@-rG+z-T^xlcRvi+>rQ+-1T@{%h>`VJvNiQW`eFyvE%#zi< z+v$T6>x<|Zv0uir%QbpitQQ9&SoDb^YAj+D$>XZ=Ni~)-(%xd3yWQl^jr!|lW#!Tu zb5Q}p%{KsM5l^|E)&#*&57L#|-0EbED!r=*8|KcT2S0t4pK1j^&W83= zgO&q#;CS+|`tJDgqQx(<6_E(JV1^u(=p45(bm*PXx zj*7u*Zs2M1hP^#^Dn+4%{w&a=%$fuE2aXyF6& zK54*yaAWL2TA(uaWB<*5oin8>zmpEiFF-VlE;^BVVk&~eg?S-;Q5i*f1gJh@No-VV z6kWP!qOP%r?NNuLs0hx8niqv9E7~Xzx1_0JjELfgT?BB66yRPt?r$J^^w-RJ#P_C- z7`E{Ex5cM#_UnG?tFjZn9A7zR?1BkXY;T>C{5tm^*=A+QuG|hY>$W(#@wH=HyJimS zGO+7b4XA8%8F7ACo4*6tJ;7ttVa}D~53Zh})ZS(z-ZqM*qh!5+if<@c?}6hRQ#p@t zhPaphAzPoV8lIU@wrkm{VV7%Klu2)y>epUl=(bq)YK9g~7UaGM(mI!oW3`|=OG-<# z(D+YCFI4^wdWXczDI^J9w*O(j%G%oqK$aMrk9o32lN%CIbR$HOE_$+DYyc_Pct959b_E&`bW(!+2bTZ*8mWcy_z0;{Q8SR_8)RCMH^cr zVCo$NOm!O70*Uw$nsnbrcFreTY(M@cwV|!@ulP=?Tfw-m>U;v{US^B*S8@0JgX*Fg zth(qK!!-k)z*GaubW|GkHK55Q+YN`=^Gf;*dA>{%>(ONL>d0sln>QWcO0QPDD7~5k5~PzMnlV~{Ac%s-@Uo(75?6(62;-WdVa=6$#F^mcrCE$Ci^*0d z;p&K~f=HL!`sGD+7*>aRTSmsDccj`KnRiaAk8ynwI6rVLmh?om8Dd?Pb5+74K5vl_u?? z+OZyL2?$03NT=lIz{oiNCO;7gEZ{V%89!dWpdyosWw&+oILg4W$pwRSb1u-*#s1!3chLj2#x7y6(THk4iZ@TA&x_TylJuO(-+ z6Szd|%nX)){`F6eFBobHD|AwukmtAi;cc}Q&Ph-$sX74i89C*z;|f9l%eaDSP`bty z>Y#@x@c8?;OGy$rL!bMPo}7_Rg-kX+xnt)!iDD*36Sr_z5X2s-RV) z3R;GSVORh1C!1KJi|)o+^mh2`zM{Ww6wOgb>*JA-!|LPcfK9GnTKeb%wGa3_?}41c z=H33QqZgR(cf7NJh3{ezNQ zcP|v*WtDJZ0i=s^3PNc8Szxn~ z1T0a!IT9a=LPgKdiNX|OJyd6N_P7$uF23wiCooj4Hcv~o2<9#hl&iuVzTzYWh^63y z9XaAKe_lO}0yOEyb5?j_72;@JPduD_#w(NU&ufcL|&j0e=xt;CKe_jt!k@(hBg4InIOyNDjp}}}^ z$(i75!EC(-9}dRUR1Cfs%$9918&Z11 z8LGo#!R=|4#Ujm&a})0p`%53PDvL$>)uR_|_COoRc#loA*5aVO!%;m1b+-R^F{`y$ zoS#>4h-s@B0PSKqg`cA_M=`Kb;7AUuuv*2j5RnZ}MsoOy2NEE$k9v22q^ihhmjnmo zu||;Yp*lxz+&D(+lfzc?*20!ayUTnxbzNH+N){-2Er`Gi`OQF zB8#|#MSU#*a?U))8u_wIpwYqsx?)vuEbFRB#$N8Q4wln1yX;yH><~9=7I|AJBe;6C z4JF8@$)7?oLHTsolum0dQZ*)jwvj_NLf3<8NRq86 zoqLZA;Ss3=FhJ5{?wejHZ}2w`7>eYqQRe1FO7>P|_>xUiOUs~cs2j6Y0i;%%X=;UV zZS21e-ceh$6)}{eKWwUJhng~;*DjnbuaqL_Sbh2tbbhA=du=Vw*1V;@wg^U!Y{5o# zh};Ct(E5WO!WF&2LyR4SF<7&K>luD9l$94NNk~FIW7DMLL$&_x=dE8lb>t;L&{(#h zc3N=x9I?=$0{pBz*JCWT+D&89q+@8PY-zt>&6)-2?7YOfsH zF1dlz;dfp!p-ENcOjf}~LnVP<4d1SY1Bzs($6Z=t6`OR2UQ36P8|{~Evb{R~MhpHp z?m8e?j;%OCy26nEiU+UA#=)T;PVByTr0(*J7Y9zBI4CVclKW1YkQUW1QHu|6u_dH_fZV_XcfYQNJq#le=-ZLLaPD6b1+dF ztBC*!4D6l!tCC}ob=PQoar8uXG%ss+65fJo9de1X4gv5M@E22kd{lY$IDW?9If#U8 zC4hriKuBYXUQ?uj3#mvdq_E&4$)a@fDrclHUv_2agV5NczM-L^v7u6$D+QSaenWX7 z0gHQ08z=G_Bqq)1j~_Vd({gBKxYV7@mrDw#jx^7h@dx=_tI&TQDCC#1OUx4{zFMqB z^T>QOABVj8ZbU&H6otHIFPnq3C^U3u zGQXOtv{eiph8V|~MA4flF@G)|f-Robrus%|k#EI_DGCZnLSZ_yBsfIDk_)dRDvVh_ z(P3@Ss~XHM9*ZY$k2xKFP%G`M%K!Q|xI_QSR- zxYseXbro*5<@AYNY5Aomc4&r;8#`pg&~f92KiVQse6)@tc~;ArZ2yjua^+`u9?lFC zMLe>wu!O{=f&#Qvyg4u+&L&0d1s=;s2L3DcoC!KOPO=SOIo{6Vd{U%Dd&KI%u{b~1 zZ{gD26$vW_Oj@&M(g5PQe&7bQKod@;p=D$`4kVdqwf#Q2M4myHx&wl}I9vKgVmqd` zi`h}DnzmxGwr^OC0i2!7`Wy-%y~FD;2U34huT~$|Gh6Ln)nn%8UW+jx5p(u`t<=m| zCzlT#xOQsNfzUab)5qMogFBR#(u&P59=Y6XYuvbTgJ{KOIYq53EqzUUWPw3q8d3;O z3VU8`s9&{Hy>u?O>P-5StK}=z#;Mi_v!OK*A3=qH1AH0o^Jzs)4*|4pWf8>b34P` zxy9K{m{A}AMwK&(;5IM8HO@$QwfUhl#OKJhqBdHiPS@n=WA5IykxBA8o6WVxwmNlV z#}DFz!>13>?z<6jpPE zl3MNuRR@R_O3VR1TyXlBpH!%XvAF(mg_4@;lgtD_KS%+fg(Me>aV>XroUB3Bi#KpE zSh!fYftPInOmVlr;e08KvoG5#QmsI-Zi5=ks8z%9rro@^kv2Mbp1dhKAouB_zsH;ypGJ#Euw+NNljDolb9 zYjG4|na$4TI65EJKmkZ;)oQMQ&QWs(3pH1&7h6$6qL~W+pVVAISDsvR1w#@5J|P8E zJAb>@U!1>%O}gUC~F5$~cKX!KyL02qztE70jlv>&_3k>mGaz7TkV3wHH*xTUs3qXRdbTqb0Vc^g0<2m3oZfdz#@vW;h zab9KY(R+1&s9RZAN;~RXH?(dneWFy>rNKCMhbf)Pr3tvMl@s-?b@|xQ$g%U6?BKUh zapUui62`->&ZD;@tIph(_#+?0?CIGBQJ+YX|313lyVPVZOjT3LY zQv(x`cjT|nuGC_g%Rg;wt&-u|DOwsujn}rO56XHiO8a|21&%B(E6YLlAM7`A?{Dxb z`(#a#eJ);LZ*KQv^=|M=oUb`9>EHnX&I5lpFrSfbYSoL)qh9PG?#2GU?#=;Rb{&Z0 zlkT>==N{YEyS8oHww`U%5+>T-RH$e-D`S zutbKbb9nfEohvl9SDsN`0KM0KW!Vhr7Kif~QdFI3lyQt)_9Y8SWWMKA77?y&&wQV0 zZU(?wf5N*0^3A*0{QJInCx8E0X?C*M_marJ&#mZ7q&%qpz%?g-L0m58!5^)BuV@sH z_dNk3{|2l-&qfS-9to9TKN6~Jw%>dqYX0+tvR8*`jT?jsWiySt05mtI6Bx&gB;2=3@a0N zppH^P#W-K76|2VTP?Gb`(xZY0cx<@o8`vL`mOjvOseN(eT;x9(0^$rvs9{lqPUGHH=O; zf_$F1&+3bs zR+RUd9C!32*zTrpU_VP*Za&tNy=c^Qf`{%@%|>g-C4DI!z+LI2)4A=1!gl18g#O0D znun!+ImYRc!W!fW)QHoq#hu5aNYL^qCA~s~H+=&e&1MB5M=XucZ*ANeu*;x3Xz3{=4@PU&q=02z*`l(5r z8>IuWqlbF0JEP0VgscU0z$OLPDbE#_x0Sk0zZR;Z5JbhIr69 z9yD5KoCj;S12$XiGo$=2HrK&UlvZ3yFQX-$bRqXhCE*cdk%1-sMJ*>wyXE3JJpp#R z=^I!dNz0XDdZGu7S`Kq*hPNflEe8wBpN8d5I*nVNFDyr%6KEeSY{?{Y^i6ilK|}vw z*m7xaXt%GF)Kj_kJZL}Hu{)99N@ zYeh5X4d*au1*$dw>tuAxrga!u(8hR>gqSN{`oEyy?Vm|6n96tc)q&gFWLk;@u#Bgi7J zFPB?G#y9}EJ!Gs$TeD|)g(@~oYSsT&!pma}^MxHpxy@>uJIca6T;%~t19*lY* zyA$L=kk5OxwDxbI2meyc(`OnxTzz;@^i;^I2EX;i^+c{sE_WunkWtUdoe2$HWV<$1 zw{s2Oh&!mEvE5})tfS{#B74rKx-rCneT{jdh=H;Gd^)KSzfvS&bnz!Bg^)GKSV;nT zKGAtUtKsef{ia2;D&X(T_S-{KT1Nmc2@$*Yo6T8cNAFlm#`SYRfE7+}Og7)sODiJ3SD-kdG;!YOx zH0^tcQ5Ak>`D*Oz8|AXeJ1H7$N;=bq6J4{vZi^(m4xa-9)i47)Z2Eb{AE9@CW4SEt zx6pf2B14z47hdvxd19Hb*mSm@=-TeWW7$fX8{a{p8ue|qpSOuW1F}f)L)CDA5hh#%mj^DK@2(qO}0bv!L zkHbu8L$cu9)G$+L1e%-~t}LwrXUV2Kex9)>Q##%=Yp*406bbWZO7pavP~8 zI{vP8`f^7|BH$kd!k7Labdd=lJ0!0i@?9waA{w&()CZx;2Uq|A0096100JWt`4v&T zUk^O>02v4X00000#PAU=00000)d5oU`WyY#2`~tA0000900IC200000c-muNWME*= z`NzY+!0Gu*`kxo40Z;@5Fy;aPZ|wxuc-nQ81GMEx6h(JZx011K+cRz3w)Ne%ZQFK_ zZQHhO+wzlAHq3%T8jDB(@@4Y@Mq~xmzn$RAjKb95j&<^k^0Y}T{>(CD8<(5Q#tsV>lF|8eHpLvbn8r^ZK9pOMe%YD4!&l- zeL-98FE^?~J2#*C?m_ab7o(%Ps=ta^;lGTtnsf=jr>dwJj$^n@VVV1qYT;4L*P9Md z{V=y)JV2h_vqe;b#!(r1YcJK~VVR$-I&G5sv%A=24>3J@kcM^xqiim%Y!NTA# zmd9%;h^y1ZJ;If)h_T_d40Vrbz5d+jZ{;SR;XI$i@O|cT={_5{F&aljo#h6|+{47tqYV$@P91i{i=L5I?{T(P11CeXaRC>owo}_-tDozCuW(Ux3P;)@w6;~Ou%==S7x?d4X)9G$oqL0G{IlfPz4~uMel&y?(JJQJ z@0=8sRKM1u0XflR#T+iSg3K4zK>eQN?C2AXnVR`Gox29kpFH_{8GHS&3C&Z&+SO+Ir(aj$Y+Vib|m;K^O*FuNbz}b_cnj+ zioCTWskcPBUuiPYT9Pl4y{0)s_mt#~M0eRdQ`}Ge6HV@zOHw@_P@IR-JYw10knB;K z*yeZbKkMmpleScw@_w2pwD&YuNSjHYG>0m;CR*9L=C=8gI|{jIx7<08CANtPiaCmt z{|DFfXY&96c-lO{1AyZ|006++w$3(dBie3~w{6?DZQHhO+qP{RGYkf!=Ko_D8<{TV zGFE_fhV_`OW&7E!*b~_6*~i!~IDAf7PH)a>F5nL1zTlPQb>qF}SLV0i_vO#wAK^b1 z0Ks#iRXA4oNR%&XC0Z!fiEE0xh?h$^l5|Ns$ttNpT1L7_rkC}WEt9>F$IIKw56M3% ziWC(T%@t!6TNLLN@0Bf;CsfI*-l`{Rzj~8~p>b;ZX|8HMXzOT~YrpAg>-Or|`sVsw z2BE=e=x;b?)EG(QFyma~T~m&!rfHkGz&zIc-lDT?wLFO#6U&KJ#OB66h-1b1<9f%P zi7ye~B7Rf+y#!uDD4|Wl_JqR;cN4xR8WTGw-bji~nw0cBxkgHS%7~QPsby2wrk+SE zoAx3-HXWq*PCt%vQ^woOrkOXhY+0?dj%24~kI50|l*pN!b33=Ld9u9n zc`NcY`8D%z6tpThR_HHWUwEy^TC}h@xwvZa+TyQP#5&7*()!gl(6-&qu>0)2?Ux-s z$3VvyXK&|qR|VH4cS-jSPr9d$XN+h2{|7y%J@36{ug?p-<-EhZtGv6s*Sw#7GGC%^ zhTrBN<6jXl2ATvu1{?f*CX^g15t-btqM>NTXv^rJ z=u9YuT9^xM&*PC1LTM-ql}x#*QdC2#2X%-x(TQ{>T}Zp=5Dn-b3-XTw08Oa-1poj5 z009610c`+}02TmL00jU60000001f~E0ssOe00sa7c-mc#19AfZ6hvR`UZ5OxR2zdj zHiofnT_y*~>9R5Ao4dd^N!D0d-vNR!&R5tcIL=o&Bs8B(OFbIv`t+)2(cP?Ds`lTc-%NQ`S`U*sj{xTjaOVU?gJtJ0K@bFEH^ zsH`s2loSo}M5y8)?$yXpqBz97=8gwm_?R+yS-8Ji`XE$EnRjj^t)X0NQkKOuO{gkS zC8cSejCu)*)JVu~uwvqeKkRtquZH-yeJ*@6h5!Hnc-muNW&nf#Sqv!*SO5Sj9|6$- zc-q>)qrHJan_&~90FyT3CP79Zxn0o8Kvi0RfkT^NJEMoSo}vhlxt%G(!$JehVh(aP zQ56HRSmJzbv?W0-Rx=$XNq!KEtuWTjNE*aqpI9Dar3_+m)TIYlN`Y9MA+Ba>U{kot z61>f1K`id(6hDYMo|~Jxl5IdNUJ(HvPBsvW&&EhyMi9i}cQDbE1?v?EaD=#uVUrLy zJJ16PuCn;d24Db$cnDMpgFF!o3WC58f}KYTgAGz1_8f^-KU z41!4;!@Ma1+)W-ISM{P6=CYW147dF z^VtEdvzIa8#1|V#79BwQYieJw^XsH;sTD2BN=`p|Hu-PLbO8)^#Rt#>EEXRG4d4KH z04`uR|7TatMhEvCqq_)-q{s+jLw|$?RJ-nKxO&=evO9{*+m499N7c1%j&%C{tiUj{ zE5*qXeS!|KMOy7DR_-~hBsyThG*aAIanXE&o}eTsB`ffOhjgyQ=|}X%t@2_OMKldM zGiQ?J)bqFprGT#v_fkMa zj%{fm7>cE|-|?8RFtRXieu{-_xtWFJ0a&&yEEzY#H_@tI-1Yk{Ai@us290jhEk7BW zmPWd{d@Wt5YP*h!Qd509b4^rQ+9DnbB<0Wlr?YG|o+Tfl6LyG;67cneO*!*N+RTuWHU4)wOx~!4W5gvuweTN<5_rDBI_<(e@0bs|* zu<=nkUPUJUld5I=-%#W(DbeE0<<6a5`ic$!FQ=k*QIVgJ1`AMH9l*VyutB<CR1YMeVY%;pv+$yUVAwB~%%Ou?RWNQtD(VSF1V|p@~As zd#4VfcInLmp5Uq`mIhQ4G*dvmK7c$vl!#1yui%um9T@c|R4=}ceEkoy1_`l{!#Ri& zm%0|+*R_^44K+A+vVqQL?+%$uNBnlXKtZzBkxjJSWNJr$?a*#!0zuv~mL)s%I}41i zWa;yjFsAHSE){rpTd}Yb zc=uXZTmiiM=P#}X9s;nmAc5TP9t*312?PiN1`OQfZO

7?9z@vn|B?1PD9RB> z#X4?^l{4nqy683sH*G+=W1DjTbSg!}BB>_Qk+n3JqF`lIb4`6Tg0L}K(bW+B7*NG1 zCR$?_D;=?kt-jdD-as6KG#K}I8;-I zLpQe$1BZZw^4)ref`LOoIz<}|0}F?OiiVEiCUq7zj=SV}_x8trw$7KjfZj!rkSXt} z%nY`@2Pn-aHaBWzkLQSR)x*%LUF(3`KZqUs6}18BO&S1z2H-^+5ICy4Nh+`!QVIyL zXgm4FO9ixZW!zlL-FfijWq!?G6cIBfJ6+}`^MDsW<*AKgSqZV^$wVnKmaXg{c{B_x z91$6%kBQT%RfDEW+z1bN@l#HWge{e$pkZL)h{z~ydj>dPf~qdjlF&+PDWIaEV^~r{ z61zkuO^!m+2m*mXAdn&AdQnx&v)!nPy%x?~u9_8VR5B=AUPBaR(6fxb+NC(lztjD~ zu=dr5`nwtwLyTy2Wh|gd<5`n1#Vqrzcv6)V8OvTapm}mkn@gO>wZHU1O$)e-Yo#bB z3dSm@UK+f{D>R8&d(}BKudd_esTlx+ynE%bRD$TajCnByWB>B3p(|zcS|WQAXEv8| zlyw1O7R9UjcNxFPEcJKJKn(-^_4bt++_#`RZ3Sz`71K{RN_2cnr&lg>)o+B^!xin7 z*Jos)mK?2#+MS!JzKyEfhJzHtnouk!4qd^(At0fg-jsLZ%!Mnr0OARQG$Xd7Wg(WXiW$+MI3!w zXMd0Ji=gDQ|K|e9h7&-N39{vcp@4xyKtk=(#w&2o$f*vz9Z zag8e{YuZ~ofO2iNW0_rw8A?{lBFfZ902%#`K@Eu!Mi~?AXk1Kc3TBzNmHm^0m^2FJ zD$!5v)QG5TjMwn!0lAW1Dacs1GM6`xoIzuy37e-OfYj}*o8a_C5h#9nJFx#pel+AyJ>D|{_{Pa)4iBm-kRcrRZJUMk$U9nwE~!b2KYhS z%ouEr--15Y47OnbjM-M8t#B{UOf(BdsEYT(Tc&S-DmX6DU9JWO6;Zni5t?$%6ZhCe zFRby_9Ur`B`pinugV*aF;E)05KtVH3n{&>BgPQ2W#t8 z1_V$*C5$f)PywaI!1yF>E6t$SJIC7+`(9I*ul_wJ`Fc^IT~$u+F(vOa)9jDOYQ6Bz zTZKL-kk<@*9}$rKAEOT1E9t$A#l;uU%L$b{BYc9`Ld!=AwZ@@pip%tZE>x*_HaEM5 zQkT)$K0rFJ#Wf8~k(||cH?Xq1J=Y#tYKWMS$9m$0{U|wdo-s^4vojDRqHjNp{;vDh z!I3M_gC_;E;>3ZsW6w_Ez}q#@h-ZaPA~*lUJ+4ja;8eBgEXJfHnC7TxuM!1BK1MG; zuJ%-}qYuR*y(4LZWwDvK5QP*s%}i!Z40`9ij_+Yy_xl3fEe`1+cB_&wdx%hV<2zG( zqajYMXz0Of8jL$7o|w5h&M*6&Qc@C-8n%+*K6Ut-IB<=U2M5OL2 z^@>kitFB0}=#{rw;~Ubx#Ax!gUTbs+zI1r!N?KfqP$i=%&n0O&eX=RONZOgAnX%Yg z7th^Oa2^-!&DWkB7_Z*to+=n&;cduz1;i)An{;nm8KPKRZqw7_SGB0A9e}i59U4z;jFYmXYSDRfZc@S93pq|R27R31Iu>qv@SLtNUGgBb*cY30Fyhk%w#6Z zu$=ZV4huYv7;pk{hQBKMn*&!EdZf@rzz{i1RBf0+ z%w&WVz@-j`!i`a|7BG|zOU}?$yJ4hIXY@@L>02T6eF}rjWhh1n7C7TXa%vuD7Laf$ zMfOlj*lnh`JGLG7>}<0L@n3)hAv$1TAO;wO3vqxJg9t(~jVN|_5yK5XlIXFH6qEhe zV1B-Yh-(z!@rxQ(0>WqsG^=Q?SGBrLOi8p2v4UfziNivhz8!IVh7)N6!&CKJz*6*_7#Vp?OMl+F^!BwFQWKbpyggHY@ z*e4x@aRrPA0={7U!2}Ln<1}osWF{l&i6i~ZGBX+yt3+lIE~0R0fXs(WF=)nl#1u1i zzT{JwR)J{)=}k5Y(+|c5VH-uy1jZ)en;90iy1~yHyWn=yo7!U^+yRh-;12aXhaG`C z4$Mhl&H!;1A?Ly|8Roh*>tQ}Di21OfBS?#Efawx59mX&Va}XmT3)wAzQ`Yo~3YugZ zO$scA`I2rZiCGC_n2q%?BaD&|YXBxNj?w0s7`5X`UqZOah{Mf=nbN>k?I;C`!$XAg zC9oZKFnaY~0k;Ag#uc!5U|i+4QW7e!mYkXfTr+uY=&Ktf#;qW~;oS6rH%*LpZk`<5 zVlvoAiBnd>0pZ2;(>h-m_1Jl{@BYA=DhT^;?dAf>{mV=9AtA%5<@4@ey`&1t?q5?_ z3DrNP7sBEP7wnY}53*hodXTfdWYGwdl{1QiBuvAASs1_N1U6GH5-hjF^B6`hw!uJc zh!7p2(O0mQq!=ABbh`f7Mfc+U2AUS(ZeD=@94PaAG5 z9smiw2~d}91`-M1in;TY5mP=)jG|xr*2HMcfn%*TX`AhiIcvoWNB*P6VcZ&X`S4H%ci`mw0h5sNgk0rTJn^6H}B_lKFy!ZU(P?1i^*+^>9VfH|FzoLr3HawktR*q zZinOMt$OK0ykpM8%73rXK>rg7ME1LpUN34bfp;0CYn5!XJ19B51u05sGj`A{sFpZOZAK z$=QfUB9a<3=29-_O5}4j3Ys)WF-lR6N>r($7VoI*%{6_w9*rQPso#LXXvZfyhN5dY zdeJu$1Ea=_$1qwZVie<;#586xkA+E7xe-e%EEDapGgc^SnpoRqw>|d8#=h9b&i>dt z5Qq52(dnc)lk_;pC9ckzw~&nZ#oYy$jH#!x+-)ccGBnDQ&TnWrOrzatfKv|h7>^o* zC8rcHg#fjRK))Gayotcp(7|A1Dci0DW&&>4qgXPz8lhsvex%K@QK)9&-Z}0RawAD; zxr9P_?iA)mAs1_R3U?zTDBM0GS#GN!RirAqNJU1FW%)%EVV~1C$`q>p!ldFleX4W{T$C%*(&HQIextR z5gczpoTPAj=^3w=G4%QugCEH^IV}bMxq%-cai>^ru_u6b}1VT43I?Wdzjdwb!Vz0ByFChhu8h zdbP!#l^)Q&5~hMu1Nq~?!tYM1JOYUwE7h_g*mZmSmGFWSz3cnxgrbzZei@F7$ZOSg zWFT+&KV({k2Upj#qj{>@7vnN2UozyusRGHsNvj>3EoHg29t;f}`{vD>mDh5X!<%lf zS%cT>zOI0OjojC|*Hqh*aC59)7))!9ve7p6HCg!knH&pLm%?UP`^AN!wobA+Z#Z!2 z!J3yJ?fVVsgSVg&#`C%a_faLKnwBq(7A~?g^VwApyt0KA-p(ry+`05RzXBU%fFT4<0kYYte^WXl~KdV2EF` zwuP%1N0tzk6!bD8*QnbS0)i9v4M$0lwAA9%Vt4e(FkVTB&~zQH4hL;MeLw3?RUPdx zU|_O5^^3;uY}8%H`f}VydSh<$TCTMj?h?`1t+D;h4IkQrImJiO{;r7@1833fJbqYABT`}9O?0EZ&WL61{x4U%Yu(-aOLadN z{l(D}Zj-ya|7@B4P0<9KMpJmz@I8=tJAi4V|UR_+# z;G1xca6?yC0BR))SnlBdCW2c2sjCUKE<|I7122RvoX{L$EO@fGm`QQPQ8cY-rIJI9MN%q}R; zsPNFQ=x7Gp0zPvBV@V)cX=J^uN-2o*W6bCrOK5e%Q<{C*`0l79(OEX9iIG!B@XZ)r z%{JEuLu)%T+^G|w1OOS&+uZ1Y2OhylsCxuSTr|F9qfaGLG%Xp~+5HmF{;&9IhzGqp zuPW-Q73ffGh{h;rH6@1nr&z}j;OJY#f}q*h*ai%WESif4T8};Sxw#BILMDY%ny;1o z$z`z`iSOYMQ`e-EOns^2$fk6Bj!;WR1GQMgiW?XpkPai9&hj&hPZug>&H%Mmw8*O> zRgcI6?2W$yo+cZ3?V^SX_|5!Nmh5G#!4Ua(dMOAg1rP=LJa!1s!xry@i#zxz$Yrx7 zee&wAQy$Xme8u5{qt*t1yZiL`K%;3e%Mu?^=+OilN zSH*!k^Z+-}iJW?Ji5#rBOt$YMsB5q)g@(!8GU26GCBOg3o7zDvycFC3c2Xgw<~hs6 zAw3WJ{(Oj8REJP+3;G#bVNlTAEbguXg_B7e+gVL!%$1}wbh;$n#Hz-=%_49zx-c5A zKthQU0$=h4?T%?QMxVG2E7l^Dv6Ui20}Cy@i}nciR{va?*$v7MP$YDj{crhbAT)?W zShNpJKJmF)|Fu5eiN^koar@Pc|7X3wf!MX4f4v^Gf*JJkP1s!PbF;;}qWkiaxCc`1KpGF@}b(XOIICwih8ijJ=huSamk#)@xokV79=2Q!~g<)Tu^)Kg?)L*P@sjLp#3;)wXQ zS33{uyt@tbW6uWEnUFJSoZyWGg{OII9>m$`Z`%zacsi`qy(B%gCuwwiqEC;r2KyCZ z?4J2I(Nnuc9l7MOQ=TrHRP_17V&_mn(^)#myPoop<{jF3$Or8onNO)YK5eDE zN}ZjH=p>_PSp&iRA@U6KOIEj$(px^YxrgAtFLU?8*T=S1=PUy)UH0!5iy}rYQ z6G`kZchHg>Wmqxpy1fy)*UoA7RNp9+)&U25*Vmm!@xI|U$}URxkLS>*$!ZJ3=Ky_H zXb*$#Ux&&Nvk;?&gxYm$T**ssw9VEDlY$xqwocoT(`A7u&Q^o8M(CV(L>%RwJN@F!s`G zh-QktY%Gmw?Oe|EBsz0uq?U6^i zE}zHKesyL85jN&~2^_Aqn-&+FOf@LcpO2V^nsBa}FV8Uhx0{Y8R5eD*n7RUPwbZ*} z>02a&x+v%vB2i3d!W@>SO?0nQ=SDWwLt5X~$Z~|!(AptM!Vz^QAqNxX$@rR4w(;1p z>pdZt97+S{`y#5^gg*%knBX{PN~07V+DL@DaT&W<`PfLCJU>5Hjh4&~y7ClLu4aq{ z6tnN7iYsP|Em>yhlC$Pn0!TRMHY`jqw>|nrmjj}>z40&CphF||Gk`;_tr_Od2V@h^ zfn#D)O~?2Ws+-FDHx4Mr^2CW|&y1GktqbRBUzPtcVyrX9EuTR!00(rNjO(a{~*pS0%Druu_w^+Xb=YIu6BK=#NoBE5(+ z4z+kysWz94Fq1DmoYEZNgV&sX=FE_Ck~q>+Mo4Xm&?SHg#bs1cjcAzr?zXPmfb)U6 zsKDEV+mxN)sYr=W;26_WYdB&VtL@924~nh3Yu_5Rv^J>fL3yo*^(P6wxh*QTV%1}u zJLuDHLLQ!i-WDo5@#-JQ^Su#f7b>er;#@SGz_i3}p=X5$JX_z%2S`gad_E?ZB1c>n zRoUG89~(lNzVomA&K|lBA_UrN5EVWUVGU%e3dMZ6S20B{H%$LvKofp2qz%$7dzkYELHZ4&G5e1 zQmPrRT~GxRGb*Tr4-5xOemdX!8}PsX;GXP(Kb~FsuV@^9bS&X%0}PUlhj_xG-KtxG zO~I+-BnSEM@D#VC@K8lQB=&4TB=Ds0MBe?hqJOHmY^sR&Qb+mRM!rzOSvwjrDO^fP z`yIkdtNn5Q?@+R&PMRyfLAgrRG7~&9QY)1=^`=%En#b4Z@IBIgs}S?e-I1c47ED5F z5;`y&tLWDeZ(A4IzI1npf1+Xn(3bl zZ9yJyTa+h8`n7S=lW_5sMNpaNK5@i2dqV{!Cmln77fX9@bl$10Qh~@!-~ov@+xiKX zcI1#@ESp#w$-K>V25?+oc-pZ&)>}3z+Z@~d#(`Vi=wWQ-2iGh!xu~i*<_E}C$#v)8 z+Oxhka#2}k?~(B}+yYHI@~-k^`A9D3DsGPp5%Lsex7m})o}fg(NQ#@}#iu98J>)yg zJM2H{cIN3EsbEu29IT*qur$DLQRKMzE6OW=qK_gG)1!E`8&hkf*}+8Y7Gk zG~XURRD~&j*FU)S?#;m!sK&_gH(A@n;><0`!G*W@M}++B4d_$NUFKRWzKw70EJB5u z^Iah_&5?@43_WbAh z*(GO-ySwIFuRE-&!$J1toiXL$2K2-IkCJ3)B9^$=G11-wnp@(MT;Yi1{(GfQ;Ua5G)ru--?%EFZw^P$8da&u!Nv+)nI@elF|D3vD}8b z^`+jPhW79rJWuC3M326=Ikp4r zu>bD;G%GNs*8ftRBz`1g=I_H-*V~S3=T;Xaaf<6!NvDxh!?A>L;u#mK%w@3`;=kTQ z)uYu5Z(k-NmztgN#YewO?=6c0V30uu|~^TtXQM$W;()?j3nM^$J&WS6*r1)N)x~(TOGZ^fE`HdLM!xbN=X=DbPs%)-6cS|g@XyE!p@q=!SlJ#Sb_UD! zf+5aB{>kmN?Sp3l*MhD+-8s0k_Baf+nSB4ggny|7OM?B?xUY1*R=@6CiPAG1AN6~Y ziR9p`34r6;L}enth$o(d<}es?9P$h}K+Z@481baaNnpD+d0wn}bnJ20rS0^K+nwh% zGAI?4iZf@M@6#Z%4`nX==T6GV>94;tKxhY;hXY987)-Q(j=w3>4nv-Cjvw7%!kRvj zWSx1x6gt^Twge#>3;P8Rkkp%^hF2Y9G#!Bzz58JeF zI<^nwl-~{1#`%{gaJu%edBnBO_@fWls~%l8$bBO5mqq z(rR9h9re9qbw?g$Emy!{IEg0`3B?*I=ki;Q&3^Om)OfdGdOv_OIga9&(KB0SYC zIXp~PU;r_E{j|1H#dlR5Jp+ePe(@`4HT5|i-EV+jVz4QTt2g+?+xkClp5BVvjYB^9 zK{yLyJv0LC$YzQVbC@+a8Xqh?t_T`X4wGfEF!UquSdC4^k zg8c`JaCDQSrTl%6PdwmN`gekg{q=}Yw$H2d2jm){?-mxd?9cbL?HA^^?i%Yq;rsqr zesVS{g&PFeJKMPuq6mxAPh>epV8b;V_%??McKh% zvx9YvZO)_No{?u`6->*F2)}@6XH&xvLjmnhq&?QT^yN(uH}4+R>;tlS6og|!(i~AD zae5p}#3h=(nx4L7GT97noRUf^pv@9zIee8f!ot$lx(613&$7VLZws5ob#M^DaQyI# zcUpH$#0XI&l8qR2nECr_QaJa=04G3vy=w9#=g+$;Eo6zW2R$hoUa78>M4iaTD`LDaHJ zHOnL+f}zy+?AH9}&C<sJ*id*c6yLPO|jC&xndS4poljbm?JFon0V`9)hp? zq~=fW%WN*5VMsm!ACiP7HrPpP@eNqL=*WuT+^g1hI{;qKRcD1&!a=;bIDcrVtLK89 z`|@sK{9vPZA}lRAG9Jp}B zsMrch7M@%c(Rh0%fLct<%0obtlQA39iBG1JqSlkKg1_JlHY$2L0kfem)i0_--a@ai zry8{wr5G7Z8tA0xwCJRAqF3%kmz@x13NJ9fF-1&Ed&WRVBSq6ZR2yvWS=7QciQpInP?iS=@=$c1`3J9HkMDx1t<{9$dW@g(HJe;L zaho>NC?Aas@eWsE3o#ph3zV^mnoYL;X*-4$+yQ0mQV^cafpo8Fl4g%|U()egiyMDJ zR&~`=>u#+Np&8@rHT9iMq%wamM|ZEV{N!jX`7`0=;o%VQFRP1oj=x2ZuZ4E5tD{be zpWaXpZ>Gv%+LxHF7IPWqb4=Hz*?wn>)wx-V{ly${PdgNv}19IP0sMTWO&R zx|N>`)f4MQxz4eID{4Z6%c?^{%Sgc?B+@@Yb#oI9gt>+KH4E!-3v;ClM-H5bx#S=iMJxq(ZW8N`4JC_?oeszDUIdVrY8`KD#9~j4E%fX=q}msS;fSaVdn)0lz#Z zOOg>(MI-{#fi~Oj4UU%{p zE8N5s3!m+;6f5(kMG-kdZJbmTuKe`nlE^W5UtQRm(x^?p&%ze%y968Lq@J&vC4aZ&~L#(UkoI;?IK*{sf7@ZGam2qD73 zD#Sw#rW#Yx!CN3Ek)2bvq+%@igR{z$8vAF5n47nkfqj@;9{FlHGqVXBtuR$sxLa=K zH-XD?8&bSZeXn-2;8up2KS$OH;o}8n9;FTAt%daIjMU1+X>h*Oinwl9XtHR4_19QZ&@}GcZz8);GSS@_au$DaYetzmIm;nTu4VWR5T_ z!BZy2TSH3X@^wRbJwtZ>ae$qg1RBz>*zy9CKvT;=Q!JptM#J2gpJ%>SA^Qv8hd$Vo zcMwtyrKAE<)JSS1=gZTVoCl2>in5yQ*EUR8ELP>AGp>sz(n+tQfOk(q{zcRwpgr45 zFW>q(LoMV0%Kq&39OTmhOdepT08zb@QZ6!`cp^l%F4}{`KUC$A=hNBAYnTl^@4|+< z?2Ou)d`N<@jK*>T%P;gX6nH!~0lazuldoN_-55Ra*Pr}9mRn3KN{Xcr@}W5v0sOoS z+WDSeA9tbq8r>K+7g-PUrOHwW{qXBVg@S<>zJijK*Tmc?JtFrQsWH2GQ=L? zcV)99^!z++0vG~Fcwl(+`P*kx>nHHp>Y=3Sm`aSR4_4XT#)X~Y1`AO}Wy!iou&M9d zxRxU>(F~k=O6F;yQ%)S~Z-U6oFlWxR@>0mhtjWiCDXnLgnOmq^_g~yy-hDP97Q_rX zGqL@8X<_?t+LPz2Nh=K*;``sdxTs~B!w~b5+=I_{3ZZ{~+<`uD$LvkxGipPo!h(!8 z@fD+q$ftwj7X`2bHlH-dm~y_aE#5wgGw%ix!cMu{yB)!v&CNnyKZafc*hg2pIm>t# zJM26O5MN;#FPkFyL$f}hgc^pW(Gwpjq%!{*v2nP2y1%2OzI)*WQH10(`QpuT%_AaJW$ia9c-l}S@6Gz9`~uqTnX38`R2_nT z?*+N+hAY-t!dECh$CGrwZb9L`iE=CkY2En#Quz^^;#ao6rK&LvpBtEn?khO5u5}pU zq%dy}*hJU@bw2BWz^1~-A67gNeFIOO-fi4AxQ)BI^%|$($^A%ZBAo@Y(nKa6dGX+` zzAlyj%x@Xv65xjmFdiv-)89M3(MU0OPPCP|rF)C?yqh)pX{dI@rZ6fbG}G7GJ={75 ztX;gtmam$P01=>|go+@D0ELYA@8sQOBA82wVT+GCIaie4VD(fH2xdc+UKZ6`v75!?&I(3Ke zC|UREDVAXhenLaBZzyv#3GtY(L^~;KH#XC_U901YY-Omu96vg32NEYdgUX||Ef8uBkmbz*qN zwNIl$H`o-vNmR!F+Qt_Q96fAh1QrzpCR7a{t0z}hoG2wRa*${?fgLW6i<>9T@;u`% z!7qz7Zr)S7upJNqf)@tpyJF1;bG@wxg$1p<^;)qA1hYl>U-QB#R*)>38d`BM00IX$ zY{Gn80EZx+phT3voGK^|?c{ICxsLYUN^QH7Wmj;fK^~IW;OM9=^u>V9mCZe1k9eNx z$Bdi7VDn69o%TaNfSw1$X|dmSa&`g6Z&xs`ioso5QCY!FtL&m_e?ioW4?@=mD$3VK zhoCzRc0w(1ftshy5d9_xM{Y~{@pYk-qbkwxfY@LsyJ&AeU`<;6$11Q+x*xX6AXDx! z$Ch|L@-Pw1_Q@A|tz*TwD(44?Imd|q42vF?ur zTToq9rr~=76Y)a}RN#F94>9#fgO=e(Vgr5VrMN4Eg7rr*6G|)@#sU6$b5ez3!Deo0 z(9(Di72vlhQFtZT)C~`<1i|KTzx93HulteN9OkpC#MQ*+jE?khj}G^gb&iPe@`Hc^e~w{wG4n^O_s3#(y>gHr2n@5*r`|rzM=l z{y1}v{g@`DFTXFfkDFZ}{y8*P9NrKvjc#Tvv5%&wX5?oOlJskXih~NYYQVAUOlFg3 z-3VAq1(^+vY<^y$PL3WSKyI;bZy_DmC(mENDBzB)02&Pf>~LGwC^~wWuKiq!kgrO> z=evnU5sQh%QKD{N=F1n{7b@&(0DHiYAFiKkulaf9@(Gw;(fjZbv3t#2&OO&6gH9%u&%xSP1W6m zB1$Kuww8lckOS-QpCV+#2F$pYwsgxtu{M{&aAECr?FsAwSoVhG!-rDGEFy7Ar4O<_ z1>5z`SY#CA6H{mR8|k3-eF5ERk6H$O4`xhQCHi_I>qFMT{F{zN%tt5#f7O97{te`7a+1iX;@ww zHq^k}=U2RXd=NPm3*kQLeJf(|zi_7unCXW0k^XT%V zBx)s{6oCu_z$$1bv0Nl}@vW>Hw_|5jN2Le-zYiy1!P2T$Ik$A3Zu zZnm)Sjf#9DT~C0A`_uby@(dk*+YjICl3F?eA2$Ty$NiX_#l1(V5c|x#pLjp{{(a#A zt#($eKlXyeB<)is1V7&#(()eTL~u{3@dyth5?nm>~sNh zhsS{Nx{UrqudaPu`=s`1?X%kFffqU90N#Hfg#Q7*}Z zY{-qfOY;_i{specknS5V-TSLmI?vYJlI=5w0t zzm>NDGg&vbCFD5HZ8Ix*kLL|uGR(8;F*%Bs$)64nGq36GpEqy_+MTI$Z8FZTMG0@* z@YSAxAC3eeLaNb%dCkc5dO`}RWc#elIob|?JYHF(sq^_h{(N@RiUiv=X3$)k&vx7C z#%RKU?r&xKm+>G;M5g6TL+VexV5(*r=FY;Y@=ife71|oRz+5EnMGtMCzxwx?{$97B zsC|8=W9#pK0eI$mld3Y}eE1VeyH!gJOw{bZ*Wkp?L2000(%oc(FHv*#-}fOigHT0N zTGuFh@k5oB(iq*~L?twGHvnF~-qclV)JM%2Z3fvW8g)J5sT}T>sa8mj&K?p{(?X(X z{fHi=gQWV}Mar~$)rK~qOFKQ8Pm*W$F#91fPGEZpK%Ze(M~!r!?e{0hUTWE)r0(@; z?Vzr?8yp-??Jp5e@d{;)n<%&xbWPOyNpi=X6E=fBVAxo?NV6D0hZ?&OeOBups4ctt zY};>opgw|9brR-(8=!ALt~pb7%anB}nQtpWHYeiM1|WNvv&sOuSO0e#j7t$**U+Ia+J2kO}{IgPHp=AgAFxZRY^sSk~c(@x7rQindNFB7u^ zQWCF{5*)0rGkqI%rFf&D(r4pS@3kKKlz3+2g$ltrHouIfcTBYpU#s8p7Ki#Xwt?Kc zXM(lz_pP`FlOK7dexpxHF51Aaka0$h<(Vj@HFZg`b{+!1=qGS_V1Pzd-#FbpoEOEa^VeCZH>2?L|Cx8O8`w?XcBa7@6Qrdsr`|I2vy;e*dCe(FM z5=~UO?%R z7Ab<&7&dIIrN}gX$q;kXHP2-`9BrjEu8bsfeDCXM9OxtM2>IEXZv~&t>Vtkv|3K1W zz|b2+8@Gx#*72rZ$K$PHt5X$syZ!uOKTYj-2U!m)KLrDDlHAB;mSL@VK3W7v)$;h` zV*(%09D`T*oA{%E%Fvv2x2#JufIYl&zd#Tb+@-X{WeDthlhRh`BQ zU-RhDtqHoe{2f4g7KoleR@V{weV-O@@WdyZg8)2nFVm)3L03Wpb)Lx%LGYOKph&a> zgh*fIuoh$sxN59TVw?Y1_D2+ zil<`yr!)8h2*`&a00MqMB`U2)Hk>-g)z3bYp0^N{lnh6YDr{9l&@-*5v3XC7|XyE{tu}m@!B-LQ>-m8TQi&fj5pPPKI^b zq{um!LWfOY0UB=?vuLq%KAE=1F=u1EAdqeuS(G(F)(aCjq?wNFLdl!w-s{v9Lt?8tdH+5-71>MZ{@|h3=saqHh#ExB0 z28I?4Vpg|l@N9`%!9CSV88^i%d&oo;ZbX@8QGm;@MnMu1LN}%pv0{N&;aZ=t+95CI zD)L^jFmvQ_Ai~Z+E74R)oL(IR;f0@x0a04PSrh(R!q(UlKDy6HA?prK52G1gb;6+I zlm(Mrt?%09RT~x18Jd$qVphJM=WRX+?bM+)ftgzKzJP#OyiNO*1gT~@wtJ+ur;aVv z3?T^~-_ZTOyoI;r9F4~wNKk#nAMB63BMqb5@>+fpL-Ns;n$x}XF8!KTnUFN^l6C^+ zSDJ}_(Vlcn2q`WoDUWz`Z8NbIBgiiW0jvyi>%yamED0rUv^IM%&5tI*QI_h=}MzLWgRhMMl6YM z2%Hh8Y)AD0TFw!=l{JfiNr{iMdf3#%faGs0H~>aLjnRqDkh>tCBX(r(yB0CFNrkv6 zs{|(|!;3;y(#$Z=R}Q%|7lS2mkZA7l>~oajGQG)lW0+!1t7C=ZJ~WK)TG$R zP{;D>r|fDHL(wtn*S|`WFOK zY4NC7mnl}j3VkY!x^$I;?ZgjJ5u$F)==VBbQB`S$SN!=4wWS@tWxZ)diG z!ShVqi!IK!LD{r@HAA^v4x&%`T+;}HMBFmqyfJQ}mRKj-*aM2-bGA%|VBq+zbmIoQ zppcr8+>keenz+B~r_@1dtaCbaQS<36a&}pC;+{Q;*i+STs}2Y>Z0>*e(14WWa-kGr+PyH?cWRMlJ%a4mr>peFqn;1Z1qP%M!!+BklhSl#H z5rF8u-=fJUp44w_Bxfg!k4bb!18P;CZjoc)Eu_dY-TtDysc1_@4J%|4B9n4Se}Y5V za+m^?Kvz9apgE>u6XsWYC{gBM|FYtEsbZ*1@|I}J>_O}t`p!*c)-)BK_Kg$i_X#!s zd}&qpB1d!xO^g%?iZ3hqB9c^c zu#K|3zEJa8@#HIt1my`sOEK~CA&|_(@d*j3PxYp@D?j5L*Z`l!%h=-W*;yTgor5*- zJ9U<{dSyV-%Yn#AJ*=}g%+G%a-eD2lZ|Y?@|8)pas`NuI8*J7{wj3yIS>UI+O>Bfwgasw!n*b3M=>gIPEQm8 z^MfAZq*x#ulM##TEnJ7oXgaj#As-PD_?iut44{z$KX#7fhd|fpPt8}GG3{sAtJ zhI6L$GQuqZbdb&vvJ$_9mUq!x;?PduKcd`8L}BGJ^ky#${=@4WU~V5MoYZK{>Q1Ch z!^BN--TS&h5?kq)38qZ{*$b#c@!eU>9WA$}omhU;XCQar&$OL#$f2I1W6Y`2fw>k$e+0LvVnGQQeRFCzHEKj zo||xsa(IvZ%g^);?>ik=7{|BGS89Jj>H`-Rj?+1h{WroeB#|ch14eG9Osy05-fSu< zaBE`D^%}f-N1ZJxNUL%*-n(2sz%XrYjVt}wEulvcp|F*$G}ipd5@lAneu?TvDeB5I zr{3cnq51YF_-6j44N9^;;PsfeC)j02)rGKrzo-Eq%i{_LO=Pn#;0rzF9#Uuu>`_$3|hX?^DtAMGi4QcQ-F z5ZDTraJZA>D3s6 z_C_?H2?ziKZ-s$p1}6Z{oT9gI5cV@JbT(V|SSTbMJp{%0LV!ka2iAE5)TC@{gLiNp z2m&%kGFf*?l-c*~_KTl{a`Weku*n7xP=Ta(1bSf&5L-xE7??8YenE2=-9JNDwn0b3 zGr-Q$)Ilfe)KNjd7=;ShiALW{Q{$A+K@%GCX~rs>#BZmQ7r()e@sg{(%qO2JU!ptl z7wZZRJ(E0X`2iSR3|cA=Y)eiNG01j>=*bHKol32XWWm z@TO(gr@hOf0~oid2bm3m!s*EC3+7~7ZEk~!>@vag;?>!;KH=MYt~rX#J)su1S(U0D z;D$m~nSfxMFpsK?l? zZbx1CMH-Xp!C6o->ry3-bBta#{|ZaIFT&w#*z6tKN75(s#K6Wi2n2d1C9k6-LVwBI z(Sjmxe)gIt6Yvb!xn%TW{T>j#kcawPa4*7Y{~4YfCtdqV^c?d6!F}rC6urHZGs^u4 zE{ZUE5<88uIdQKgM%AzqvhOryRchFo(ojHT;G8!bkcIufY(%!MkfGqZ2qxBXViksJ zCrxVar_6NG0Z1^JZ6umj)7B^Z)GR)KSM}0Bp>}Go_3P=@V^enqS}m!swjp*Kd>$o~N&XJVrNtJKdSq5?lZ!UZ$eQMe6;foh| zF-ekaJjqzDBe|~37ATc1)fiu&q{m`2wPQv~U6*ml000)W0BnbZK4WUl@Up6jM=UI> zA0dO}@Fl(Cv31w2r0*8Xdnr8C`lJ^R(M!xnIz~Lj*Vnclb)BW`S5Il^UvXYWnUAdiK*D5nE8anAW|bW^KP53c)8EY@zf_3f{2FeaHvZ0LDm9l z1b48iv#uXGT@~&_i^&bwU^r}_!!&!s5d3jQk@ER# z0|9mjXjnRMN2Mxq8W*D+>l%`U)1xXO%qDo7WXwJr@nLh`L8XI` zU73-O$%%xyLH;Rwhjym53Jb9r0%8&7TjH`={eK5WtcKA=fm;OAuCZZRkbo6@O!;gJk z6^Z1_`AVn(hI;=nqe)jAfCDCLxUiiQT@(UxZ&O5Y*y%3N@ie}I9b;$I9K=%2!|u`N zxdQD)4r}AqK!I|oKir5~RH#%3MMrnc;1X)G(-B~tu2;&v7rU&%zf&8(U5G7|YLVdr za<_cf5cWP8`)G;gTM|)ZEf+l#TyO=^ykNfpSC`{5D| z$P2U9hgv?0{Fzv@M9EoKEA^*@kEVpYG~unK+)Qw8o~JmDKawI?v6@F6!$7wh$^{09 zA3mb%8Ox>iZ|C+}0;_MdzphU60X8*P%)D6?Q$@-kNE%a5lF8^LI1SkY=>_{yFX8b* zF8PW|lksvl+R(?N1B7UHt9%`;yNzbGBJ5gWyDc&At&tD&M{yU&4n1mNagJtps8L(a z6|@F{--Y=)LF|6N(=P{G+>|JC@cNYF!j}RBuIfq3ZcK| z1&xh5W_FrRov5D3*B}e1WLYM^DY4$NtjH`RaW(|%EVsmqYyh_GlbT8a3(Pdr{9l3V zM|Isw8E0i8A6>?D#Tm6*~v5MM*Zo8&`N!LqTa&>>+w*`)rx0!&zoY+dyep#jD-5mCFyt&E*;5q2x zmJqhVE=Tu99O8!FHK|NNNq&<3yIiyw`-%IabMRk#CMS<{ogO*JoBWN1tC(7H;g`w7 ztu*XHX4qjaYI4WjqRJ^SWf3f?n3~;wzlY)9C8XPtS#>pH9Jq(DHaI|jCgJUgyN4=* zucZs!B>21ppUc0I;BF){QO*?o)2(Fgaj1oK$y*)UWj7LCu>h!`BVrpc!TK_o{3+=0 zgN*5v-5xUV!ehxr+qI3mk`x8N*miCs={UiAGYAZb0t2GJF%o1KU~V&CNpQiZ zj4`y`w~_58+9rGZBQ5)|h_5)nehMakN+m(<1dAE+wnh-)Nb{R9GoS~QtPTYD|8iTs z*4B!(SS5r!%RagKZqpt9u?qgL92y=5sCvWS6-EH+*Nh3*?1GWLyHub+*rAP1*l$9n zKdlb8*TeK~91XG4b%fjkW}XqIH`eZb=)*l1qQkkAKvE`^%(I==XC({-TMPF{PKw)4JyQOk~l6zC#5Cqii(697%u|i$00?lTq&l zYqV$$k;tKPBoF~PLVaxB5$e6!>^W*wM0;+Uf`!b38?@`&?)iWi00bCkJL#8qn=gBZ zT7PF+8~}jN{>i`tfbS*wZy)>FJ1nn*7~lvDAYi}$As67tb=2@B1}=TcOnJa8R79Hp zy?sK*@h~}vn(Cc|N>knYLh7gD1SlQ1Y#IyXCWfH$C8UgSsIecXbxuo$dtwo23(7`0 z$R7=(jVK<~KF~$^pdr1Si%(Rc4AxZ*bKZ?zfwHd?)Nh+x&9c_DxeA8}_p8TP*#l*U zynPkQzu9WVdd2OJ%^fYr zh6L7>6VF=2SRuIFR8^|hQj}F$a!XtGn5R{#@+w$sK5EP1%CD2qmXAhv7_?NV)+&)% z?-j}&gCNNpT8CBTn&u-?8w_0Mcg}N>&=B&jC(dU(@r*j!23M}7e3TbmW)HBmuR<^X zE3a4FriJxJ64?KaA)gHqlH&D0xCSP!837))<$;IkXz*92J)P~f(@FaGJk-v@*!byhZ}c@g%rr{Re%`(op{Q{ARc36u8?H@PH%TVNOI}o?WpA|V zx%H8{sxw+DGw-?3ccE&`-!NCD8`kJX)m7hFZtBL$W%aBSZF!N4;#t8<7U_G7&Tr3l z6Zvblh39X2mh8_Y0PvjaqKAA|5a2N%008J2tO=HbwE+=U2j~Us1MH`+8z=0AtR4f2@1k~CHSI*iPUCLs-TufkX8VAeQrV|*y zqqA@VN#?TqJfo)*B`A~ArCRPK$T6&)p8LjinCX2p{2)dB|6L z<`ybb%p=6Yi9DThg%ednujM_(i8hZ^f|T^m=HAElf=fzES&`3o9&`Df;7SwTaXEb_ zBK;UXG34RcM_``MzL;IkV<~@ne1N)KJILus%>HVA_O-az4MeV;g!=i{E=We-A;O0* zRr;u`5L;o|y=1{WX~$~>IFvH+ca9AZ9-DRd1iswvyKnf53Bv|*KT?+z!Ix~?alD=K&v bRvG*5TspXhHo`OR-8IXTBr#@?C { ); const cancelButton = { - text: formatMessage(COMMON_LOCALE_KEYS.CANCEL), + text: formatMessage(COMMON_LOCALE_KEYS.CLOSE), }; return ( @@ -81,6 +83,7 @@ const ApiKeyGenerated = ({ data }) => { closeConfirmation={{ confirmationWarning: '' }} >

{formatMessage(messages.description)}
+
{formatMessage(messages.descriptionNote)}
diff --git a/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss index 3f59cf1393..b8fd9ae277 100644 --- a/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss +++ b/app/src/pages/inside/profilePage/modals/apiKeyGeneratedModal/apiKeyGeneratedModal.scss @@ -15,9 +15,18 @@ */ .description { + font-family: $FONT-ROBOTO-REGULAR; color: $COLOR--black-3; font-size: 13px; line-height: 20px; + margin-bottom: 8px; +} + +.description-note { + font-family: $FONT-ROBOTO-MEDIUM; + color: $COLOR--japanese-koi; + font-size: 13px; + line-height: 20px; margin-bottom: 24px; } From 2999c3d72acb59a99a43d791b1c1876653c26ba4 Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 9 Jun 2023 11:56:04 +0300 Subject: [PATCH 13/17] Fix link to uk.json file --- app/localization/translated/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/localization/translated/uk.json b/app/localization/translated/uk.json index 7495a339d8..c3ef7a80d9 100644 --- a/app/localization/translated/uk.json +++ b/app/localization/translated/uk.json @@ -1026,7 +1026,7 @@ "LinkIssueModal.linkIssueSuccess": "Посилання на помилку успішно додано", "LinkIssueModal.urlHint": "Посилання має веб-сайту відповідати дійсному адресою", "LocalizationBlock.belarusian": "Білоруська", - "LocalizationBlock.contribute": "Українська мова знаходиться в бета-версії. Будь ласка, допоможіть нам з перекладом відправте Ваш ПР файл.", + "LocalizationBlock.contribute": "Українська мова знаходиться в бета-версії. Будь ласка, допоможіть нам з перекладом відправте Ваш ПР файл.", "LocalizationBlock.english": "Англійська (Сполучені Штати)", "LocalizationBlock.label": "Мова", "LocalizationBlock.note": "До відома", From b912e8d808a507ea9012eaa6e71c088b6ea63b2b Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Mon, 19 Jun 2023 16:57:17 +0400 Subject: [PATCH 14/17] EPMRPP-84336 || Incorrect Twitter text displayed on Login page (#3504) --- app/src/common/utils/referenceDictionary.js | 6 ++--- .../main/analytics/events/loginPageEvents.js | 6 ++--- .../newsBlock/postBlock/postBlock.jsx | 24 ++++++++++--------- .../socialsBlock/img/socialLinkedin-act.svg | 10 ++++++++ .../socialsBlock/img/socialLinkedin-hv.svg | 10 ++++++++ .../socialsBlock/img/socialLinkedin.svg | 10 ++++++++ .../socialsBlock/img/socialVk-act.svg | 18 -------------- .../socialsBlock/img/socialVk-hv.svg | 18 -------------- .../socialsBlock/img/socialVk.svg | 18 -------------- .../socialsBlock/socialsBlock.jsx | 6 ++--- .../socialsBlock/socialsBlock.scss | 8 +++---- 11 files changed, 56 insertions(+), 78 deletions(-) create mode 100644 app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-act.svg create mode 100644 app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-hv.svg create mode 100644 app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin.svg delete mode 100644 app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-act.svg delete mode 100644 app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-hv.svg delete mode 100644 app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk.svg diff --git a/app/src/common/utils/referenceDictionary.js b/app/src/common/utils/referenceDictionary.js index 59ac19bee4..44fcef56c6 100644 --- a/app/src/common/utils/referenceDictionary.js +++ b/app/src/common/utils/referenceDictionary.js @@ -20,9 +20,9 @@ export const referenceDictionary = { rpGitHub: 'https://github.com/reportportal', rpFacebook: 'https://www.facebook.com/ReportPortal.io', rpTwitter: 'http://twitter.com/ReportPortal_io', - rpYoutube: 'http://youtube.com/c/ReportPortalCommunity', - rpVk: 'https://vk.com/reportportal_io', - rpSlack: 'https://slack.epmrpp.reportportal.io/', + rpYoutube: 'https://youtube.com/c/ReportPortal', + rpLinkedin: 'https://linkedin.com/company/reportportal', + rpSlack: 'https://slack.epmrpp.reportportal.io', rpEmail: 'mailto:support@reportportal.io', rpEpam: 'https://www.epam.com/', rpEpamPolicy: 'https://privacy.epam.com/core/interaction/showpolicy?type=PrivacyPolicy', diff --git a/app/src/components/main/analytics/events/loginPageEvents.js b/app/src/components/main/analytics/events/loginPageEvents.js index 987dc49d3f..ca260522e4 100644 --- a/app/src/components/main/analytics/events/loginPageEvents.js +++ b/app/src/components/main/analytics/events/loginPageEvents.js @@ -41,10 +41,10 @@ export const LOGIN_PAGE_EVENTS = { action: 'Click on Icon YouTube on Welcome screen', label: 'Transition to YouTube', }, - CLICK_VK_ICON: { + CLICK_LINKEDIN_ICON: { category: LOGIN_PAGE, - action: 'Click on Icon VK on Welcome screen', - label: 'Transition to VK', + action: 'Click on Icon Linkedin on Welcome screen', + label: 'Transition to Linkedin', }, CLICK_SLACK_ICON: { category: LOGIN_PAGE, diff --git a/app/src/pages/outside/loginPage/socialSection/newsBlock/postBlock/postBlock.jsx b/app/src/pages/outside/loginPage/socialSection/newsBlock/postBlock/postBlock.jsx index 3ea0632364..2004ee2b4b 100644 --- a/app/src/pages/outside/loginPage/socialSection/newsBlock/postBlock/postBlock.jsx +++ b/app/src/pages/outside/loginPage/socialSection/newsBlock/postBlock/postBlock.jsx @@ -29,9 +29,9 @@ const getPostContent = (text, entities) => { let result = ''; let currentReplaceObject; - const parseEntitie = (curEntities, getHtml) => { - Object.keys(curEntities).map((objKentityey) => { - const entity = curEntities[objKentityey]; + const parseEntity = (curEntities, getHtml) => { + Object.keys(curEntities).map((objEntityKey) => { + const entity = curEntities[objEntityKey]; if (entity.indices[0] !== entity.indices[1]) { replaceObjects.push({ start: entity.indices[0], @@ -44,7 +44,7 @@ const getPostContent = (text, entities) => { }; entities.urls && - parseEntitie( + parseEntity( entities.urls, (entity) => `${ @@ -52,7 +52,7 @@ const getPostContent = (text, entities) => { }`, ); entities.user_mentions && - parseEntitie( + parseEntity( entities.user_mentions, (entity) => ` { }`, ); entities.hashtags && - parseEntitie( + parseEntity( entities.hashtags, (entity) => `#${entity.text}`, ); entities.media && - parseEntitie( + parseEntity( entities.media, (entity) => `${ @@ -78,18 +78,20 @@ const getPostContent = (text, entities) => { }`, ); replaceObjects.sort((a, b) => a.start - b.start); - text.split('').forEach((letter, index) => { + + const symbols = [...text]; + + symbols.forEach((symbol, index) => { if (!currentReplaceObject && replaceObjects.length) { currentReplaceObject = replaceObjects.shift(); } if (!currentReplaceObject || index < currentReplaceObject.start) { - result += letter; + result += symbol; } else if (currentReplaceObject.start === index) { result += currentReplaceObject.html; - } else if (index >= currentReplaceObject.end) { + } else if (index === currentReplaceObject.end) { currentReplaceObject = null; - result += ' '; } }); diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-act.svg b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-act.svg new file mode 100644 index 0000000000..6dfc17d962 --- /dev/null +++ b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-act.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-hv.svg b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-hv.svg new file mode 100644 index 0000000000..7f2b574297 --- /dev/null +++ b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin-hv.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin.svg b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin.svg new file mode 100644 index 0000000000..df40bdb837 --- /dev/null +++ b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialLinkedin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-act.svg b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-act.svg deleted file mode 100644 index 28c55c8d92..0000000000 --- a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-act.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - 0F744530-26FB-44EC-A02D-A89D0B1231E5 - Created with sketchtool. - - - - - - - - - - - - - diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-hv.svg b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-hv.svg deleted file mode 100644 index 68862c344d..0000000000 --- a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk-hv.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - 0F744530-26FB-44EC-A02D-A89D0B1231E5 - Created with sketchtool. - - - - - - - - - - - - - diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk.svg b/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk.svg deleted file mode 100644 index 38e1ddaeab..0000000000 --- a/app/src/pages/outside/loginPage/socialSection/socialsBlock/img/socialVk.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - 0F744530-26FB-44EC-A02D-A89D0B1231E5 - Created with sketchtool. - - - - - - - - - - - - - diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.jsx b/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.jsx index 8b39757407..ffcedd6f59 100644 --- a/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.jsx +++ b/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.jsx @@ -69,10 +69,10 @@ export class SocialsBlock extends Component { {} tracking.trackEvent(LOGIN_PAGE_EVENTS.CLICK_VK_ICON)} - href={referenceDictionary.rpVk} + onClick={() => tracking.trackEvent(LOGIN_PAGE_EVENTS.CLICK_LINKEDIN_ICON)} + href={referenceDictionary.rpLinkedin} target="_blank" - className={cx('social-link', 'vk-icon')} + className={cx('social-link', 'linkedin-icon')} > {} diff --git a/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.scss b/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.scss index 256ebf2bcc..532e4e491c 100644 --- a/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.scss +++ b/app/src/pages/outside/loginPage/socialSection/socialsBlock/socialsBlock.scss @@ -58,13 +58,13 @@ background-image: url(./img/socialTw-act.svg); } } - &.vk-icon { - background-image: url(./img/socialVk.svg); + &.linkedin-icon { + background-image: url(./img/socialLinkedin.svg); &:hover { - background-image: url(./img/socialVk-hv.svg); + background-image: url(./img/socialLinkedin-hv.svg); } &:active { - background-image: url(./img/socialVk-act.svg); + background-image: url(./img/socialLinkedin-act.svg); } } &.yt-icon { From 463fa82f88220b42cffd8a31bd0189874718ffcf Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:19:30 +0400 Subject: [PATCH 15/17] EPMRPP-79853 || Update configuration tabs and examples in user profile (#3505) * EPMRPP-79853 || Update configuration tabs and examples in user profile * EPMRPP-79853 || code review fixes - 1 * EPMRPP-79853 || code review fixes - 2 --- .../configExamplesBlock.jsx | 20 +- .../configExamplesBlock.scss | 10 +- .../configExamplesBlock/tabsConfig.jsx | 192 ++++++++++++++---- .../pages/inside/profilePage/profilePage.scss | 3 +- 4 files changed, 172 insertions(+), 53 deletions(-) diff --git a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx index 3b95bce288..976b942a5c 100644 --- a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx +++ b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.jsx @@ -1,5 +1,5 @@ /* - * Copyright 2019 EPAM Systems + * Copyright 2023 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { ContainerWithTabs } from 'components/main/containerWithTabs'; -import { activeProjectSelector, userIdSelector } from 'controllers/user'; +import { activeProjectSelector } from 'controllers/user'; import { PROFILE_PAGE_EVENTS } from 'components/main/analytics/events'; import styles from './configExamplesBlock.scss'; import { BlockContainerBody } from '../blockContainer'; @@ -26,22 +26,18 @@ import { BlockContainerBody } from '../blockContainer'; import { TabsConfig } from './tabsConfig'; const cx = classNames.bind(styles); -const API_KEY = ''; @connect((state) => ({ activeProject: activeProjectSelector(state), - login: userIdSelector(state), })) export class ConfigExamplesBlock extends Component { static propTypes = { - login: PropTypes.string, activeProject: PropTypes.string, }; static defaultProps = { - login: '', activeProject: '', }; render() { - const { activeProject, login } = this.props; + const { activeProject } = this.props; return (
@@ -49,11 +45,11 @@ export class ConfigExamplesBlock extends Component {
diff --git a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss index 7159fedba1..8c7c32c71d 100644 --- a/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss +++ b/app/src/pages/inside/profilePage/configExamplesBlock/configExamplesBlock.scss @@ -1,5 +1,5 @@ /*! - * Copyright 2019 EPAM Systems + * Copyright 2023 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ } .content-wrapper { width: 100%; - height: 360px; + min-height: 360px; padding: 10px 15px; border: 1px solid $COLOR--gray-80; box-sizing: border-box; @@ -43,8 +43,7 @@ color: $COLOR--gray-60; } .h1 { - margin-bottom: 0; - margin-top: 15px; + margin: 15px 0; font-size: inherit; } .link { @@ -56,3 +55,6 @@ line-height: 15px; word-wrap: break-word; } +.note { + margin: 30px 0 15px; +} diff --git a/app/src/pages/inside/profilePage/configExamplesBlock/tabsConfig.jsx b/app/src/pages/inside/profilePage/configExamplesBlock/tabsConfig.jsx index 52145aedcb..41ad197d1d 100644 --- a/app/src/pages/inside/profilePage/configExamplesBlock/tabsConfig.jsx +++ b/app/src/pages/inside/profilePage/configExamplesBlock/tabsConfig.jsx @@ -1,5 +1,5 @@ /* - * Copyright 2019 EPAM Systems + * Copyright 2023 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,12 +14,13 @@ * limitations under the License. */ +/* eslint-disable react/no-unescaped-entities */ import classNames from 'classnames/bind'; import styles from './configExamplesBlock.scss'; const cx = classNames.bind(styles); -const javaConfig = (token, activeProject, login) => ({ +const javaConfig = (activeProject) => ({ name: 'Java', content: (
@@ -27,8 +28,8 @@ const javaConfig = (token, activeProject, login) => ({

REQUIRED

rp.endpoint = {window.location.origin}

-

rp.uuid = {token}

-

rp.launch = {login}_TEST_EXAMPLE

+

{`rp.api.key = `}

+

rp.launch = Java launch

rp.project = {activeProject}

NOT REQUIRED

@@ -40,73 +41,194 @@ const javaConfig = (token, activeProject, login) => ({

rp.mode = DEFAULT

rp.skipped.issue = true

rp.batch.size.logs = 20

-

rp.keystore.resource = <PATH_TO_YOUR_KEYSTORE>

-

rp.keystore.password = <PASSWORD_OF_YOUR_KEYSTORE>

+

{`rp.keystore.resource = `}

+

{`rp.keystore.password = `}

+
+
+ {`NOTE: should be replaced with corresponding apiKey from API KEYS tab.`}
), }); -const rubyConfig = (token, activeProject, login) => ({ +const rubyConfig = (activeProject) => ({ name: 'Ruby', content: (

COPY AND SAVE IT AS A REPORT_PORTAL.YML FILE

-
-

uuid: {token}

+

{`uuid: `}

endpoint: {window.location.origin}/api/v1

project: {activeProject}

-

launch: {login}_TEST_EXAMPLE

+

launch: Ruby_launch

attributes: [key:value, value]

+
+ {`NOTE: should be replaced with corresponding apiKey from API KEYS tab.`} +
), }); -const soapUiConfig = (token, activeProject, login) => ({ - name: 'SoapUI', +const pythonConfig = (activeProject) => ({ + name: 'Python', content: (

- SET THE FOLLOWS PROPERTIES INTO PROJECT PROPERTIES OR SET THEM TO SYSTEM VARIABLES +

## pytest

+

For pytest copy and save the following properties in `pytest.ini` file:

+

REQUIRED

+

[pytest]

+

{`rp_endpoint = ${window.location.origin}`}

+

{`rp_api_key = `}

+

{`rp_project = ${activeProject}`}

+

NOT REQUIRED

+

rp_launch = Pytest Launch

+

rp_launch_description = My awesome launch

+

rp_launch_attributes = 'tag' 'key1:value1' 'key2:value2'

+

rp_mode = DEFAULT

+

rp_verify_ssl = True

+

rp_log_batch_size = 20

+

rp_log_batch_payload_size = 64000000

+

rp_log_level = INFO

+

rp_ignore_attributes = 'xfail' 'usefixture'

+

rp_is_skipped_an_issue = True


+

Then run tests with:

-

rp.uuid = {token}

-

rp.endpoint = {window.location.origin}

-
-

rp.launch = {login}_TEST_EXAMPLE

-

rp.project = {activeProject}

-

rp.attributes = key:value; value;

-

rp.description = My awesome launch

+

py.test ./tests --reportportal

+
+

Where './tests' is a folder with your tests.

+

+

## Robot Framework

+

Run Robot Framework with the following command line options:

+

+

REQUIRED

+

robot --listener robotframework_reportportal.listener \

+
+

{`--variable RP_ENDPOINT:"${window.location.origin}" \\`}

+

{`--variable RP_API_KEY:"" \\`}

+

{`--variable RP_PROJECT:"${activeProject}" \\`}

+

--variable RP_LAUNCH:"Robot Framework Launch" \

+

./tests

+
+
+

Where './tests' is a folder with your tests.

+

NOT REQUIRED

+
+

--variable RP_LAUNCH_DOC:"My awesome launch" \

+

--variable RP_LAUNCH_ATTRIBUTES:"tag key1:value1 key2:value2" \

+

--variable RP_LOG_BATCH_SIZE:20 \

+

--variable RP_LOG_BATCH_PAYLOAD_SIZE:64000000 \

+

--variable RP_SKIPPED_ISSUE:True

+
+

+

## behave

+

For behave copy and save the following properties in `behave.ini` file:

+

+

REQUIRED

+

[report_portal]

+

{`endpoint = ${window.location.origin}`}

+

{`api_key = `}

+

{`project = ${activeProject}`}

+

NOT REQUIRED

+

launch_name = Behave Launch

+

launch_description = 'My awesome launch'

+

launch_attributes = Smoke Env:Python3

+

step_based = False

+

is_skipped_an_issue = False

+

retries = 3

+
+

Then run tests with:

+
+

behave -D config_file=behave.ini ./tests/features

+
+

Where './tests/features' is a folder with your feature files.

+
+ {`NOTE: should be replaced with corresponding apiKey from API KEYS tab.`}
), }); -const dotNetConfig = { +const dotNetConfig = (activeProject) => ({ name: '.net', content: (
-

FOLLOW INSTALLER INSTRUCTIONS

+

+ Copy and save the following properties in `ReportPortal.config.json` file which should be + placed next by you test DLL: +

+

{`{`}

+
+

+ "$schema": + "https://raw.githubusercontent.com/reportportal/agent-net-nunit/master/src/ReportPortal.NUnitExtension/ReportPortal.config.schema", +

+

"enabled": true,

+

{`"server": {`}

+
+

{`"url": "${window.location.origin}",`}

+

{`"project": "${activeProject}",`}

+

{`"apiKey": ""`}

+
+

{`},`}

+

"launch": {`{`}

+
+

"name": ".NET Launch",

+

"description": "My awesome launch",

+

"debugMode": false,

+

"attributes": [ "tag1", "tag2", "platform:x64" ]

+
+

{`}`}

+
+

{`}`}

+
+ {`NOTE: should be replaced with corresponding apiKey from API KEYS tab.`} +
), -}; -const nodejsConfig = (token, activeProject, login) => ({ +}); +const nodejsConfig = (activeProject) => ({ name: 'NodeJS', content: (

- FOLLOW THE{' '} - - INSTRUCTION - + Choose the appropriate{' '} + + test framework integration + {' '} + from the list and follow the configuration guide

-

FOR EXAMPLE:

-
+

Fill in the agent option as described below

+

{`{`}

-

uuid: {token}

-

endpoint: {window.location.origin}/api/v1

-

launch: {login}_TEST_EXAMPLE

-

project: {activeProject}

+

{`endpoint: "${window.location.origin}/api/v1",`}

+

{`apiKey: "",`}

+

{`project: "${activeProject}",`}

+

launch: "Launch name",

+

description: "My awesome launch",

+

attributes: [

+
+

{`{`}

+
+

key: "attributeKey",

+

value: "attrbiuteValue",

+
+

{`},`}

+

{`{`}

+
+

value: "anotherAttrbiuteValue",

+
+

{`},`}

+
+

],

+

mode: 'DEFAULT',

+
+

{`}`}

+
+ {`NOTE: should be replaced with corresponding apiKey from API KEYS tab.`}
), @@ -115,7 +237,7 @@ const nodejsConfig = (token, activeProject, login) => ({ export const TabsConfig = { javaConfig, rubyConfig, - soapUiConfig, + pythonConfig, dotNetConfig, nodejsConfig, }; diff --git a/app/src/pages/inside/profilePage/profilePage.scss b/app/src/pages/inside/profilePage/profilePage.scss index 55743ed6e7..01425d95ad 100644 --- a/app/src/pages/inside/profilePage/profilePage.scss +++ b/app/src/pages/inside/profilePage/profilePage.scss @@ -1,5 +1,5 @@ /*! - * Copyright 2019 EPAM Systems + * Copyright 2023 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ */ .container { - height: 93%; background-color: $COLOR--white-two; padding: 0 120px; From bdb0ff375f9a020f7684e161ae3aac2a65822198 Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Fri, 23 Jun 2023 14:21:07 +0400 Subject: [PATCH 16/17] EPMRPP-84528 || User search shows invite option for existing user (#3507) --- .../components/inputs/inputUserSearch/inputUserSearch.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/components/inputs/inputUserSearch/inputUserSearch.jsx b/app/src/components/inputs/inputUserSearch/inputUserSearch.jsx index 0af466fb96..6c785340ca 100644 --- a/app/src/components/inputs/inputUserSearch/inputUserSearch.jsx +++ b/app/src/components/inputs/inputUserSearch/inputUserSearch.jsx @@ -23,7 +23,10 @@ import { UserItem } from './userItem'; const isValidNewOption = (inputValue) => validate.email(inputValue); const isOptionUnique = (inputValue, options) => - !options.some((option) => option.userLogin === inputValue || option.email === inputValue); + !options.some( + (option) => + option.userLogin === inputValue || option.email.toLowerCase() === inputValue.toLowerCase(), + ); const newOptionCreator = (inputValue) => ({ externalUser: true, userLogin: inputValue, From 5ec2eacb46d53612bdb26c06fe332b727d83a6ae Mon Sep 17 00:00:00 2001 From: Vadim73i <55870906+Vadim73i@users.noreply.github.com> Date: Tue, 27 Jun 2023 09:44:22 +0400 Subject: [PATCH 17/17] EPMRPP-84533 || Login with SAML. The error message is displayed 2 times in case user logs in via SAML with already existing email (#3508) * EPMRPP-84533 || Login with SAML. The error message is displayed 2 times in case user logs in via SAML with already existing email * EPMRPP-84533 || code review fixes - 1 --- app/src/pages/outside/loginPage/loginPage.jsx | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/app/src/pages/outside/loginPage/loginPage.jsx b/app/src/pages/outside/loginPage/loginPage.jsx index aa55b39143..b8c07b6974 100644 --- a/app/src/pages/outside/loginPage/loginPage.jsx +++ b/app/src/pages/outside/loginPage/loginPage.jsx @@ -36,12 +36,17 @@ import { PolicyBlock } from './pageBlocks/policyBlock'; const cx = classNames.bind(styles); -@connectRouter(({ forgotPass, reset, errorAuth, multipleAuth }) => ({ - forgotPass, - reset, - errorAuth, - multipleAuth, -})) +@connectRouter( + ({ forgotPass, reset, errorAuth, multipleAuth }) => ({ + forgotPass, + reset, + errorAuth, + multipleAuth, + }), + { + clearErrorAuth: () => ({ errorAuth: '' }), + }, +) @connect( (state) => ({ instanceType: instanceTypeSelector(state), @@ -59,6 +64,7 @@ export class LoginPage extends PureComponent { multipleAuth: PropTypes.string, showDefaultErrorNotification: PropTypes.func, instanceType: PropTypes.string.isRequired, + clearErrorAuth: PropTypes.func, }; static defaultProps = { forgotPass: '', @@ -66,22 +72,24 @@ export class LoginPage extends PureComponent { errorAuth: '', multipleAuth: '', showDefaultErrorNotification: () => {}, + clearErrorAuth: () => {}, }; - componentDidMount() { + showError = () => { if (this.props.errorAuth) { this.props.showDefaultErrorNotification({ message: this.props.errorAuth, }); + this.props.clearErrorAuth(); } + }; + + componentDidMount() { + this.showError(); } - componentDidUpdate(prevProps) { - if (this.props.errorAuth !== prevProps.errorAuth) { - this.props.showDefaultErrorNotification({ - message: this.props.errorAuth, - }); - } + componentDidUpdate() { + this.showError(); } getCurrentBlock = () => {