diff --git a/.gitignore b/.gitignore index e6fb68796bfcfb3f3ba053c98ca1192e326e4863..226f552a47c09ed3e1c567473615c83856e6212f 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,7 @@ mobile/Preview.html #Report bundle analyser public/ + +# CSS +src/styles/index.css +src/styles/index.css.map diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f74d36cebe49621d32be934985bf6ca3189ff34d..f5dfb2a8b8d9b60e65e24db659cab25700af728b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,6 +11,7 @@ stages: - quality - test - build + - push-build - deploy - publish @@ -25,6 +26,74 @@ variables: # include: # - template: Security/SAST.gitlab-ci.yml +build_stack: + stage: buildenv + variables: + DOCKER_TLS_CERTDIR: '' + DOCKER_HOST: tcp://docker:2375/ + DOCKER_DRIVER: overlay2 + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09 + before_script: + - docker login ${CI_DEPENDENCY_PROXY_SERVER} -u ${CI_DEPENDENCY_PROXY_USER} -p ${CI_DEPENDENCY_PROXY_PASSWORD} + script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - docker build -t "$CI_REGISTRY_IMAGE/cozy-env:latest" ./docker/ + - docker push $CI_REGISTRY_IMAGE/cozy-env:latest + only: + - master + - dev + when: manual + +sonarqube-mr: + stage: quality + only: + - merge_requests + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4 + variables: + SONAR_USER_HOME: '${CI_PROJECT_DIR}/.sonar' # Defines the location of the analysis task cache + GIT_DEPTH: '0' # T + cache: + key: '${CI_JOB_NAME}' + paths: + - .sonar/cache + script: + - > + sonar-scanner + -Dsonar.projectName=ecolyo-mr + -Dsonar.projectVersion=1.0 + -Dsonar.sourceEncoding=UTF-8 + -Dsonar.projectBaseDir=. + -Dsonar.host.url=${SONAR_URL} + -Dsonar.projectKey=ecolyo-mr + -Dsonar.login=${SONAR_MR_TOKEN} + -Dsonar.cpd.exclusions=tests/**,src/**/*.spec.ts* + -Dsonar.qualitygate.wait=true + +sonarqube: + stage: quality + only: + - dev + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4 + variables: + SONAR_USER_HOME: '${CI_PROJECT_DIR}/.sonar' # Defines the location of the analysis task cache + GIT_DEPTH: '0' # T + cache: + key: '${CI_JOB_NAME}' + paths: + - .sonar/cache + script: + - > + sonar-scanner + -Dsonar.projectName=ecolyo + -Dsonar.projectVersion=1.0 + -Dsonar.sourceEncoding=UTF-8 + -Dsonar.projectBaseDir=. + -Dsonar.host.url=${SONAR_URL} + -Dsonar.projectKey=ecolyo + -Dsonar.login=${SONAR_TOKEN} + -Dsonar.cpd.exclusions=tests/**,src/**/*.spec.ts* + -Dsonar.qualitygate.wait=true + test: stage: test before_script: @@ -43,7 +112,7 @@ test: - master - merge_requests -build-test: +build: stage: build before_script: - apk add git @@ -52,125 +121,87 @@ build-test: - yarn - yarn build only: + - dev + - master - merge_requests artifacts: paths: - - build/assets + - build/ -build-dev: - stage: build +br_build_test: + stage: push-build before_script: - apk add git - apk add bash script: - yarn - - yarn build-dev + - ls build - git config --global user.name build-pipeline - git config --global user.email "$GIT_USER" - git config --global user.password "$GIT_PWD" - git config user.email "$GIT_USER" - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git - git config --global credential.helper store - - yarn deploy-dev + - yarn deploy-test only: - - dev - - tags + - merge_requests + needs: + - build + when: manual -build: - stage: build +br_build_dev: + stage: push-build before_script: - apk add git - apk add bash script: - yarn - - yarn build - git config --global user.name build-pipeline - git config --global user.email "$GIT_USER" - git config --global user.password "$GIT_PWD" - git config user.email "$GIT_USER" - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git - git config --global credential.helper store - - yarn deploy - only: - - master - -build_stack: - stage: buildenv - variables: - DOCKER_TLS_CERTDIR: '' - DOCKER_HOST: tcp://docker:2375/ - DOCKER_DRIVER: overlay2 - image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09 - before_script: - - docker login ${CI_DEPENDENCY_PROXY_SERVER} -u ${CI_DEPENDENCY_PROXY_USER} -p ${CI_DEPENDENCY_PROXY_PASSWORD} - script: - - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - - docker build -t "$CI_REGISTRY_IMAGE/cozy-env:latest" ./docker/ - - docker push $CI_REGISTRY_IMAGE/cozy-env:latest + - yarn deploy-dev only: - - master - dev - when: manual + needs: + - build -publish: - stage: publish +br_build: + stage: push-build before_script: - apk add git + - apk add bash script: - - yarn cozyPublish + - yarn + - git config --global user.name build-pipeline + - git config --global user.email "$GIT_USER" + - git config --global user.password "$GIT_PWD" + - git config user.email "$GIT_USER" + - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git + - git config --global credential.helper store + - yarn deploy only: - - tags - when: manual + - master + needs: + - build -sonarqube: - stage: quality - only: - - dev - image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4 - variables: - SONAR_USER_HOME: '${CI_PROJECT_DIR}/.sonar' # Defines the location of the analysis task cache - GIT_DEPTH: '0' # T - cache: - key: '${CI_JOB_NAME}' - paths: - - .sonar/cache +deploy_test: + stage: deploy + tags: + - deploy-alpha script: - - > - sonar-scanner - -Dsonar.projectName=ecolyo - -Dsonar.projectVersion=1.0 - -Dsonar.sourceEncoding=UTF-8 - -Dsonar.projectBaseDir=. - -Dsonar.host.url=${SONAR_URL} - -Dsonar.projectKey=ecolyo - -Dsonar.login=${SONAR_TOKEN} - -Dsonar.cpd.exclusions=tests/**,src/**/*.spec.ts* - -Dsonar.qualitygate.wait=true - -sonarqube-mr: - stage: quality + - cd /root/ecolyo-infra-scripts/cicid_scripts + - './update_ecolyo_dev.sh' only: - merge_requests - image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4 - variables: - SONAR_USER_HOME: '${CI_PROJECT_DIR}/.sonar' # Defines the location of the analysis task cache - GIT_DEPTH: '0' # T - cache: - key: '${CI_JOB_NAME}' - paths: - - .sonar/cache - script: - - > - sonar-scanner - -Dsonar.projectName=ecolyo-mr - -Dsonar.projectVersion=1.0 - -Dsonar.sourceEncoding=UTF-8 - -Dsonar.projectBaseDir=. - -Dsonar.host.url=${SONAR_URL} - -Dsonar.projectKey=ecolyo-mr - -Dsonar.login=${SONAR_MR_TOKEN} - -Dsonar.cpd.exclusions=tests/**,src/**/*.spec.ts* - -Dsonar.qualitygate.wait=true + environment: + name: dev + url: https://ecolyo.dev.cozy.self-data.alpha.grandlyon.com/ + when: manual + needs: + - br_build_test deploy_demo: stage: deploy @@ -178,16 +209,33 @@ deploy_demo: - deploy-alpha script: - cd /root/ecolyo-infra-scripts/cicid_scripts - - './update_ecolyo_dev.sh' + - './update_ecolyodemo_dev.sh' only: - dev + environment: + name: ecolyodemo + url: https://ecolyo.ecolyodemo.cozy.self-data.alpha.grandlyon.com/ + needs: + - br_build_dev -deploy_alpha: +deploy_all: stage: deploy tags: - deploy-alpha script: - cd /root/ecolyo-infra-scripts/cicid_scripts - './update_all_ecolyo_dev.sh' + only: + - master + needs: + - br_build + +publish: + stage: publish + before_script: + - apk add git + script: + - yarn cozyPublish only: - tags + when: manual diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md index ba37698f819a73a0116bfccc7fc032e8bc9fb66e..577c107226e397f9a1d00fc48611ec246eb8fc1e 100644 --- a/.gitlab/merge_request_templates/default.md +++ b/.gitlab/merge_request_templates/default.md @@ -5,9 +5,6 @@ _Describe in detail what your merge request does and why._ -| :warning: Keep an up to date checklist based on your icescrum tasks during all the draft phase of the MR to help any other developer who would take the job after you to finish it.| -| --- | - ## Screenshots or screen recordings _These are strongly recommended to assist reviewers and reduce the time to merge your change._ diff --git a/.vscode/settings.json b/.vscode/settings.json index ce5597bb6c78fa4bf35605a1c3a43cc9609bae17..76eee681f17ebde069be77176d18df9bf3727003 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,11 +40,14 @@ "authform", "backoffice", "barchart", + "camelcase", "CONSO", "cozycloud", "dacc", "Datachart", + "dataload", "Dataload", + "dataloads", "Dataloads", "defi", "depense", @@ -60,10 +63,12 @@ "Enedis", "ENEDIS", "enedissgegrandlyon", + "firstname", "fluidchart", "fluidchartslide", "fluidtype", "Gazpar", + "Gier", "grandlyon", "grdf", "GRDF", @@ -71,16 +76,21 @@ "Konnected", "konnector", "konnectors", + "lastname", + "Lugdunum", "luxon", "matomo", "Matomo", "MEGAUNIT", "monthlyanalysis", + "multifluid", "MULTIFLUID", + "mutlifluid", "Picto", "PROFILETYPE", "Reinit", "splashscreen", - "testid" + "testid", + "UNSTARTED" ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index dc7f494cf4fdbdf0f85b34f53dfbe2866f2a15e8..3ecb4f0f027ab392c33619dc3b4fa2dc5db2258d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.1.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.0.2...v2.1.0) (2023-01-16) + + +### Features + +* renamed EGL into EPGL ([3cd7c32](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3cd7c3292cf94176702bd45ce1a5aa06af364eb3)) +* rework konnector maintenance ([bfdd27b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bfdd27b24fc19dee91473dab034613981e0d9617)) + +### Bug Fixes + +* add unbreakable spaces ([42b7189](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/42b7189ab4c72da2ef943e125c641750b4912fd3)) +* backoffice url rec ([1d94b87](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1d94b870c669e7ca8cf5d0e826b34461ced928bc)) +* border active outline ([9a96aa9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9a96aa9c4f699368cf6cb2e6b3c951161287e845)) +* **conso:** When consulting grdf charts on week or month timestep, last month day or week day was missing data. ([76ca90d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/76ca90d7a661d6d9813b3c410d68f157b315fd9d)) +* **css:** header and sge view for small screens ([133470e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/133470e1767ca440e3b241baf7da35b5f176a0fe)) +* **deps:** update dependency cozy-ui to v79 ([50f2bd0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/50f2bd0f48c6979ff9ffd652f1bd2b68c7cbd850)) +* render "0" on consumption view ([a0ad99e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a0ad99e1d62ca519dc815f5a5ff37e2452d80d82)) +* **sge:** trim city ([5929918](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5929918dd74568381afc30ec35abb5508c86d6eb)) +* simultaneous crons ([0d0f3f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d0f3f757431452fc6d2079748d9d276c42221ee)) +* title alinement analysis ([bcfcb7e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bcfcb7e9f4a0098a0b271e62af4f01b08230a7ea)) + ### [2.0.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.0.1...v2.0.2) (2022-12-12) diff --git a/manifest.webapp b/manifest.webapp index 103480a1aa2258c0d9a8496d7b0a81cb98a33a7c..c67125fc5a690e2f13c37fc6acff315a51dc1b7b 100644 --- a/manifest.webapp +++ b/manifest.webapp @@ -3,7 +3,7 @@ "slug": "ecolyo", "icon": "icon.svg", "categories": ["energy"], - "version": "2.0.2", + "version": "2.1.0", "licence": "AGPL-3.0", "editor": "Métropole de Lyon", "default_locale": "fr", @@ -182,17 +182,17 @@ "consumptionAlert": { "type": "node", "file": "services/consumptionAlert/ecolyo.js", - "trigger": "@cron 0 3 * * *" + "trigger": "@daily after 11am" }, "aggregatorUsageEvents": { "type": "node", "file": "services/aggregatorUsageEvents/ecolyo.js", - "trigger": "@cron 0 1 * * *" + "trigger": "@daily before 7am" }, "fluidsPrices": { "type": "node", "file": "services/fluidsPrices/ecolyo.js", - "trigger": "@cron 0 2 * * *" + "trigger": "@daily before 7am" } }, "permissions": { diff --git a/package.json b/package.json index ef91af9f545863efce386720f1bf35bb7522fc0a..7a1ea5429898661cdf8d213800e4c2e476669274 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ecolyo", - "version": "2.0.2", + "version": "2.1.0", "scripts": { "build": "yarn run build:css && yarn run build:browser", "build:browser": "cs build --browser ", @@ -13,7 +13,7 @@ "cozyPublish": "git fetch origin ${DEPLOY_BRANCH:-build}:${DEPLOY_BRANCH:-build} && cs publish --token $REGISTRY_TOKEN --build-commit $(git rev-parse ${DEPLOY_BRANCH:-build})", "deploy": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build}", "deploy-dev": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-dev}", - "deploy-test": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-test} --repo=${DEPLOY_REPOSITORY:-https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git}", + "deploy-test": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-test}", "lint": "yarn lint:js", "lint:js": "cs lint {src,test}/**/*.{js,jsx,ts,tsx} --fix", "load-data": "cd test && importData.bat", @@ -51,7 +51,7 @@ "@simbathesailor/use-what-changed": "^2.0.0", "axios": "^0.27.0", "cozy-bar": "8.9.2", - "cozy-client": "33.2.0", + "cozy-client": "34.7.1", "cozy-device-helper": ">=2.1.0", "cozy-flags": ">2.8.6", "cozy-harvest-lib": "9.26.14", @@ -60,7 +60,7 @@ "cozy-logger": ">1.7.0", "cozy-realtime": "4.2.8", "cozy-scripts": "6.3.10", - "cozy-ui": "75.4.1", + "cozy-ui": "79.3.0", "d3": "^6.0.0", "detect-browser": "^5.1.1", "eslint-config-cozy-app": "5.1.0", @@ -126,6 +126,7 @@ "npm-run-all": "^4.1.5", "prettier": "^2.7.1", "prettier-eslint": "^15.0.1", + "raw-loader": "^4.0.2", "react-test-renderer": "16.14.0", "redux-mock-store": "1.5.4", "sass": "^1.49.11", diff --git a/src/assets/icons/visu/egl-logo-white.svg b/src/assets/icons/visu/egl-logo-white.svg index 84fe5e22996a7a0b0a0b38b7c118ef16cd5c83d0..5f48da82136bb266dbbfcd95f1df7f699ce7cb1a 100644 --- a/src/assets/icons/visu/egl-logo-white.svg +++ b/src/assets/icons/visu/egl-logo-white.svg @@ -1,3 +1,25 @@ <svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M62.52 29.058c.668.053 1.535-.12 2.121.097.187.162.14.42.14.723v5.556c.024 1.176.024 2.406-.456 3.485v.033h-.012c-.012.043-.023.097-.035.14h-.012v.032h-.012v.043h-.011c0 .022-.012.054-.012.076h-.012v.032h-.011v.043c-.047-.01-.012.076-.047.065v.043c-.047-.01-.012.076-.047.065v.032h-.012v.043h-.012v.033c-.047-.01-.011.075-.047.065v.032h-.011v.032h-.012v.033h-.012v.032h-.011v.032h-.012v.033h-.012v.032h-.011v.033h-.012c-.035.118-.153.215-.188.323h-.011c-.024.087-.117.13-.14.216-.024.01-.071.065-.071.097-.55.745-1.43 1.532-2.226 2.029-.164.053-.304.194-.48.248v.01c-.047-.01-.059.044-.106.033-.011.022-.023.032-.047.032-.011.022-.035.043-.07.033v.01h-.035v.011h-.035v.011h-.035c.011.043-.082.01-.07.043H60.4v.01h-.035v.012h-.035v.01h-.035c.012.044-.082.011-.07.044h-.035v.01h-.047v.011h-.035c.011.043-.082.011-.07.043h-.048v.011h-.035v.011h-.047c.012.043-.082.01-.07.043-.035 0-.07.01-.105.01v.012h-.035v.01c-.036 0-.07.011-.106.011v.011h-.035v.01c-.035 0-.07.012-.105.012v.01h-.047v.011h-.047v.011h-.047v.01h-.047v.012h-.047v.01h-.07v.011H59.1v.011c-.035 0-.082.01-.117.01v.012h-.07v.01c-.047 0-.094.011-.14.011v.01h-.071v.012h-.07v.01h-.082v.011h-.082v.011h-.083v.01h-.081v.012c-.07 0-.153.01-.223.01v.011h-.117v.011h-.14v.01h-.153v.012h-.2v.01h-.327v.011h-.527v-.01c-.445.01-.855-.065-1.242-.108v-.011h-.082v-.011h-.082v-.01h-.07v-.012h-.082v-.01h-.07v-.011h-.07v-.011h-.071v-.01h-.07v-.012h-.047v-.01a3.431 3.431 0 0 1-.762-.238h-.035v-.01h-.047v-.011h-.035v-.011h-.047c.012-.043-.082-.01-.07-.043h-.047c.012-.043-.082-.011-.07-.043h-.035v-.011h-.047v-.011H53.5c.011-.043-.082-.01-.07-.043h-.036v-.011h-.035v-.01h-.035V42.9h-.035v-.011h-.035v-.011h-.036v-.01h-.035v-.012c-.023.011-.046-.01-.07-.032-.047.01-.035-.043-.082-.032v-.011c-.234-.086-.433-.248-.644-.345-.305-.227-.68-.443-.984-.756-.715-.582-1.183-1.208-1.593-1.91h-.012v-.032h-.012v-.032h-.011v-.033h-.012v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.047 0-.024-.097-.07-.097 0-.022-.012-.054-.012-.076-.047.011-.012-.075-.047-.064v-.044c-.094-.064-.082-.27-.164-.345v-.032h-.012v-.043h-.012V38.8H49.4v-.043h-.012v-.043h-.012v-.043h-.012v-.043h-.011v-.043h-.012v-.044h-.012v-.043h-.011v-.043h-.012c0-.032-.012-.075-.012-.108h-.012c0-.043-.011-.086-.011-.13h-.012v-.064h-.012v-.065h-.011v-.064h-.012v-.065h-.012c-.023-.248-.117-.497-.117-.755h-.012v-.151h-.011v-.206h-.012v-7.315c-.023-.215.023-.442.258-.496v-.01h.046v-.012h.082v-.01h1.476c.328-.011.586-.011.727.205.093 2.416 0 4.866.035 7.283h.012v.302h.011v.15h.012v.108h.012c.011.12.035.238.047.357h.011v.064h.012v.065h.012v.065h.011v.064h.012v.065h.012v.043h.012v.044h.011v.043h.012v.043h.012v.043h.011v.043h.012c0 .033.012.065.012.097h.012v.033h.011v.043h.012v.032h.012v.043c.047-.01.011.076.047.065v.043h.011v.033c.047-.011.012.075.047.064v.033h.012v.032h.012v.032h.011v.033h.012v.032h.012v.033h.011v.032h.012c.047.151.2.28.258.42.328.4.796.929 1.288 1.22.106.086.235.162.352.216v.01c.058 0 .105.076.164.076v.01h.035v.012c.023-.011.047.01.07.032.07.032.164.065.223.108h.047v.01h.035c0 .044.105.022.105.065h.047v.011h.035v.011h.047v.01h.035c.223.098.528.184.785.217v.01h.07v.011h.082v.011h.106v.01h.105v.012h.117v.01h.153v.011a8.19 8.19 0 0 0 1.253-.01v-.011h.117v-.011h.106v-.011h.105v-.01h.082v-.012h.07v-.01h.082v-.011c.047 0 .094-.011.141-.011v-.01c.035 0 .082-.011.117-.011v-.011h.047v-.011h.047v-.01h.047v-.012h.047v-.01h.047v-.011h.046v-.011h.047v-.01h.035v-.012c.035 0 .07-.01.106-.01-.012-.044.082-.011.07-.044h.047v-.01h.035v-.011h.035v-.011h.035v-.01h.047c0-.044.106-.022.106-.066h.035v-.01h.035v-.011c.21-.065.386-.216.574-.302a6.294 6.294 0 0 0 1.44-1.349c0-.054.083-.097.083-.15h.011c.024-.087.118-.163.141-.25h.012v-.031h.011v-.033h.012v-.032h.012v-.033h.012v-.032h.011v-.032h.012v-.033h.012v-.032c.047.01.011-.076.047-.065v-.032h.011v-.043c.047.01.012-.076.047-.065v-.043h.012v-.033h.012c0-.032.011-.064.011-.097h.012v-.032a2.02 2.02 0 0 0 .188-.615h.011v-.065h.012v-.075h.012v-.097h.011v-.098h.012v-.129h.012v-.14h.011c.047-2.363 0-4.748.012-7.121-.023-.26-.035-.615.258-.67v-.01c.035 0 .082-.01.117-.01.059.042.059.032.059.032ZM47.129 42.242c-.023-2.158.047-4.337-.035-6.495h-.012c-.012-.442-.152-.874-.234-1.295h-.012c0-.032-.011-.075-.011-.108h-.012a3.266 3.266 0 0 0-.035-.15h-.012v-.044h-.012v-.043h-.011c0-.032-.012-.065-.012-.097h-.012v-.032h-.012c-.011-.044-.023-.098-.035-.14h-.011v-.033h-.012v-.043h-.012c0-.022-.012-.054-.012-.076h-.011v-.032H46.6v-.043c-.047.01-.012-.076-.047-.065v-.043c-.047.01-.012-.076-.047-.065v-.043h-.011v-.033c-.047.011-.012-.075-.047-.064v-.033h-.012v-.032h-.012v-.032h-.011v-.033h-.012v-.032h-.012v-.032h-.012v-.033h-.011v-.032h-.012c.012-.022-.012-.043-.035-.065 0-.032-.012-.043-.035-.043.011-.043-.047-.054-.035-.097h-.012c-.094-.205-.27-.389-.375-.583-.539-.723-1.453-1.51-2.202-1.985-.035 0-.082-.043-.106-.065-.175-.064-.34-.205-.527-.27v-.01h-.035v-.011h-.035v-.01h-.035v-.012h-.035v-.01h-.036v-.011h-.035v-.011h-.035c-.012-.043-.117-.032-.14-.076h-.036v-.01h-.047c.012-.043-.081-.011-.07-.043h-.035v-.011h-.047c.012-.044-.082-.011-.07-.044h-.047v-.01h-.035v-.011h-.047v-.01h-.035v-.012c-.035 0-.07-.01-.105-.01v-.011h-.036v-.011c-.035 0-.07-.01-.105-.01v-.012h-.035v-.01c-.035 0-.07-.011-.106-.011v-.01h-.047v-.012h-.046v-.01h-.047v-.011h-.07V29.5h-.047v-.01h-.047v-.012c-.059-.01-.13-.021-.188-.032v-.01c-.07-.012-.14-.022-.199-.033v-.011c-.199 0-.422-.108-.632-.097v-.01h-.117v-.012h-.118v-.01h-.164v-.011c-.34-.011-.644-.043-1.007-.033-.059.065-.305-.032-.352.033h-.199v.01h-.164v.011h-.117v.011h-.117v.01c-.281 0-.55.098-.832.141v.01c-.058.012-.129.023-.187.033v.011c-.059.01-.117.022-.164.032v.011h-.047v.011h-.047v.01h-.047v.012c-.035 0-.07.01-.105.01v.011h-.035v.011l-.152.032v.011h-.036v.011h-.047v.01c-.023 0-.058.011-.081.011v.011h-.036v.011h-.047v.01h-.035v.012h-.047c.012.043-.081.01-.07.043h-.047c0 .043-.105.021-.105.065h-.035v.01h-.035v.011h-.047c0 .043-.106.022-.106.065h-.035v.01h-.035v.011h-.035v.011h-.035v.011c-.024-.01-.047.01-.07.032-.036 0-.047.011-.047.033-.094.01-.141.086-.223.097-.152.13-.363.194-.504.324-.714.41-1.51 1.197-1.991 1.812-.059.13-.188.238-.234.356h-.012c-.035.108-.152.216-.188.324h-.011v.032c-.047.022-.059.119-.106.14v.033c-.047 0-.023.097-.07.097v.043c-.047 0-.023.097-.07.097v.033h-.012v.032h-.012v.043h-.011v.033h-.012v.032h-.012v.032h-.011v.043h-.012v.033h-.012v.043h-.012c0 .022-.011.054-.011.075h-.012v.033h-.012v.043h-.01v.032h-.011c0 .033-.012.065-.012.097h-.012v.033a5.956 5.956 0 0 0-.41 1.64h-.011a8.64 8.64 0 0 0-.012 1.456h.012v.151h.011v.13h.012v.13h.012v.097h.011c0 .248.13.507.153.755h.012c.011.075.035.15.046.216h.012v.043h.012v.043h.011v.043h.012v.043h.012v.065h.012v.032h.011v.044h.012c.012.043.023.097.035.14h.012c0 .021.012.054.012.075h.011v.033h.012c0 .032.012.065.012.097.047-.011.011.075.047.065v.043h.011v.032h.012v.043c.047-.01.012.076.047.065v.032h.012v.043c.046 0 .023.098.07.098v.032h.012v.032h.011v.033h.012v.032h.012c-.012.022.011.043.035.065 0 .032.012.043.035.043-.012.043.047.054.035.097h.012c.515.939 1.511 1.899 2.483 2.536.188.086.34.226.54.302v.01c.046-.01.034.044.081.033.012.022.035.043.07.032v.011h.036v.01c.047-.01.035.044.082.033.011.022.035.043.07.033v.01h.035v.011h.035v.01h.035c0 .044.106.022.106.066h.047c0 .043.105.021.105.064h.035v.011h.047c-.012.043.082.011.07.043h.047c-.011.044.082.011.07.044h.047v.01h.035v.011c.024 0 .059.01.083.01v.012c.035 0 .07.01.105.01v.011h.035v.011l.152.032v.011h.047v.011h.047v.01h.047v.012h.047v.01h.047v.011c.035 0 .082.01.117.01v.012c.035 0 .082.01.117.01v.011c.445.076.89.194 1.347.205v.011c2.66.043 5.365 0 8.036.01.281.012.48.012.633-.15.023-.313-.094-.874-.059-1.306Zm-2.647-.895h-5.787c-.469-.054-.984-.13-1.394-.302h-.035v-.011h-.047v-.01c-.024 0-.059-.012-.082-.012v-.01H37.1v-.011h-.047c.011-.043-.082-.011-.07-.043h-.047c0-.044-.106-.022-.106-.065h-.035v-.011h-.035v-.01h-.035v-.012c-.024.011-.047-.01-.07-.032-.036 0-.047-.01-.047-.032-.047.01-.059-.043-.106-.033v-.01c-.152-.044-.27-.173-.41-.216-.351-.216-.714-.561-1.054-.874-.105-.151-.234-.291-.34-.421-.023-.086-.117-.13-.14-.216h-.012c-.176-.345-.469-.733-.539-1.154h-.012v-.043h-.011v-.044h-.012v-.064h-.012v-.065h-.011v-.065h-.012c0-.043-.012-.097-.012-.14h-.012v-.097h-.011v-.097h-.012v-.097h-.012a6.26 6.26 0 0 1-.011-1.241h.011c.012-.291.106-.561.164-.842h.012v-.043h.012v-.043h.011v-.043h.012v-.043h.012v-.044h.012v-.043h.011c0-.032.012-.064.012-.097h.012v-.032h.011v-.043h.012v-.033h.012v-.043c.047.011.012-.075.047-.065v-.032h.011v-.043c.047 0 .024-.097.07-.097v-.033c.036-.021.07-.108.083-.14.023-.01.046-.032.035-.065h.011c-.011-.043.047-.032.036-.075h.011c.024-.097.13-.162.153-.248.351-.453.925-1.014 1.44-1.349.164-.065.317-.205.504-.27v-.01h.035v-.011h.036v-.011h.035v-.01h.035v-.012h.035v-.01h.035v-.011h.035v-.011h.035c-.011-.043.082-.01.07-.043h.036v-.01h.047c-.012-.044.082-.012.07-.044h.047v-.01h.035v-.012h.047v-.01h.035v-.011c.035 0 .07-.011.105-.011v-.01h.047v-.012h.047v-.01h.047v-.011h.047v-.011h.047v-.01c.046 0 .093-.012.14-.012v-.01h.047v-.011c.047 0 .105-.01.152-.01v-.012h.07v-.01h.106v-.011h.082v-.011h.105v-.01h.141v-.012h.152v-.01c.2.032.598-.076.785 0h.235v.01h.152v.011c.398.032.843.13 1.183.27h.035v.01h.047v.011h.035v.011h.047c-.012.043.082.011.07.043h.047c0 .044.106.022.106.065h.035v.01h.035v.012h.035c.187.097.41.205.574.302.586.388 1.288.982 1.617 1.553h.011c0 .054.082.098.082.151.024.011.047.033.035.065h.012c.023.054.059.13.105.173v.043c.047-.01.012.076.047.065v.032h.012v.032c.047 0 .023.098.07.098v.043h.012v.032c.094.162.188.41.223.615h.011v.065h.012v.065h.012v.075h.011c0 .151.083.313.07.464h.013v.151h.011c.13 1.586.094 3.377.106 5.147Zm-14.924-3.755c.164-.173.175-.291.164-.593v-1.425h-.012c0-.032-.012-.075-.012-.107h-.011v-.033h-.012c0-.226-.106-.442-.117-.658h-.012a5.447 5.447 0 0 0-.035-.184h-.012c-.012-.053-.023-.118-.035-.172h-.012v-.043h-.012v-.043h-.011v-.044h-.012v-.064h-.012v-.044h-.011v-.043h-.012v-.043h-.012v-.043h-.011v-.032h-.012l-.035-.14H29.3v-.033h-.012v-.043h-.011v-.032h-.012v-.044h-.012v-.032h-.012v-.043h-.011v-.033h-.012v-.043h-.012v-.032h-.011v-.032h-.012v-.033h-.012v-.043c-.047 0-.023-.097-.07-.097v-.032h-.012v-.033h-.012v-.043c-.047 0-.023-.097-.07-.097v-.032c-.047-.033-.07-.151-.117-.173v-.032h-.012c-.047-.14-.175-.249-.222-.378h-.012c-.035-.097-.14-.162-.164-.27-.2-.237-.41-.528-.68-.755-.421-.496-1.019-.863-1.499-1.208h-.035a.988.988 0 0 0-.305-.184v-.01a.828.828 0 0 1-.199-.109h-.035v-.01h-.035v-.011h-.035v-.01h-.035v-.012h-.036c.012-.043-.082-.01-.07-.043h-.035v-.01h-.035v-.011h-.035c0-.044-.106-.022-.106-.065-.023 0-.058-.011-.082-.011.012-.043-.082-.01-.07-.043h-.047v-.01h-.035v-.012c-.023 0-.059-.01-.082-.01v-.011h-.047c.012-.044-.082-.011-.07-.044h-.047v-.01h-.047v-.011h-.035v-.01c-.035 0-.07-.012-.105-.012v-.01h-.035c-.07-.076-.293-.054-.352-.13h-.07v-.01h-.047v-.011h-.047v-.011c-.164 0-.328-.097-.492-.097v-.011h-.07v-.01h-.082v-.012h-.106v-.01h-.082v-.011h-.105v-.011c-.27 0-.55-.076-.82-.065v-.01c-.434-.011-.867 0-1.289.032v.01c-.199-.01-.398.065-.597.065v.011c-.059 0-.117.01-.164.01v.012h-.082v.01l-.223.033v.01h-.07v.011h-.07v.011h-.047v.01c-.047 0-.094.012-.14.012v.01H19.6v.011h-.046v.011h-.07v.01h-.048v.012h-.046v.01h-.047v.011c-.035 0-.07.011-.106.011v.01h-.035v.012c-.035 0-.07.01-.105.01v.011h-.035v.011c-.036 0-.07.01-.106.01v.012h-.035v.01h-.047v.011h-.035v.011h-.047v.01h-.035v.011h-.047c.012.044-.082.011-.07.044h-.047c.012.043-.082.01-.07.043h-.035v.01h-.047v.011h-.035c.011.044-.082.011-.07.044H18.3v.01h-.035v.011h-.035v.011h-.035v.01h-.035v.012h-.036v.01h-.035v.011c-.28.119-.527.28-.75.442-.726.421-1.475 1.155-1.99 1.78 0 .033-.048.076-.071.098-.094.183-.27.356-.352.56h-.011c-.246.476-.563 1.015-.691 1.576h-.012c0 .033-.012.076-.012.108h-.012v.043h-.011v.065h-.012c0 .043-.012.086-.012.13h-.011v.075h-.012v.065h-.012v.075h-.012v.076h-.011v.075h-.012c0 .065-.012.13-.012.184h-.011c0 .075-.012.15-.012.237h-.012v.13h-.012v.183h-.011v.313H14v.529c.07.118.012.345.035.485h.012v.14h.012v.13h.011c-.011.205.106.41.106.615h.011c.012.065.024.13.036.183h.011c0 .043.012.087.012.13h.012c0 .032.011.075.011.108h.012v.043h.012v.043h.012v.065h.011v.043h.012v.043h.012v.043h.011v.043h.012c0 .033.012.065.012.097h.012v.033h.011c0 .032.012.065.012.097h.012v.032h.011v.043h.012c0 .022.012.054.012.076h.012v.032h.011v.043h.012v.033h.012v.043c.047-.01.011.075.047.065v.043c.046 0 .023.097.07.097v.032h.012v.033h.011v.043c.047 0 .024.097.07.097v.032h.012v.033c.035.021.07.108.082.14.024.01.047.032.035.065h.012c.527.928 1.535 1.888 2.519 2.514.187.075.351.226.562.302v.01c.082.054.246.087.328.152h.035v.01h.035v.011h.035v.011h.036c.011.043.117.032.14.075h.035v.011h.047c-.012.044.082.011.07.044h.047c-.011.043.082.01.07.043h.047v.01h.036v.011h.046v.011h.036a6.622 6.622 0 0 0 1.804.42v.012h.14v.01h.152v.011h.188v.01h.328v.012h.562v-.011c.176 0 .34-.01.504-.01v-.012c.422-.01.832-.118 1.242-.183v-.01c.058-.012.128-.022.187-.033v-.011c.059-.01.117-.022.164-.032v-.011h.047v-.011h.047v-.01h.047v-.012h.046v-.01l.153-.033v-.01h.035v-.011c.035 0 .07-.011.105-.011v-.01h.035v-.012c.036 0 .07-.01.106-.01v-.011h.035v-.011h.047c-.012-.043.082-.01.07-.043h.047v-.011h.035v-.01h.047c-.012-.044.082-.011.07-.044h.035v-.01a.24.24 0 0 0 .141-.065h.035v-.011h.035v-.011c.352-.13.656-.367.95-.518.058-.065.175-.108.233-.172a3.65 3.65 0 0 0 .727-.583c.129-.043.199-.205.27-.28v-.033h.01c.13-.529-.48-.755-.784-1.09-.21-.172-.375-.42-.597-.528.011-.044-.082-.011-.07-.044h-.048v-.01h-.081v-.011h-.083v.01h-.082c-.421.216-.784.626-1.171.842-.105.022-.176.119-.293.14v.011h-.035v.011c-.07.032-.164.065-.223.108h-.046v.01h-.036c0 .044-.105.022-.105.065h-.047c.012.044-.082.011-.07.044h-.047v.01h-.035v.011c-.035 0-.07.01-.106.01v.012h-.035a4.24 4.24 0 0 1-1.124.248v.01h-.14v.011a9.167 9.167 0 0 1-1.09 0v-.01h-.153v-.011h-.14v-.01h-.106v-.012a3.532 3.532 0 0 1-.972-.237h-.035v-.01h-.047v-.012c-.023 0-.058-.01-.082-.01v-.011h-.035v-.011h-.047c.012-.043-.082-.01-.07-.043h-.047c0-.043-.105-.022-.105-.065h-.036v-.01H19.4v-.011h-.035v-.011h-.035v-.011c-.223-.076-.41-.227-.597-.313-.668-.453-1.324-1.1-1.664-1.77h-.012v-.032h-.011v-.032h-.012v-.033h-.012v-.032h-.011v-.032h-.012v-.033h-.012v-.032h-.012c0-.022-.011-.054-.011-.076-.047.011-.012-.075-.047-.064v-.043h-.012v-.033h-.012c0-.021-.011-.054-.011-.075h-.012v-.043h-.012v-.033h-.011c-.024-.15-.118-.27-.141-.442 4.159-.065 8.575.162 12.85-.065Zm-12.921-2.643v-.044h.011c0-.032.012-.064.012-.097h.012c.012-.043.023-.097.035-.14h.012v-.032h.011c0-.033.012-.065.012-.097.047.01.012-.076.047-.065v-.043c.047 0 .023-.097.07-.097V34.3h.012v-.032h.012v-.032h.011v-.033h.012v-.032h.012v-.033h.012c.023-.086.117-.162.14-.248h.012c.316-.55.96-1.133 1.523-1.521.199-.086.375-.237.597-.313v-.01h.035v-.012h.035v-.01h.036v-.011h.035v-.01h.035v-.012h.035c0-.043.105-.021.105-.065h.047c.797-.355 1.84-.474 2.765-.377v.01h.117v.012h.105v.01h.106v.011h.082v.01h.07v.012h.082v.01h.07v.011h.07v.011l.188.032v.011h.047v.011h.047v.01h.047v.012h.047v.01h.046v.011l.153.032v.011h.035v.011h.047c-.012.043.082.01.07.043h.047v.011h.035c-.012.043.082.01.07.043h.035v.011h.036v.01h.035v.011h.035v.011h.035v.011h.035v.01h.035v.012h.036v.01c.901.41 1.745 1.187 2.19 2.018h.012c.035.065.07.151.117.205v.043h.012v.033c.046 0 .023.097.07.097v.043h.012v.032h.011c0 .033.012.065.012.097h.012v.033h.011c0 .032.012.065.012.097h.012c0 .032.012.065.012.097h.011v.043h.012v.043h.012v.043h.011v.065h.012c0 .032.012.076.012.108h.012v.01H16.39c.2.055.188-.086.247-.14Zm10.25 14.047c-1.066-.032-.996.26-.973-.809h2.015c0 .507.024 1.025-.07 1.522h-.012c0 .032-.011.075-.011.107h-.012v.044h-.012v.043H27.8v.043c-.046 0-.023.097-.07.097v.032h-.011v.033c-.176.302-.563.583-.88.734-.023 0-.058.01-.081.01v.011h-.047v.01h-.047v.012h-.047v.01h-.047v.011h-.07v.011c-.281.043-.68.065-.984.01v-.01h-.07v-.01h-.07v-.011h-.047v-.011h-.07v-.011h-.036v-.01h-.047v-.012h-.035v-.01h-.047c-.808-.356-1.171-1.047-1.124-2.061-.035-1.1-.047-2.04.867-2.568.082-.043.21-.097.293-.14h.035v-.011h.047v-.011h.035v-.01c.773-.227 1.827-.066 2.378.528-.246.216-.469.464-.726.658-.282-.334-.785-.496-1.254-.378v.011h-.035v.011h-.047v.01h-.035v.012c-.188.053-.293.248-.387.388v.043h-.011v.065h-.012v.075h-.012v.108h-.012c-.011.238-.023.497-.011.756h-.012c.023.42 0 .873.082 1.251h.012v.043c.093.151.222.346.421.41v.011h.047v.01h.047v.012h.047v.01h.082c.644.162 1.148-.323 1.078-1.079Zm-7.158-3.031c.059 1.251-.14 2.643.106 3.851.047-.01.011.076.047.065v.033h.011c.106.259.445.54.82.582v.011h.082v.01h.223v.012c.035 0 .035-.011.035-.011h.223v-.011h.105v-.01h.07v-.011h.047v-.011h.047v-.011h.047c.27-.119.515-.335.644-.583v-.043h.012v-.032h.012v-.043c.222-1.144.011-2.557.082-3.766h.574v3.517h-.012v.13h-.012v.097h-.012v.065h-.011v.065h-.012v.043h-.012v.043h-.011V50c-.047-.01-.012.075-.047.065v.043h-.012v.032h-.012c0 .054-.082.097-.082.151h-.011c-.094.184-.317.335-.48.453-.071.011-.141.087-.2.098v.01h-.047c.012.044-.082.011-.07.044h-.047v.01h-.047v.011h-.047v.01h-.046v.012h-.07v.01h-.083v.011h-.082v.011h-.14c-.164.076-.48-.022-.668-.01v-.012c-.047 0-.094-.01-.14-.01v-.011h-.047v-.011h-.047v-.01h-.047v-.011h-.047c.012-.044-.082-.011-.07-.044-.352-.108-.633-.399-.82-.669v-.032c-.047 0-.024-.097-.07-.097v-.043h-.012v-.033h-.012c-.012-.043-.023-.097-.035-.14h-.012c-.164-1.22-.023-2.579-.07-3.83.058-.076.351-.043.515-.043Zm18.603 0c.316.032.738-.076.984.043.023.086.129.15.152.248.07.075.14.173.187.27.07.075.14.172.188.27.07.075.14.172.187.27.13.15.246.312.34.485.07.075.14.172.187.27.07.075.14.172.188.27.258.29.41.614.68.938v-3.054h1.053v4.985c-.632-.043-.948.194-1.206-.388a2.856 2.856 0 0 1-.34-.486 2.847 2.847 0 0 1-.34-.485 2.847 2.847 0 0 1-.34-.486c-.316-.377-.538-.82-.866-1.187v3.032H38.33v-4.995Zm10.12 0h1.055v4.132h2.46v.863h-3.514v-4.995Zm3.011 0c.27.054 1.172-.151 1.207.14h.012v.032h.011v.033c.059.032.059.172.117.205v.043c.047 0 .024.097.07.097v.032h.013v.033h.011v.043c.047 0 .024.097.07.097v.032c.047-.01.012.076.047.065v.043c.047 0 .024.097.07.097v.033h.012v.032h.012v.043c.059.022.047.13.105.151v.033h.012v.043c.047 0 .024.097.07.097v.032h.012v.033h.012v.043c.047 0 .023.097.07.097v.032h.012v.033h.012v.043h.011c.012.097.106.15.117.27h.036c.011-.098.082-.13.082-.216h.011v-.033h.012v-.032h.012v-.032h.011v-.033h.012v-.032h.012v-.043c.047 0 .023-.097.07-.097v-.033c.059-.01.035-.13.082-.14v-.032h.012c0-.022.012-.054.012-.076.047 0 .023-.097.07-.097v-.043c.047 0 .023-.097.07-.097v-.033h.012v-.032h.012v-.043c.046 0 .023-.097.07-.097v-.033h.012c0-.021.011-.054.011-.075.047 0 .024-.097.07-.097v-.043c.047 0 .024-.097.07-.097v-.033h.013v-.043c.047 0 .023-.097.07-.097v-.032h.012v-.033h.011v-.043c.035 0 .059-.13.082-.14h1.137c-.094.226-.246.431-.34.636h-.012v.033h-.011v.032c-.047-.01-.012.076-.047.065v.032c-.047-.01-.012.076-.047.065v.032h-.012v.033h-.012v.032h-.011v.032h-.012v.033a2.496 2.496 0 0 0-.234.42h-.012v.033c-.047.01-.035.108-.082.13v.032h-.012v.032h-.011v.032h-.012v.033h-.012v.032c-.058.032-.058.151-.117.184v.032h-.012v.032h-.011v.033h-.012v.032a.356.356 0 0 0-.07.108c-.024.01-.047.032-.036.065h-.011v.032c-.07.043-.07.173-.14.216v.032h-.013v.033h-.011v.032h-.012v.032c-.047 0-.023.097-.07.097v.033h-.012v.032h-.012v.032h-.012v.033c-.046-.01-.011.075-.046.065v.032h-.012v.032h-.012v2.029h-1.03v-2.029h-.012a.184.184 0 0 0-.07-.13v-.032h-.012v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.082-.075-.106-.237-.188-.313v-.032h-.012v-.033h-.011v-.032h-.012v-.032h-.012v-.033h-.011c.011-.021-.012-.043-.036-.064-.011-.033-.035-.097-.07-.108v-.033h-.012v-.032H52.6v-.032h-.012v-.033c-.094-.108-.14-.302-.234-.41v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.047-.033-.07-.151-.118-.173v-.032h-.011v-.033h-.012v-.032h-.012v-.032h-.011v-.033h-.012v-.032c-.047-.01-.035-.108-.082-.13v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.047.01-.012-.076-.047-.065v-.032h-.012v-.032h-.012v-.033h-.011v-.032h-.012v-.033c-.281-.13-.375-.345-.469-.528Zm9.477 0c.305.054.937-.151 1.031.15.07.076.14.173.188.27.07.076.14.173.187.27.07.076.14.173.187.27.07.076.141.173.188.27.07.075.14.172.187.27.07.075.14.172.188.27.07.075.14.172.187.269.27.324.457.68.75 1.036v-3.054h1.054v4.985c-.832-.022-.937.183-1.312-.529a2.847 2.847 0 0 1-.34-.485 1.141 1.141 0 0 1-.187-.27 2.849 2.849 0 0 1-.34-.485c-.34-.4-.55-.82-.913-1.263v3.032H60.94v-5.006Zm-42.944 1.5h-.012v-.109h-.012v-.075h-.012v-.075h-.011v-.065h-.012v-.043h-.012v-.044h-.011v-.043H17.9c0-.032-.012-.065-.012-.097-.058-.054-.094-.162-.14-.237-.574-.842-1.84-.702-2.824-.702-.175 0-.492-.032-.632.011v4.974c.785-.021 1.663.043 2.425-.043v-.01h.07v-.011l.152-.033v-.01h.035v-.011h.047c0-.044.106-.022.106-.065h.035c.129-.076.258-.173.386-.27.106-.14.211-.259.293-.41v-.043h.012v-.032h.012v-.044h.011v-.043h.012v-.043h.012v-.043h.012c0-.043.011-.086.011-.13h.012v-.075h.012v-.097h.011v-.13h.012c.059-.658.07-1.327.024-1.953Zm-.551 1.219h-.012c.012.28-.023.582-.047.841h-.011v.065h-.012v.065h-.012v.064h-.011v.044h-.012v.043c-.047-.011-.012.075-.047.065-.082.226-.316.41-.562.485v.01h-.035v.012h-.047v.01h-.047v.011h-.047v.01h-.082v.012h-.082v.01c-.48.033-1.007.011-1.5.011v-4.035c.832.022 1.992-.183 2.414.561V47c.047 0 .023.098.07.098v.043h.012v.043h.011v.065h.012v.064h.012v.097h.012v.098h.011v.15h.012c-.023.367.012.691 0 1.026Zm41.691-2.471c-.058 0-.105-.076-.164-.076-.328-.194-.785-.215-1.218-.205-.223.043-.527.087-.691.205h-.035c-.328.173-.668.464-.832.81v.032h-.012v.043h-.011v.032h-.012c-.176.68-.117 1.608-.106 2.342h.012l.035.302h.012v.065h.012v.043h.011v.043h.012v.043h.012v.043c.047 0 .023.097.07.097v.033h.012v.032a.356.356 0 0 1 .07.108c.21.248.48.507.82.615.258.14.773.216 1.09.151h.14v-.01h.105v-.012h.083v-.01c.035 0 .082-.011.117-.011v-.011h.047v-.01c1.1-.314 1.358-1.317 1.288-2.32.059-.928-.023-1.889-.867-2.374Zm-.656 3.798c0 .043-.105.021-.105.064h-.047v.011c-.047 0-.094.011-.14.011-.024.043-.446.022-.446-.01h-.047v-.012h-.047a1.034 1.034 0 0 1-.48-.42v-.044h-.011v-.064h-.012v-.065h-.012v-.097h-.012v-.13h-.011c-.024-.582-.059-1.337.047-1.888h.011v-.043h.012v-.043h.012v-.032c.082-.151.246-.292.41-.378h.035v-.01h.047v-.012h.047v-.01h.07v-.011h.14v-.011c.364 0 .551.108.762.27.129.172.246.399.222.658h.012c-.047.701.258 1.867-.457 2.266Zm-25.76.582h-.011v-.032h-.012v-.032h-.012v-.033h-.011v-.032h-.012v-.032h-.012v-.033c-.093-.097-.152-.313-.258-.42v-.033h-.011a2.597 2.597 0 0 0-.223-.388v-.033h-.011v-.032h-.012c.011-.022-.012-.043-.035-.065 0-.032-.012-.043-.035-.043 0-.054-.06-.076-.047-.13h-.012v-.032h-.012v-.032c-.07-.119-.175-.248-.222-.41.363-.097.644-.356.82-.626v-.032c.047 0 .023-.097.07-.097 0-.033.012-.065.012-.098h.011c.082-.323.07-.69-.035-1.014h-.011v-.032h-.012v-.043c-.13-.227-.328-.475-.574-.626-.035-.011-.106-.032-.117-.065H31.9v-.01h-.036c0-.044-.105-.022-.105-.065h-.047v-.011h-.047v-.011h-.047v-.01h-.046v-.012c-.867-.108-1.828-.075-2.683-.043v4.974h1.066v-1.985h.75c.023.01.047.14.082.14v.033h.011v.032h.012v.032h.012v.033c.058.043.07.172.14.216v.032h.012v.032h.012v.033h.011v.032h.012v.032h.012v.044c.047 0 .023.097.07.097v.032h.012v.032h.012v.033h.011v.032h.012v.032c.059.022.047.13.105.151v.033h.012v.032h.012v.033h.012v.032h.011v.032h.012v.033h.012v.032h.012v.032c.058.011.035.13.081.14v.033h.012v.032h.012v.033h.012v.032c.07.097.14.238.199.378h1.218c0-.162-.105-.28-.14-.389Zm-1.124-2.848c-.035.043-.082.13-.117.183-.059.022-.094.108-.164.108 0 .043-.106.022-.106.065h-.046c-.34.119-.88.01-1.277.043v-1.316c.421.01.925-.033 1.323.043v.01h.036a.798.798 0 0 0 .163.098c.024.054.118.086.118.15.047 0 .023.098.07.098v.043h.012v.065c.07.054 0 .378-.012.41Zm14.877-1.63h-.047v-.01h-.035v-.01h-.047v-.012h-.047v-.01c-.035 0-.082-.011-.117-.011v-.011c-.058 0-.117-.01-.164-.01v-.012c-.761-.064-1.616-.021-2.39-.032v4.985c.774-.011 1.594.032 2.355-.011v-.01h.106v-.012h.07v-.01h.07v-.011c.504-.097.937-.432 1.101-.831h.012v-.032c.047.01.012-.076.047-.065v-.043h.011v-.043h.012v-.044h.012c0-.032.012-.075.012-.107h.011v-.076h.012v-.075h.012v-.13h.011c.047-1.273.305-2.848-1.007-3.366Zm-1.816 3.971v-3.258c.809-.022 1.453-.054 1.71.496 0 .032.012.065.012.097h.012v.076h.012v.075h.011v.14h.012c.047 1.49.363 2.59-1.769 2.374Zm-6.934.594h-.012v-.033h-.012c-.012-.043-.023-.097-.035-.14h-.012v-.032h-.012c0-.033-.011-.065-.011-.097h-.012v-.033h-.012c0-.032-.011-.064-.011-.097h-.012v-.043h-.012v-.032h-.012c0-.033-.011-.065-.011-.098h-.012c-.059-.27-.246-.539-.304-.809h-.012v-.043h-.012v-.032h-.012c0-.033-.011-.065-.011-.097h-.012c-.059-.292-.258-.572-.328-.864h-.012v-.032h-.012c-.011-.043-.023-.097-.035-.14h-.011v-.032h-.012l-.035-.14h-.012v-.033h-.012c-.011-.043-.023-.097-.035-.14h-.011v-.033h-.012c0-.032-.012-.065-.012-.097h-.012v-.032h-.011v-.043h-.012c0-.033-.012-.065-.012-.098h-.011v-.032h-.012v-.043h-.012c0-.032-.012-.065-.012-.097h-.011v-.032h-.012c-.012-.044-.023-.098-.035-.14h-.012v-.033h-.012c-.011-.043-.023-.097-.035-.14h-.011v-.033h-.012c-.434-1.003-.047-.938-1.183-.928-.012.087-.082.14-.07.216h-.012v.032h-.012l-.035.14h-.012v.033h-.012c-.07.324-.28.637-.351.95H34.7v.043h-.011v.032h-.012c0 .032-.012.065-.012.097h-.012v.043h-.011v.033h-.012c0 .032-.012.064-.012.097h-.011v.032h-.012c-.012.043-.024.097-.035.14h-.012v.033h-.012c-.14.496-.41.982-.562 1.467h-.012v.043h-.011v.033h-.012v.043h-.012c0 .032-.012.065-.012.097h-.011v.032h-.012c-.082.346-.293.659-.375 1.004h-.012v.032h-.011c0 .119-.094.184-.106.313h1.101c.047-.097.047-.259.117-.324v-.043h.012v-.043h.012v-.043h.012v-.043h.011v-.033h.012c.012-.118.082-.205.105-.323h1.933c.364 1.143.188.841 1.406.874-.316-.097-.375-.151-.386-.26Zm-2.953-1.435c.07-.173.153-.335.188-.518h.012v-.033h.011c0-.032.012-.064.012-.097h.012v-.043h.012v-.043h.011v-.043h.012v-.043h.012v-.043h.011v-.033h.012v-.043c.082-.065.059-.27.14-.324v-.032h.012c0-.032.012-.065.012-.097h.012v-.043h.011v-.044h.012v-.043h.012v-.043h.012v-.043h.011v-.032h.012c0-.033.012-.065.012-.097h.011v-.033h.012c0 .033.012.065.012.097h.012v.043h.011v.044h.012v.043h.012v.043h.011v.043h.012v.043h.012v.043h.012c.047.27.222.53.269.799h.012v.043h.012v.043h.011v.043h.012c.012.044.023.097.035.14h.012v.033h.012v.043h.011c0 .086.047.14.07.216-.257.01-.702.01-1.148.01Z" fill="#A0A0A0"/> +<path d="M9.98869 50.3503C9.68579 50.6552 9.24152 50.8189 8.71967 50.8189H7V45.7662H8.71967C9.24152 45.7662 9.68579 45.9299 9.98869 46.2348C10.5105 46.7601 10.4818 47.5336 10.4818 48.2364C10.4818 48.9393 10.5095 49.8261 9.98869 50.3514M9.61458 46.6189C9.35418 46.3493 9.01514 46.2498 8.6272 46.2498H7.53567V50.3375H8.62826C9.0162 50.3375 9.35418 50.238 9.61564 49.9684C9.96106 49.6068 9.94724 48.8548 9.94724 48.2364C9.94724 47.6181 9.96106 46.9805 9.61564 46.6189" fill="#A0A0A0"/> +<path d="M13.2816 50.8607C12.2666 50.8607 11.5332 50.1579 11.5332 49.1501V45.7653H12.0689V49.1073C12.0689 49.8733 12.5482 50.3772 13.2816 50.3772C14.0149 50.3772 14.5017 49.8733 14.5017 49.1073V45.7653H15.0374V49.1501C15.0374 50.1579 14.2966 50.8607 13.2816 50.8607Z" fill="#A0A0A0"/> +<path d="M19.216 50.2798C18.8568 50.6564 18.3838 50.8618 17.8131 50.8618C17.2423 50.8618 16.8119 50.6628 16.459 50.3087C15.952 49.7973 15.9659 49.1662 15.9659 48.2932C15.9659 47.4202 15.952 46.7891 16.459 46.2777C16.8119 45.9225 17.2487 45.7246 17.8131 45.7246C18.5113 45.7246 18.8993 45.9161 19.3499 46.3708L18.6867 47.0383C18.4051 46.7548 18.1999 46.6051 17.8131 46.6051C17.5452 46.6051 17.3263 46.711 17.186 46.8746C16.9957 47.0875 16.9469 47.3218 16.9469 48.2943C16.9469 49.2667 16.9957 49.5074 17.186 49.7203C17.3273 49.884 17.5452 49.9824 17.8131 49.9824C18.1096 49.9824 18.3211 49.8765 18.4827 49.6989C18.6453 49.5213 18.7016 49.2592 18.7016 49.011V48.8335H17.8131V48.0097H19.6815V48.734C19.6815 49.4646 19.5689 49.9118 19.216 50.2809" fill="#A0A0A0"/> +<path d="M23.1494 50.8189L22.1695 48.8034H21.4648V50.8189H20.4849V45.7662H22.4522C23.4746 45.7662 24.0804 46.4691 24.0804 47.3132C24.0804 48.0225 23.65 48.4632 23.1643 48.6397L24.2856 50.8178H23.1505L23.1494 50.8189ZM22.3884 46.6467H21.4648V47.9807H22.3884C22.8189 47.9807 23.1005 47.7036 23.1005 47.3142C23.1005 46.9248 22.8189 46.6478 22.3884 46.6478" fill="#A0A0A0"/> +<path d="M27.8106 50.8189L27.5141 49.9246H25.7306L25.4277 50.8189H24.4053L26.2312 45.7662H26.9997L28.833 50.8189H27.8106ZM26.6404 47.2565L26.0059 49.0944H27.2537L26.6404 47.2565Z" fill="#A0A0A0"/> +<path d="M32.279 50.8189L30.2905 47.7176V50.8189H29.3105V45.7662H30.1853L32.1728 48.8601V45.7662H33.1527V50.8189H32.279Z" fill="#A0A0A0"/> +<path d="M37.3196 50.3364C36.988 50.6702 36.5161 50.8189 35.9943 50.8189H34.1821V45.7662H35.9943C36.5161 45.7662 36.988 45.916 37.3196 46.2487C37.884 46.8168 37.8277 47.5122 37.8277 48.2706C37.8277 49.0291 37.884 49.7684 37.3196 50.3354M36.6362 46.958C36.4672 46.7526 36.2419 46.6456 35.9029 46.6456H35.1631V49.9385H35.9029C36.2408 49.9385 36.4672 49.8315 36.6362 49.6261C36.819 49.3993 36.8477 49.0377 36.8477 48.2706C36.8477 47.5036 36.819 47.1848 36.6362 46.958Z" fill="#A0A0A0"/> +<path d="M38.6865 50.8189V45.7662H39.6665V49.9385H41.9431V50.8189H38.6865Z" fill="#A0A0A0"/> +<path d="M43.9524 48.7467V50.8189H42.9799V48.7467L41.4707 45.7662H42.5357L43.4731 47.8021L44.3967 45.7662H45.4606L43.9524 48.7467Z" fill="#A0A0A0"/> +<path d="M48.8942 50.3076C48.5413 50.6628 48.112 50.8607 47.5402 50.8607C46.9683 50.8607 46.5315 50.6617 46.1797 50.3076C45.6717 49.7963 45.6866 49.1651 45.6866 48.2921C45.6866 47.4191 45.6728 46.788 46.1797 46.2766C46.5326 45.9214 46.9694 45.7235 47.5402 45.7235C48.1109 45.7235 48.5413 45.9225 48.8942 46.2766C49.4022 46.788 49.3948 47.4191 49.3948 48.2921C49.3948 49.1651 49.4022 49.7963 48.8942 50.3076ZM48.1683 46.8725C48.0269 46.7088 47.8091 46.6029 47.5412 46.6029C47.2734 46.6029 47.0481 46.7088 46.9067 46.8725C46.7165 47.0854 46.6676 47.3197 46.6676 48.2921C46.6676 49.2646 46.7165 49.4988 46.9067 49.7117C47.0481 49.8754 47.2734 49.9813 47.5412 49.9813C47.8091 49.9813 48.028 49.8754 48.1683 49.7117C48.3585 49.4988 48.4149 49.2646 48.4149 48.2921C48.4149 47.3197 48.3585 47.0854 48.1683 46.8725Z" fill="#A0A0A0"/> +<path d="M53.2229 50.8189L51.2343 47.7176V50.8189H50.2544V45.7662H51.1291L53.1166 48.8601V45.7662H54.0965V50.8189H53.2229Z" fill="#A0A0A0"/> +<path d="M20.8979 32.9372C20.7417 32.6334 20.5291 32.2943 20.2634 31.9263C20.105 31.7273 19.8925 31.4834 19.6299 31.1988C19.2611 30.8479 18.9954 30.62 18.8211 30.5034C18.5416 30.2927 18.3099 30.1333 18.1143 30.0145C17.7732 29.8081 17.3172 29.6037 16.7581 29.4058C16.028 29.1608 15.2744 29.0314 14.5177 29.0207H14.3721C13.6015 29.0207 12.8182 29.1501 12.0434 29.4058C11.4844 29.6037 11.0284 29.8081 10.6883 30.0145C10.4917 30.1322 10.2547 30.297 9.9847 30.5013C9.8072 30.619 9.5415 30.8479 9.1695 31.202C8.91017 31.4834 8.6976 31.7273 8.53712 31.9284C8.27141 32.2954 8.05884 32.6345 7.90473 32.9362C7.32548 34.0477 7.0332 35.2106 7.0332 36.3916V36.4804C7.0332 37.6797 7.3308 38.8575 7.91748 39.9808C8.10454 40.3274 8.35218 40.6965 8.65403 41.0774C8.92718 41.4315 9.28323 41.7952 9.7158 42.16C9.96132 42.3579 10.1834 42.5227 10.3779 42.65C11.6087 43.447 12.967 43.8514 14.4146 43.8514C15.4891 43.8514 16.5551 43.6117 17.584 43.1378C17.9847 42.9313 18.3811 42.6885 18.7595 42.4146C18.9657 42.2756 19.2144 42.0648 19.495 41.792C19.6841 41.6337 19.7809 41.4732 19.7809 41.317V41.2742C19.7809 41.1833 19.7522 41.0966 19.6958 41.0153L18.7148 40.0129C18.5767 39.8407 18.4268 39.753 18.2716 39.753C18.1622 39.753 18.0548 39.7925 17.956 39.8696L17.9496 39.8749C17.8348 39.9905 17.7136 40.1028 17.5882 40.2098C17.3278 40.4334 17.0855 40.6088 16.8687 40.7318C16.0939 41.1651 15.2787 41.3855 14.4454 41.3855C13.3539 41.3855 12.3548 41.0635 11.4727 40.4269C11.3196 40.3221 11.1071 40.1317 10.8413 39.8631C10.6288 39.6289 10.463 39.4277 10.3503 39.2673C10.0113 38.7602 9.76682 38.2253 9.62015 37.6754H21.2943C21.6057 37.6861 21.7694 37.5213 21.7694 37.2004V35.7005C21.7694 35.5882 21.7492 35.4919 21.7088 35.4149C21.5898 34.573 21.3188 33.7385 20.9 32.9372M14.3731 31.4716C14.5475 31.4716 14.7069 31.4812 14.8631 31.5005C15.3329 31.5486 15.809 31.6663 16.2767 31.8482C17.5117 32.3799 18.4098 33.2689 18.9455 34.4895C19.0401 34.7238 19.1208 34.9656 19.1857 35.2106H9.61802C9.68179 34.9667 9.76257 34.7249 9.85716 34.4906C10.3928 33.2689 11.292 32.3799 12.5259 31.8482C13.1477 31.5978 13.7695 31.4716 14.3721 31.4716" fill="#A0A0A0"/> +<path d="M37.7937 36.4867C37.7937 34.7354 37.2484 33.1542 36.1728 31.7849C35.8508 31.3923 35.4799 31.0189 35.0685 30.6734C34.6944 30.377 34.3479 30.1363 34.0376 29.9609C32.9025 29.3329 31.7025 29.0141 30.4707 29.0141H30.3836C29.2963 29.0141 28.2207 29.2687 27.1876 29.7694C26.9049 29.8967 26.5627 30.101 26.1694 30.3781C25.9218 30.5471 25.6253 30.7964 25.2841 31.1205C25.0024 31.403 24.7888 31.6373 24.6496 31.8181C24.3945 32.1636 24.1862 32.4771 24.0321 32.752C23.3869 33.9127 23.0596 35.1355 23.0596 36.385V36.4728C23.0596 37.5265 23.2923 38.5739 23.7525 39.588C24.3977 40.9349 25.3691 42.0133 26.6403 42.791C27.8232 43.4896 29.088 43.8437 30.3974 43.8437H37.3037C37.3133 43.8437 37.3239 43.8437 37.3335 43.8437C37.4993 43.8437 37.6236 43.7999 37.7012 43.7132C37.7767 43.6287 37.8075 43.5057 37.7926 43.3527V36.4856L37.7937 36.4867ZM35.3598 36.5305V41.3917H30.4271C29.2974 41.3917 28.2494 41.0152 27.313 40.2748C27.1185 40.109 26.8943 39.8833 26.6488 39.6062C25.8835 38.652 25.4945 37.5832 25.4945 36.4268C25.4945 35.8009 25.6157 35.1751 25.8548 34.5685C26.0759 34.0186 26.3958 33.5169 26.805 33.0761L26.8783 33.0013C27.1005 32.768 27.2854 32.5979 27.4257 32.4931C28.3355 31.8095 29.3441 31.4618 30.4261 31.4618C31.3922 31.4618 32.2999 31.7357 33.1214 32.2738C33.334 32.4193 33.5774 32.6151 33.842 32.8526C34.0982 33.1211 34.2735 33.3211 34.3766 33.4634C34.5786 33.7437 34.738 34.0122 34.8539 34.2626C35.1887 34.9269 35.3587 35.6897 35.3587 36.5273" fill="#A0A0A0"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M53.951 29.1362C54.0286 29.2164 54.0658 29.3341 54.0605 29.4838H54.0616V32.1219H51.6266V29.4368C51.6266 29.241 51.7085 29.0067 52.0985 29.0067H53.5737C53.7417 29.0067 53.8681 29.0506 53.951 29.1362ZM51.4746 37.6603C51.3318 38.2213 51.0887 38.7582 50.7477 39.2651C50.6339 39.4277 50.4724 39.6234 50.2577 39.8599C49.9888 40.1305 49.7752 40.321 49.6232 40.4258C48.7421 41.0613 47.7568 41.3833 46.6951 41.3833C45.6333 41.3833 44.648 41.0613 43.7659 40.4247C43.615 40.321 43.4013 40.1305 43.1346 39.862C42.922 39.6277 42.7562 39.4266 42.6435 39.2661C42.06 38.3996 41.7635 37.4475 41.7635 36.4354V29.4528C41.7635 29.256 41.6817 29.0217 41.2905 29.0217H39.8153C39.6463 29.0217 39.5199 29.0656 39.437 29.1511C39.3594 29.2324 39.3232 29.3491 39.3275 29.4967V36.5103C39.3275 37.7021 39.6251 38.8692 40.2118 39.9808C40.3999 40.3284 40.6475 40.6975 40.9483 41.0773C41.2225 41.4325 41.5796 41.7962 42.0101 42.1599C42.2545 42.3568 42.4777 42.5215 42.6733 42.6499C43.9041 43.4469 45.257 43.8513 46.6951 43.8513C48.1331 43.8513 49.4861 43.4469 50.7168 42.6499C50.9124 42.5215 51.1281 42.3621 51.3811 42.1589C51.8105 41.7951 52.1676 41.4314 52.4418 41.0773C52.7437 40.6954 52.9913 40.3263 53.1784 39.9797C53.5714 39.2286 53.8342 38.452 53.9649 37.6603H51.4746Z" fill="#A0A0A0"/> +<path d="M72.9993 37.7876H46.7632V31.9946H72.9993V37.7887V37.7876ZM47.0161 37.533H72.7463V32.2492H47.0161V37.533Z" fill="#A0A0A0"/> +<path d="M48.5164 36.5522C48.4856 36.5522 48.4644 36.5308 48.4644 36.4997V33.0657C48.4644 33.0346 48.4856 33.0132 48.5164 33.0132H49.8811C50.6453 33.0132 51.1055 33.4765 51.1055 34.1526C51.1055 34.8287 50.64 35.2866 49.8811 35.2866H49.2551C49.2338 35.2866 49.2243 35.2973 49.2243 35.3187V36.4987C49.2243 36.5297 49.203 36.5511 49.1722 36.5511H48.5154L48.5164 36.5522ZM50.3456 34.1547C50.3456 33.868 50.1543 33.6755 49.8344 33.6755H49.2551C49.2338 33.6755 49.2243 33.6862 49.2243 33.7065V34.5966C49.2243 34.6169 49.2349 34.6276 49.2551 34.6276H49.8344C50.1543 34.6276 50.3456 34.4404 50.3456 34.1547Z" fill="#A0A0A0"/> +<path d="M51.5767 35.2523V33.0678C51.5767 33.0368 51.5969 33.0154 51.6277 33.0154H52.2845C52.3153 33.0154 52.3366 33.0368 52.3366 33.0678V35.2737C52.3366 35.6952 52.5693 35.9349 52.9265 35.9349C53.2836 35.9349 53.51 35.6952 53.51 35.2737V33.0678C53.51 33.0368 53.5312 33.0154 53.562 33.0154H54.2178C54.2497 33.0154 54.2699 33.0368 54.2699 33.0678V35.2523C54.2699 36.1317 53.7119 36.6099 52.9265 36.6099C52.141 36.6099 51.5777 36.1317 51.5777 35.2523H51.5767Z" fill="#A0A0A0"/> +<path d="M54.9272 33.0665C54.9272 33.0354 54.9485 33.014 54.9793 33.014H56.3493C57.1135 33.014 57.4706 33.3938 57.4706 33.9555C57.4706 34.3406 57.2952 34.5802 57.0625 34.7107V34.7214C57.2952 34.8102 57.5323 35.1012 57.5323 35.5227C57.5323 36.2202 57.072 36.5529 56.3121 36.5529H54.9793C54.9485 36.5529 54.9272 36.5316 54.9272 36.5005V33.0665ZM56.2558 34.4615C56.5459 34.4615 56.716 34.3053 56.716 34.0453C56.716 33.7854 56.5459 33.6345 56.2558 33.6345H55.7191C55.6978 33.6345 55.6882 33.6452 55.6882 33.6655V34.4305C55.6882 34.4508 55.6989 34.4615 55.7191 34.4615H56.2558ZM55.7191 35.9335H56.2983C56.6087 35.9335 56.7734 35.7666 56.7734 35.4917C56.7734 35.2168 56.6076 35.0499 56.2983 35.0499H55.7191C55.6978 35.0499 55.6882 35.0606 55.6882 35.0809V35.9036C55.6882 35.9239 55.6989 35.9346 55.7191 35.9346V35.9335Z" fill="#A0A0A0"/> +<path d="M58.0815 33.0665C58.0815 33.0354 58.1028 33.014 58.1336 33.014H58.7905C58.8213 33.014 58.8425 33.0354 58.8425 33.0665V35.8394C58.8425 35.8608 58.8532 35.8704 58.8734 35.8704H60.424C60.4549 35.8704 60.4761 35.8918 60.4761 35.9228V36.5005C60.4761 36.5316 60.4549 36.5529 60.424 36.5529H58.1347C58.1039 36.5529 58.0826 36.5316 58.0826 36.5005V33.0665H58.0815Z" fill="#A0A0A0"/> +<path d="M60.9248 33.0665C60.9248 33.0354 60.9461 33.014 60.9769 33.014H61.6337C61.6645 33.014 61.6858 33.0354 61.6858 33.0665V36.5005C61.6858 36.5316 61.6645 36.5529 61.6337 36.5529H60.9769C60.9461 36.5529 60.9248 36.5316 60.9248 36.5005V33.0665Z" fill="#A0A0A0"/> +<path d="M64.7935 36.8066C64.7723 36.828 64.7415 36.8323 64.716 36.8066L64.3588 36.4472C64.1516 36.551 63.9093 36.6087 63.6457 36.6087C63.0314 36.6087 62.5446 36.3231 62.3639 35.7507C62.2874 35.5058 62.2661 35.3089 62.2661 34.7826C62.2661 34.2562 62.2874 34.0594 62.3639 33.8144C62.5446 33.2421 63.0314 32.9564 63.6457 32.9564C64.26 32.9564 64.7415 33.2431 64.9275 33.8144C65.005 34.0594 65.0263 34.2562 65.0263 34.7826C65.0263 35.3089 65.005 35.5058 64.9275 35.7507C64.9019 35.8288 64.8711 35.8962 64.8392 35.9647L65.2059 36.3284C65.2272 36.3498 65.2272 36.3809 65.2059 36.4012L64.7935 36.8066ZM63.8317 35.9176L63.6095 35.694C63.5883 35.6727 63.584 35.647 63.6095 35.6213L64.023 35.2265C64.0538 35.2009 64.0793 35.2051 64.0995 35.2265L64.2387 35.3667C64.2547 35.2469 64.26 35.0704 64.26 34.7836C64.26 34.3215 64.2451 34.1439 64.2037 34.0198C64.1261 33.7748 63.9348 33.6293 63.6457 33.6293C63.3566 33.6293 63.1642 33.7748 63.0877 34.0198C63.0462 34.1439 63.0314 34.3215 63.0314 34.7836C63.0314 35.2458 63.0462 35.4234 63.0877 35.5486C63.1642 35.7935 63.3555 35.939 63.6457 35.939C63.7126 35.939 63.7753 35.9337 63.8317 35.9176Z" fill="#A0A0A0"/> +<path d="M65.5908 35.2523V33.0678C65.5908 33.0368 65.611 33.0154 65.6429 33.0154H66.2987C66.3295 33.0154 66.3507 33.0368 66.3507 33.0678V35.2737C66.3507 35.6952 66.5835 35.9349 66.9406 35.9349C67.2977 35.9349 67.5241 35.6952 67.5241 35.2737V33.0678C67.5241 33.0368 67.5443 33.0154 67.5762 33.0154H68.232C68.2638 33.0154 68.284 33.0368 68.284 33.0678V35.2523C68.284 36.1317 67.7261 36.6099 66.9406 36.6099C66.1552 36.6099 65.5919 36.1317 65.5919 35.2523H65.5908Z" fill="#A0A0A0"/> +<path d="M68.9424 33.0665C68.9424 33.0354 68.9636 33.014 68.9945 33.014H71.2477C71.2785 33.014 71.2998 33.0354 71.2998 33.0665V33.6228C71.2998 33.6549 71.2785 33.6752 71.2477 33.6752H69.7331C69.7119 33.6752 69.7023 33.6859 69.7023 33.7062V34.4091C69.7023 34.4305 69.7129 34.4401 69.7331 34.4401H70.9947C71.0255 34.4401 71.0457 34.4615 71.0457 34.4925V35.0445C71.0457 35.0755 71.0255 35.0969 70.9947 35.0969H69.7331C69.7119 35.0969 69.7023 35.1076 69.7023 35.128V35.8608C69.7023 35.8822 69.7129 35.8918 69.7331 35.8918H71.2477C71.2785 35.8918 71.2998 35.9132 71.2998 35.9442V36.5005C71.2998 36.5316 71.2785 36.5529 71.2477 36.5529H68.9945C68.9636 36.5529 68.9424 36.5316 68.9424 36.5005V33.0665Z" fill="#A0A0A0"/> </svg> diff --git a/src/assets/icons/visu/egl-logo.svg b/src/assets/icons/visu/egl-logo.svg index 77a2daa10155e99c136457a18275e4d39903e216..1dbbeb465c136f3eb5c796847de6358aa9b94144 100644 --- a/src/assets/icons/visu/egl-logo.svg +++ b/src/assets/icons/visu/egl-logo.svg @@ -1,3 +1,25 @@ <svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path fill-rule="evenodd" clip-rule="evenodd" d="M62.52 29.058c.668.053 1.535-.12 2.121.097.187.162.14.42.14.723v5.556c.024 1.176.024 2.406-.456 3.485v.033h-.012c-.012.043-.023.097-.035.14h-.012v.032h-.012v.043h-.011c0 .022-.012.054-.012.076h-.012v.032h-.011v.043c-.047-.01-.012.076-.047.065v.043c-.047-.01-.012.076-.047.065v.032h-.012v.043h-.012v.033c-.047-.01-.011.075-.047.065v.032h-.011v.032h-.012v.033h-.012v.032h-.011v.032h-.012v.033h-.012v.032h-.011v.033h-.012c-.035.118-.153.215-.188.323h-.011c-.024.087-.117.13-.14.216-.024.01-.071.065-.071.097-.55.745-1.43 1.532-2.226 2.029-.164.053-.304.194-.48.248v.01c-.047-.01-.059.044-.106.033-.011.022-.023.032-.047.032-.011.022-.035.043-.07.033v.01h-.035v.011h-.035v.011h-.035c.011.043-.082.01-.07.043H60.4v.01h-.035v.012h-.035v.01h-.035c.012.044-.082.011-.07.044h-.035v.01h-.047v.011h-.035c.011.043-.082.011-.07.043h-.048v.011h-.035v.011h-.047c.012.043-.082.01-.07.043-.035 0-.07.01-.105.01v.012h-.035v.01c-.036 0-.07.011-.106.011v.011h-.035v.01c-.035 0-.07.012-.105.012v.01h-.047v.011h-.047v.011h-.047v.01h-.047v.012h-.047v.01h-.07v.011H59.1v.011c-.035 0-.082.01-.117.01v.012h-.07v.01c-.047 0-.094.011-.14.011v.01h-.071v.012h-.07v.01h-.082v.011h-.082v.011h-.083v.01h-.081v.012c-.07 0-.153.01-.223.01v.011h-.117v.011h-.14v.01h-.153v.012h-.2v.01h-.327v.011h-.527v-.01c-.445.01-.855-.065-1.242-.108v-.011h-.082v-.011h-.082v-.01h-.07v-.012h-.082v-.01h-.07v-.011h-.07v-.011h-.071v-.01h-.07v-.012h-.047v-.01a3.431 3.431 0 0 1-.762-.238h-.035v-.01h-.047v-.011h-.035v-.011h-.047c.012-.043-.082-.01-.07-.043h-.047c.012-.043-.082-.011-.07-.043h-.035v-.011h-.047v-.011H53.5c.011-.043-.082-.01-.07-.043h-.036v-.011h-.035v-.01h-.035V42.9h-.035v-.011h-.035v-.011h-.036v-.01h-.035v-.012c-.023.011-.046-.01-.07-.032-.047.01-.035-.043-.082-.032v-.011c-.234-.086-.433-.248-.644-.345-.305-.227-.68-.443-.984-.756-.715-.582-1.183-1.208-1.593-1.91h-.012v-.032h-.012v-.032h-.011v-.033h-.012v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.047 0-.024-.097-.07-.097 0-.022-.012-.054-.012-.076-.047.011-.012-.075-.047-.064v-.044c-.094-.064-.082-.27-.164-.345v-.032h-.012v-.043h-.012V38.8H49.4v-.043h-.012v-.043h-.012v-.043h-.012v-.043h-.011v-.043h-.012v-.044h-.012v-.043h-.011v-.043h-.012c0-.032-.012-.075-.012-.108h-.012c0-.043-.011-.086-.011-.13h-.012v-.064h-.012v-.065h-.011v-.064h-.012v-.065h-.012c-.023-.248-.117-.497-.117-.755h-.012v-.151h-.011v-.206h-.012v-7.315c-.023-.215.023-.442.258-.496v-.01h.046v-.012h.082v-.01h1.476c.328-.011.586-.011.727.205.093 2.416 0 4.866.035 7.283h.012v.302h.011v.15h.012v.108h.012c.011.12.035.238.047.357h.011v.064h.012v.065h.012v.065h.011v.064h.012v.065h.012v.043h.012v.044h.011v.043h.012v.043h.012v.043h.011v.043h.012c0 .033.012.065.012.097h.012v.033h.011v.043h.012v.032h.012v.043c.047-.01.011.076.047.065v.043h.011v.033c.047-.011.012.075.047.064v.033h.012v.032h.012v.032h.011v.033h.012v.032h.012v.033h.011v.032h.012c.047.151.2.28.258.42.328.4.796.929 1.288 1.22.106.086.235.162.352.216v.01c.058 0 .105.076.164.076v.01h.035v.012c.023-.011.047.01.07.032.07.032.164.065.223.108h.047v.01h.035c0 .044.105.022.105.065h.047v.011h.035v.011h.047v.01h.035c.223.098.528.184.785.217v.01h.07v.011h.082v.011h.106v.01h.105v.012h.117v.01h.153v.011a8.19 8.19 0 0 0 1.253-.01v-.011h.117v-.011h.106v-.011h.105v-.01h.082v-.012h.07v-.01h.082v-.011c.047 0 .094-.011.141-.011v-.01c.035 0 .082-.011.117-.011v-.011h.047v-.011h.047v-.01h.047v-.012h.047v-.01h.047v-.011h.046v-.011h.047v-.01h.035v-.012c.035 0 .07-.01.106-.01-.012-.044.082-.011.07-.044h.047v-.01h.035v-.011h.035v-.011h.035v-.01h.047c0-.044.106-.022.106-.066h.035v-.01h.035v-.011c.21-.065.386-.216.574-.302a6.294 6.294 0 0 0 1.44-1.349c0-.054.083-.097.083-.15h.011c.024-.087.118-.163.141-.25h.012v-.031h.011v-.033h.012v-.032h.012v-.033h.012v-.032h.011v-.032h.012v-.033h.012v-.032c.047.01.011-.076.047-.065v-.032h.011v-.043c.047.01.012-.076.047-.065v-.043h.012v-.033h.012c0-.032.011-.064.011-.097h.012v-.032a2.02 2.02 0 0 0 .188-.615h.011v-.065h.012v-.075h.012v-.097h.011v-.098h.012v-.129h.012v-.14h.011c.047-2.363 0-4.748.012-7.121-.023-.26-.035-.615.258-.67v-.01c.035 0 .082-.01.117-.01.059.042.059.032.059.032ZM47.129 42.242c-.023-2.158.047-4.337-.035-6.495h-.012c-.012-.442-.152-.874-.234-1.295h-.012c0-.032-.011-.075-.011-.108h-.012a3.266 3.266 0 0 0-.035-.15h-.012v-.044h-.012v-.043h-.011c0-.032-.012-.065-.012-.097h-.012v-.032h-.012c-.011-.044-.023-.098-.035-.14h-.011v-.033h-.012v-.043h-.012c0-.022-.012-.054-.012-.076h-.011v-.032H46.6v-.043c-.047.01-.012-.076-.047-.065v-.043c-.047.01-.012-.076-.047-.065v-.043h-.011v-.033c-.047.011-.012-.075-.047-.064v-.033h-.012v-.032h-.012v-.032h-.011v-.033h-.012v-.032h-.012v-.032h-.012v-.033h-.011v-.032h-.012c.012-.022-.012-.043-.035-.065 0-.032-.012-.043-.035-.043.011-.043-.047-.054-.035-.097h-.012c-.094-.205-.27-.389-.375-.583-.539-.723-1.453-1.51-2.202-1.985-.035 0-.082-.043-.106-.065-.175-.064-.34-.205-.527-.27v-.01h-.035v-.011h-.035v-.01h-.035v-.012h-.035v-.01h-.036v-.011h-.035v-.011h-.035c-.012-.043-.117-.032-.14-.076h-.036v-.01h-.047c.012-.043-.081-.011-.07-.043h-.035v-.011h-.047c.012-.044-.082-.011-.07-.044h-.047v-.01h-.035v-.011h-.047v-.01h-.035v-.012c-.035 0-.07-.01-.105-.01v-.011h-.036v-.011c-.035 0-.07-.01-.105-.01v-.012h-.035v-.01c-.035 0-.07-.011-.106-.011v-.01h-.047v-.012h-.046v-.01h-.047v-.011h-.07V29.5h-.047v-.01h-.047v-.012c-.059-.01-.13-.021-.188-.032v-.01c-.07-.012-.14-.022-.199-.033v-.011c-.199 0-.422-.108-.632-.097v-.01h-.117v-.012h-.118v-.01h-.164v-.011c-.34-.011-.644-.043-1.007-.033-.059.065-.305-.032-.352.033h-.199v.01h-.164v.011h-.117v.011h-.117v.01c-.281 0-.55.098-.832.141v.01c-.058.012-.129.023-.187.033v.011c-.059.01-.117.022-.164.032v.011h-.047v.011h-.047v.01h-.047v.012c-.035 0-.07.01-.105.01v.011h-.035v.011l-.152.032v.011h-.036v.011h-.047v.01c-.023 0-.058.011-.081.011v.011h-.036v.011h-.047v.01h-.035v.012h-.047c.012.043-.081.01-.07.043h-.047c0 .043-.105.021-.105.065h-.035v.01h-.035v.011h-.047c0 .043-.106.022-.106.065h-.035v.01h-.035v.011h-.035v.011h-.035v.011c-.024-.01-.047.01-.07.032-.036 0-.047.011-.047.033-.094.01-.141.086-.223.097-.152.13-.363.194-.504.324-.714.41-1.51 1.197-1.991 1.812-.059.13-.188.238-.234.356h-.012c-.035.108-.152.216-.188.324h-.011v.032c-.047.022-.059.119-.106.14v.033c-.047 0-.023.097-.07.097v.043c-.047 0-.023.097-.07.097v.033h-.012v.032h-.012v.043h-.011v.033h-.012v.032h-.012v.032h-.011v.043h-.012v.033h-.012v.043h-.012c0 .022-.011.054-.011.075h-.012v.033h-.012v.043h-.01v.032h-.011c0 .033-.012.065-.012.097h-.012v.033a5.956 5.956 0 0 0-.41 1.64h-.011a8.64 8.64 0 0 0-.012 1.456h.012v.151h.011v.13h.012v.13h.012v.097h.011c0 .248.13.507.153.755h.012c.011.075.035.15.046.216h.012v.043h.012v.043h.011v.043h.012v.043h.012v.065h.012v.032h.011v.044h.012c.012.043.023.097.035.14h.012c0 .021.012.054.012.075h.011v.033h.012c0 .032.012.065.012.097.047-.011.011.075.047.065v.043h.011v.032h.012v.043c.047-.01.012.076.047.065v.032h.012v.043c.046 0 .023.098.07.098v.032h.012v.032h.011v.033h.012v.032h.012c-.012.022.011.043.035.065 0 .032.012.043.035.043-.012.043.047.054.035.097h.012c.515.939 1.511 1.899 2.483 2.536.188.086.34.226.54.302v.01c.046-.01.034.044.081.033.012.022.035.043.07.032v.011h.036v.01c.047-.01.035.044.082.033.011.022.035.043.07.033v.01h.035v.011h.035v.01h.035c0 .044.106.022.106.066h.047c0 .043.105.021.105.064h.035v.011h.047c-.012.043.082.011.07.043h.047c-.011.044.082.011.07.044h.047v.01h.035v.011c.024 0 .059.01.083.01v.012c.035 0 .07.01.105.01v.011h.035v.011l.152.032v.011h.047v.011h.047v.01h.047v.012h.047v.01h.047v.011c.035 0 .082.01.117.01v.012c.035 0 .082.01.117.01v.011c.445.076.89.194 1.347.205v.011c2.66.043 5.365 0 8.036.01.281.012.48.012.633-.15.023-.313-.094-.874-.059-1.306Zm-2.647-.895h-5.787c-.469-.054-.984-.13-1.394-.302h-.035v-.011h-.047v-.01c-.024 0-.059-.012-.082-.012v-.01H37.1v-.011h-.047c.011-.043-.082-.011-.07-.043h-.047c0-.044-.106-.022-.106-.065h-.035v-.011h-.035v-.01h-.035v-.012c-.024.011-.047-.01-.07-.032-.036 0-.047-.01-.047-.032-.047.01-.059-.043-.106-.033v-.01c-.152-.044-.27-.173-.41-.216-.351-.216-.714-.561-1.054-.874-.105-.151-.234-.291-.34-.421-.023-.086-.117-.13-.14-.216h-.012c-.176-.345-.469-.733-.539-1.154h-.012v-.043h-.011v-.044h-.012v-.064h-.012v-.065h-.011v-.065h-.012c0-.043-.012-.097-.012-.14h-.012v-.097h-.011v-.097h-.012v-.097h-.012a6.26 6.26 0 0 1-.011-1.241h.011c.012-.291.106-.561.164-.842h.012v-.043h.012v-.043h.011v-.043h.012v-.043h.012v-.044h.012v-.043h.011c0-.032.012-.064.012-.097h.012v-.032h.011v-.043h.012v-.033h.012v-.043c.047.011.012-.075.047-.065v-.032h.011v-.043c.047 0 .024-.097.07-.097v-.033c.036-.021.07-.108.083-.14.023-.01.046-.032.035-.065h.011c-.011-.043.047-.032.036-.075h.011c.024-.097.13-.162.153-.248.351-.453.925-1.014 1.44-1.349.164-.065.317-.205.504-.27v-.01h.035v-.011h.036v-.011h.035v-.01h.035v-.012h.035v-.01h.035v-.011h.035v-.011h.035c-.011-.043.082-.01.07-.043h.036v-.01h.047c-.012-.044.082-.012.07-.044h.047v-.01h.035v-.012h.047v-.01h.035v-.011c.035 0 .07-.011.105-.011v-.01h.047v-.012h.047v-.01h.047v-.011h.047v-.011h.047v-.01c.046 0 .093-.012.14-.012v-.01h.047v-.011c.047 0 .105-.01.152-.01v-.012h.07v-.01h.106v-.011h.082v-.011h.105v-.01h.141v-.012h.152v-.01c.2.032.598-.076.785 0h.235v.01h.152v.011c.398.032.843.13 1.183.27h.035v.01h.047v.011h.035v.011h.047c-.012.043.082.011.07.043h.047c0 .044.106.022.106.065h.035v.01h.035v.012h.035c.187.097.41.205.574.302.586.388 1.288.982 1.617 1.553h.011c0 .054.082.098.082.151.024.011.047.033.035.065h.012c.023.054.059.13.105.173v.043c.047-.01.012.076.047.065v.032h.012v.032c.047 0 .023.098.07.098v.043h.012v.032c.094.162.188.41.223.615h.011v.065h.012v.065h.012v.075h.011c0 .151.083.313.07.464h.013v.151h.011c.13 1.586.094 3.377.106 5.147Zm-14.924-3.755c.164-.173.175-.291.164-.593v-1.425h-.012c0-.032-.012-.075-.012-.107h-.011v-.033h-.012c0-.226-.106-.442-.117-.658h-.012a5.447 5.447 0 0 0-.035-.184h-.012c-.012-.053-.023-.118-.035-.172h-.012v-.043h-.012v-.043h-.011v-.044h-.012v-.064h-.012v-.044h-.011v-.043h-.012v-.043h-.012v-.043h-.011v-.032h-.012l-.035-.14H29.3v-.033h-.012v-.043h-.011v-.032h-.012v-.044h-.012v-.032h-.012v-.043h-.011v-.033h-.012v-.043h-.012v-.032h-.011v-.032h-.012v-.033h-.012v-.043c-.047 0-.023-.097-.07-.097v-.032h-.012v-.033h-.012v-.043c-.047 0-.023-.097-.07-.097v-.032c-.047-.033-.07-.151-.117-.173v-.032h-.012c-.047-.14-.175-.249-.222-.378h-.012c-.035-.097-.14-.162-.164-.27-.2-.237-.41-.528-.68-.755-.421-.496-1.019-.863-1.499-1.208h-.035a.988.988 0 0 0-.305-.184v-.01a.828.828 0 0 1-.199-.109h-.035v-.01h-.035v-.011h-.035v-.01h-.035v-.012h-.036c.012-.043-.082-.01-.07-.043h-.035v-.01h-.035v-.011h-.035c0-.044-.106-.022-.106-.065-.023 0-.058-.011-.082-.011.012-.043-.082-.01-.07-.043h-.047v-.01h-.035v-.012c-.023 0-.059-.01-.082-.01v-.011h-.047c.012-.044-.082-.011-.07-.044h-.047v-.01h-.047v-.011h-.035v-.01c-.035 0-.07-.012-.105-.012v-.01h-.035c-.07-.076-.293-.054-.352-.13h-.07v-.01h-.047v-.011h-.047v-.011c-.164 0-.328-.097-.492-.097v-.011h-.07v-.01h-.082v-.012h-.106v-.01h-.082v-.011h-.105v-.011c-.27 0-.55-.076-.82-.065v-.01c-.434-.011-.867 0-1.289.032v.01c-.199-.01-.398.065-.597.065v.011c-.059 0-.117.01-.164.01v.012h-.082v.01l-.223.033v.01h-.07v.011h-.07v.011h-.047v.01c-.047 0-.094.012-.14.012v.01H19.6v.011h-.046v.011h-.07v.01h-.048v.012h-.046v.01h-.047v.011c-.035 0-.07.011-.106.011v.01h-.035v.012c-.035 0-.07.01-.105.01v.011h-.035v.011c-.036 0-.07.01-.106.01v.012h-.035v.01h-.047v.011h-.035v.011h-.047v.01h-.035v.011h-.047c.012.044-.082.011-.07.044h-.047c.012.043-.082.01-.07.043h-.035v.01h-.047v.011h-.035c.011.044-.082.011-.07.044H18.3v.01h-.035v.011h-.035v.011h-.035v.01h-.035v.012h-.036v.01h-.035v.011c-.28.119-.527.28-.75.442-.726.421-1.475 1.155-1.99 1.78 0 .033-.048.076-.071.098-.094.183-.27.356-.352.56h-.011c-.246.476-.563 1.015-.691 1.576h-.012c0 .033-.012.076-.012.108h-.012v.043h-.011v.065h-.012c0 .043-.012.086-.012.13h-.011v.075h-.012v.065h-.012v.075h-.012v.076h-.011v.075h-.012c0 .065-.012.13-.012.184h-.011c0 .075-.012.15-.012.237h-.012v.13h-.012v.183h-.011v.313H14v.529c.07.118.012.345.035.485h.012v.14h.012v.13h.011c-.011.205.106.41.106.615h.011c.012.065.024.13.036.183h.011c0 .043.012.087.012.13h.012c0 .032.011.075.011.108h.012v.043h.012v.043h.012v.065h.011v.043h.012v.043h.012v.043h.011v.043h.012c0 .033.012.065.012.097h.012v.033h.011c0 .032.012.065.012.097h.012v.032h.011v.043h.012c0 .022.012.054.012.076h.012v.032h.011v.043h.012v.033h.012v.043c.047-.01.011.075.047.065v.043c.046 0 .023.097.07.097v.032h.012v.033h.011v.043c.047 0 .024.097.07.097v.032h.012v.033c.035.021.07.108.082.14.024.01.047.032.035.065h.012c.527.928 1.535 1.888 2.519 2.514.187.075.351.226.562.302v.01c.082.054.246.087.328.152h.035v.01h.035v.011h.035v.011h.036c.011.043.117.032.14.075h.035v.011h.047c-.012.044.082.011.07.044h.047c-.011.043.082.01.07.043h.047v.01h.036v.011h.046v.011h.036a6.622 6.622 0 0 0 1.804.42v.012h.14v.01h.152v.011h.188v.01h.328v.012h.562v-.011c.176 0 .34-.01.504-.01v-.012c.422-.01.832-.118 1.242-.183v-.01c.058-.012.128-.022.187-.033v-.011c.059-.01.117-.022.164-.032v-.011h.047v-.011h.047v-.01h.047v-.012h.046v-.01l.153-.033v-.01h.035v-.011c.035 0 .07-.011.105-.011v-.01h.035v-.012c.036 0 .07-.01.106-.01v-.011h.035v-.011h.047c-.012-.043.082-.01.07-.043h.047v-.011h.035v-.01h.047c-.012-.044.082-.011.07-.044h.035v-.01a.24.24 0 0 0 .141-.065h.035v-.011h.035v-.011c.352-.13.656-.367.95-.518.058-.065.175-.108.233-.172a3.65 3.65 0 0 0 .727-.583c.129-.043.199-.205.27-.28v-.033h.01c.13-.529-.48-.755-.784-1.09-.21-.172-.375-.42-.597-.528.011-.044-.082-.011-.07-.044h-.048v-.01h-.081v-.011h-.083v.01h-.082c-.421.216-.784.626-1.171.842-.105.022-.176.119-.293.14v.011h-.035v.011c-.07.032-.164.065-.223.108h-.046v.01h-.036c0 .044-.105.022-.105.065h-.047c.012.044-.082.011-.07.044h-.047v.01h-.035v.011c-.035 0-.07.01-.106.01v.012h-.035a4.24 4.24 0 0 1-1.124.248v.01h-.14v.011a9.167 9.167 0 0 1-1.09 0v-.01h-.153v-.011h-.14v-.01h-.106v-.012a3.532 3.532 0 0 1-.972-.237h-.035v-.01h-.047v-.012c-.023 0-.058-.01-.082-.01v-.011h-.035v-.011h-.047c.012-.043-.082-.01-.07-.043h-.047c0-.043-.105-.022-.105-.065h-.036v-.01H19.4v-.011h-.035v-.011h-.035v-.011c-.223-.076-.41-.227-.597-.313-.668-.453-1.324-1.1-1.664-1.77h-.012v-.032h-.011v-.032h-.012v-.033h-.012v-.032h-.011v-.032h-.012v-.033h-.012v-.032h-.012c0-.022-.011-.054-.011-.076-.047.011-.012-.075-.047-.064v-.043h-.012v-.033h-.012c0-.021-.011-.054-.011-.075h-.012v-.043h-.012v-.033h-.011c-.024-.15-.118-.27-.141-.442 4.159-.065 8.575.162 12.85-.065Zm-12.921-2.643v-.044h.011c0-.032.012-.064.012-.097h.012c.012-.043.023-.097.035-.14h.012v-.032h.011c0-.033.012-.065.012-.097.047.01.012-.076.047-.065v-.043c.047 0 .023-.097.07-.097V34.3h.012v-.032h.012v-.032h.011v-.033h.012v-.032h.012v-.033h.012c.023-.086.117-.162.14-.248h.012c.316-.55.96-1.133 1.523-1.521.199-.086.375-.237.597-.313v-.01h.035v-.012h.035v-.01h.036v-.011h.035v-.01h.035v-.012h.035c0-.043.105-.021.105-.065h.047c.797-.355 1.84-.474 2.765-.377v.01h.117v.012h.105v.01h.106v.011h.082v.01h.07v.012h.082v.01h.07v.011h.07v.011l.188.032v.011h.047v.011h.047v.01h.047v.012h.047v.01h.046v.011l.153.032v.011h.035v.011h.047c-.012.043.082.01.07.043h.047v.011h.035c-.012.043.082.01.07.043h.035v.011h.036v.01h.035v.011h.035v.011h.035v.011h.035v.01h.035v.012h.036v.01c.901.41 1.745 1.187 2.19 2.018h.012c.035.065.07.151.117.205v.043h.012v.033c.046 0 .023.097.07.097v.043h.012v.032h.011c0 .033.012.065.012.097h.012v.033h.011c0 .032.012.065.012.097h.012c0 .032.012.065.012.097h.011v.043h.012v.043h.012v.043h.011v.065h.012c0 .032.012.076.012.108h.012v.01H16.39c.2.055.188-.086.247-.14Zm10.25 14.047c-1.066-.032-.996.26-.973-.809h2.015c0 .507.024 1.025-.07 1.522h-.012c0 .032-.011.075-.011.107h-.012v.044h-.012v.043H27.8v.043c-.046 0-.023.097-.07.097v.032h-.011v.033c-.176.302-.563.583-.88.734-.023 0-.058.01-.081.01v.011h-.047v.01h-.047v.012h-.047v.01h-.047v.011h-.07v.011c-.281.043-.68.065-.984.01v-.01h-.07v-.01h-.07v-.011h-.047v-.011h-.07v-.011h-.036v-.01h-.047v-.012h-.035v-.01h-.047c-.808-.356-1.171-1.047-1.124-2.061-.035-1.1-.047-2.04.867-2.568.082-.043.21-.097.293-.14h.035v-.011h.047v-.011h.035v-.01c.773-.227 1.827-.066 2.378.528-.246.216-.469.464-.726.658-.282-.334-.785-.496-1.254-.378v.011h-.035v.011h-.047v.01h-.035v.012c-.188.053-.293.248-.387.388v.043h-.011v.065h-.012v.075h-.012v.108h-.012c-.011.238-.023.497-.011.756h-.012c.023.42 0 .873.082 1.251h.012v.043c.093.151.222.346.421.41v.011h.047v.01h.047v.012h.047v.01h.082c.644.162 1.148-.323 1.078-1.079Zm-7.158-3.031c.059 1.251-.14 2.643.106 3.851.047-.01.011.076.047.065v.033h.011c.106.259.445.54.82.582v.011h.082v.01h.223v.012c.035 0 .035-.011.035-.011h.223v-.011h.105v-.01h.07v-.011h.047v-.011h.047v-.011h.047c.27-.119.515-.335.644-.583v-.043h.012v-.032h.012v-.043c.222-1.144.011-2.557.082-3.766h.574v3.517h-.012v.13h-.012v.097h-.012v.065h-.011v.065h-.012v.043h-.012v.043h-.011V50c-.047-.01-.012.075-.047.065v.043h-.012v.032h-.012c0 .054-.082.097-.082.151h-.011c-.094.184-.317.335-.48.453-.071.011-.141.087-.2.098v.01h-.047c.012.044-.082.011-.07.044h-.047v.01h-.047v.011h-.047v.01h-.046v.012h-.07v.01h-.083v.011h-.082v.011h-.14c-.164.076-.48-.022-.668-.01v-.012c-.047 0-.094-.01-.14-.01v-.011h-.047v-.011h-.047v-.01h-.047v-.011h-.047c.012-.044-.082-.011-.07-.044-.352-.108-.633-.399-.82-.669v-.032c-.047 0-.024-.097-.07-.097v-.043h-.012v-.033h-.012c-.012-.043-.023-.097-.035-.14h-.012c-.164-1.22-.023-2.579-.07-3.83.058-.076.351-.043.515-.043Zm18.603 0c.316.032.738-.076.984.043.023.086.129.15.152.248.07.075.14.173.187.27.07.075.14.172.188.27.07.075.14.172.187.27.13.15.246.312.34.485.07.075.14.172.187.27.07.075.14.172.188.27.258.29.41.614.68.938v-3.054h1.053v4.985c-.632-.043-.948.194-1.206-.388a2.856 2.856 0 0 1-.34-.486 2.847 2.847 0 0 1-.34-.485 2.847 2.847 0 0 1-.34-.486c-.316-.377-.538-.82-.866-1.187v3.032H38.33v-4.995Zm10.12 0h1.055v4.132h2.46v.863h-3.514v-4.995Zm3.011 0c.27.054 1.172-.151 1.207.14h.012v.032h.011v.033c.059.032.059.172.117.205v.043c.047 0 .024.097.07.097v.032h.013v.033h.011v.043c.047 0 .024.097.07.097v.032c.047-.01.012.076.047.065v.043c.047 0 .024.097.07.097v.033h.012v.032h.012v.043c.059.022.047.13.105.151v.033h.012v.043c.047 0 .024.097.07.097v.032h.012v.033h.012v.043c.047 0 .023.097.07.097v.032h.012v.033h.012v.043h.011c.012.097.106.15.117.27h.036c.011-.098.082-.13.082-.216h.011v-.033h.012v-.032h.012v-.032h.011v-.033h.012v-.032h.012v-.043c.047 0 .023-.097.07-.097v-.033c.059-.01.035-.13.082-.14v-.032h.012c0-.022.012-.054.012-.076.047 0 .023-.097.07-.097v-.043c.047 0 .023-.097.07-.097v-.033h.012v-.032h.012v-.043c.046 0 .023-.097.07-.097v-.033h.012c0-.021.011-.054.011-.075.047 0 .024-.097.07-.097v-.043c.047 0 .024-.097.07-.097v-.033h.013v-.043c.047 0 .023-.097.07-.097v-.032h.012v-.033h.011v-.043c.035 0 .059-.13.082-.14h1.137c-.094.226-.246.431-.34.636h-.012v.033h-.011v.032c-.047-.01-.012.076-.047.065v.032c-.047-.01-.012.076-.047.065v.032h-.012v.033h-.012v.032h-.011v.032h-.012v.033a2.496 2.496 0 0 0-.234.42h-.012v.033c-.047.01-.035.108-.082.13v.032h-.012v.032h-.011v.032h-.012v.033h-.012v.032c-.058.032-.058.151-.117.184v.032h-.012v.032h-.011v.033h-.012v.032a.356.356 0 0 0-.07.108c-.024.01-.047.032-.036.065h-.011v.032c-.07.043-.07.173-.14.216v.032h-.013v.033h-.011v.032h-.012v.032c-.047 0-.023.097-.07.097v.033h-.012v.032h-.012v.032h-.012v.033c-.046-.01-.011.075-.046.065v.032h-.012v.032h-.012v2.029h-1.03v-2.029h-.012a.184.184 0 0 0-.07-.13v-.032h-.012v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.082-.075-.106-.237-.188-.313v-.032h-.012v-.033h-.011v-.032h-.012v-.032h-.012v-.033h-.011c.011-.021-.012-.043-.036-.064-.011-.033-.035-.097-.07-.108v-.033h-.012v-.032H52.6v-.032h-.012v-.033c-.094-.108-.14-.302-.234-.41v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.047-.033-.07-.151-.118-.173v-.032h-.011v-.033h-.012v-.032h-.012v-.032h-.011v-.033h-.012v-.032c-.047-.01-.035-.108-.082-.13v-.032h-.012v-.032h-.012v-.033h-.011v-.032c-.047.01-.012-.076-.047-.065v-.032h-.012v-.032h-.012v-.033h-.011v-.032h-.012v-.033c-.281-.13-.375-.345-.469-.528Zm9.477 0c.305.054.937-.151 1.031.15.07.076.14.173.188.27.07.076.14.173.187.27.07.076.14.173.187.27.07.076.141.173.188.27.07.075.14.172.187.27.07.075.14.172.188.27.07.075.14.172.187.269.27.324.457.68.75 1.036v-3.054h1.054v4.985c-.832-.022-.937.183-1.312-.529a2.847 2.847 0 0 1-.34-.485 1.141 1.141 0 0 1-.187-.27 2.849 2.849 0 0 1-.34-.485c-.34-.4-.55-.82-.913-1.263v3.032H60.94v-5.006Zm-42.944 1.5h-.012v-.109h-.012v-.075h-.012v-.075h-.011v-.065h-.012v-.043h-.012v-.044h-.011v-.043H17.9c0-.032-.012-.065-.012-.097-.058-.054-.094-.162-.14-.237-.574-.842-1.84-.702-2.824-.702-.175 0-.492-.032-.632.011v4.974c.785-.021 1.663.043 2.425-.043v-.01h.07v-.011l.152-.033v-.01h.035v-.011h.047c0-.044.106-.022.106-.065h.035c.129-.076.258-.173.386-.27.106-.14.211-.259.293-.41v-.043h.012v-.032h.012v-.044h.011v-.043h.012v-.043h.012v-.043h.012c0-.043.011-.086.011-.13h.012v-.075h.012v-.097h.011v-.13h.012c.059-.658.07-1.327.024-1.953Zm-.551 1.219h-.012c.012.28-.023.582-.047.841h-.011v.065h-.012v.065h-.012v.064h-.011v.044h-.012v.043c-.047-.011-.012.075-.047.065-.082.226-.316.41-.562.485v.01h-.035v.012h-.047v.01h-.047v.011h-.047v.01h-.082v.012h-.082v.01c-.48.033-1.007.011-1.5.011v-4.035c.832.022 1.992-.183 2.414.561V47c.047 0 .023.098.07.098v.043h.012v.043h.011v.065h.012v.064h.012v.097h.012v.098h.011v.15h.012c-.023.367.012.691 0 1.026Zm41.691-2.471c-.058 0-.105-.076-.164-.076-.328-.194-.785-.215-1.218-.205-.223.043-.527.087-.691.205h-.035c-.328.173-.668.464-.832.81v.032h-.012v.043h-.011v.032h-.012c-.176.68-.117 1.608-.106 2.342h.012l.035.302h.012v.065h.012v.043h.011v.043h.012v.043h.012v.043c.047 0 .023.097.07.097v.033h.012v.032a.356.356 0 0 1 .07.108c.21.248.48.507.82.615.258.14.773.216 1.09.151h.14v-.01h.105v-.012h.083v-.01c.035 0 .082-.011.117-.011v-.011h.047v-.01c1.1-.314 1.358-1.317 1.288-2.32.059-.928-.023-1.889-.867-2.374Zm-.656 3.798c0 .043-.105.021-.105.064h-.047v.011c-.047 0-.094.011-.14.011-.024.043-.446.022-.446-.01h-.047v-.012h-.047a1.034 1.034 0 0 1-.48-.42v-.044h-.011v-.064h-.012v-.065h-.012v-.097h-.012v-.13h-.011c-.024-.582-.059-1.337.047-1.888h.011v-.043h.012v-.043h.012v-.032c.082-.151.246-.292.41-.378h.035v-.01h.047v-.012h.047v-.01h.07v-.011h.14v-.011c.364 0 .551.108.762.27.129.172.246.399.222.658h.012c-.047.701.258 1.867-.457 2.266Zm-25.76.582h-.011v-.032h-.012v-.032h-.012v-.033h-.011v-.032h-.012v-.032h-.012v-.033c-.093-.097-.152-.313-.258-.42v-.033h-.011a2.597 2.597 0 0 0-.223-.388v-.033h-.011v-.032h-.012c.011-.022-.012-.043-.035-.065 0-.032-.012-.043-.035-.043 0-.054-.06-.076-.047-.13h-.012v-.032h-.012v-.032c-.07-.119-.175-.248-.222-.41.363-.097.644-.356.82-.626v-.032c.047 0 .023-.097.07-.097 0-.033.012-.065.012-.098h.011c.082-.323.07-.69-.035-1.014h-.011v-.032h-.012v-.043c-.13-.227-.328-.475-.574-.626-.035-.011-.106-.032-.117-.065H31.9v-.01h-.036c0-.044-.105-.022-.105-.065h-.047v-.011h-.047v-.011h-.047v-.01h-.046v-.012c-.867-.108-1.828-.075-2.683-.043v4.974h1.066v-1.985h.75c.023.01.047.14.082.14v.033h.011v.032h.012v.032h.012v.033c.058.043.07.172.14.216v.032h.012v.032h.012v.033h.011v.032h.012v.032h.012v.044c.047 0 .023.097.07.097v.032h.012v.032h.012v.033h.011v.032h.012v.032c.059.022.047.13.105.151v.033h.012v.032h.012v.033h.012v.032h.011v.032h.012v.033h.012v.032h.012v.032c.058.011.035.13.081.14v.033h.012v.032h.012v.033h.012v.032c.07.097.14.238.199.378h1.218c0-.162-.105-.28-.14-.389Zm-1.124-2.848c-.035.043-.082.13-.117.183-.059.022-.094.108-.164.108 0 .043-.106.022-.106.065h-.046c-.34.119-.88.01-1.277.043v-1.316c.421.01.925-.033 1.323.043v.01h.036a.798.798 0 0 0 .163.098c.024.054.118.086.118.15.047 0 .023.098.07.098v.043h.012v.065c.07.054 0 .378-.012.41Zm14.877-1.63h-.047v-.01h-.035v-.01h-.047v-.012h-.047v-.01c-.035 0-.082-.011-.117-.011v-.011c-.058 0-.117-.01-.164-.01v-.012c-.761-.064-1.616-.021-2.39-.032v4.985c.774-.011 1.594.032 2.355-.011v-.01h.106v-.012h.07v-.01h.07v-.011c.504-.097.937-.432 1.101-.831h.012v-.032c.047.01.012-.076.047-.065v-.043h.011v-.043h.012v-.044h.012c0-.032.012-.075.012-.107h.011v-.076h.012v-.075h.012v-.13h.011c.047-1.273.305-2.848-1.007-3.366Zm-1.816 3.971v-3.258c.809-.022 1.453-.054 1.71.496 0 .032.012.065.012.097h.012v.076h.012v.075h.011v.14h.012c.047 1.49.363 2.59-1.769 2.374Zm-6.934.594h-.012v-.033h-.012c-.012-.043-.023-.097-.035-.14h-.012v-.032h-.012c0-.033-.011-.065-.011-.097h-.012v-.033h-.012c0-.032-.011-.064-.011-.097h-.012v-.043h-.012v-.032h-.012c0-.033-.011-.065-.011-.098h-.012c-.059-.27-.246-.539-.304-.809h-.012v-.043h-.012v-.032h-.012c0-.033-.011-.065-.011-.097h-.012c-.059-.292-.258-.572-.328-.864h-.012v-.032h-.012c-.011-.043-.023-.097-.035-.14h-.011v-.032h-.012l-.035-.14h-.012v-.033h-.012c-.011-.043-.023-.097-.035-.14h-.011v-.033h-.012c0-.032-.012-.065-.012-.097h-.012v-.032h-.011v-.043h-.012c0-.033-.012-.065-.012-.098h-.011v-.032h-.012v-.043h-.012c0-.032-.012-.065-.012-.097h-.011v-.032h-.012c-.012-.044-.023-.098-.035-.14h-.012v-.033h-.012c-.011-.043-.023-.097-.035-.14h-.011v-.033h-.012c-.434-1.003-.047-.938-1.183-.928-.012.087-.082.14-.07.216h-.012v.032h-.012l-.035.14h-.012v.033h-.012c-.07.324-.28.637-.351.95H34.7v.043h-.011v.032h-.012c0 .032-.012.065-.012.097h-.012v.043h-.011v.033h-.012c0 .032-.012.064-.012.097h-.011v.032h-.012c-.012.043-.024.097-.035.14h-.012v.033h-.012c-.14.496-.41.982-.562 1.467h-.012v.043h-.011v.033h-.012v.043h-.012c0 .032-.012.065-.012.097h-.011v.032h-.012c-.082.346-.293.659-.375 1.004h-.012v.032h-.011c0 .119-.094.184-.106.313h1.101c.047-.097.047-.259.117-.324v-.043h.012v-.043h.012v-.043h.012v-.043h.011v-.033h.012c.012-.118.082-.205.105-.323h1.933c.364 1.143.188.841 1.406.874-.316-.097-.375-.151-.386-.26Zm-2.953-1.435c.07-.173.153-.335.188-.518h.012v-.033h.011c0-.032.012-.064.012-.097h.012v-.043h.012v-.043h.011v-.043h.012v-.043h.012v-.043h.011v-.033h.012v-.043c.082-.065.059-.27.14-.324v-.032h.012c0-.032.012-.065.012-.097h.012v-.043h.011v-.044h.012v-.043h.012v-.043h.012v-.043h.011v-.032h.012c0-.033.012-.065.012-.097h.011v-.033h.012c0 .033.012.065.012.097h.012v.043h.011v.044h.012v.043h.012v.043h.011v.043h.012v.043h.012v.043h.012c.047.27.222.53.269.799h.012v.043h.012v.043h.011v.043h.012c.012.044.023.097.035.14h.012v.033h.012v.043h.011c0 .086.047.14.07.216-.257.01-.702.01-1.148.01Z" fill="#020304"/> +<path d="M9.98869 50.3503C9.68579 50.6552 9.24152 50.8189 8.71967 50.8189H7V45.7662H8.71967C9.24152 45.7662 9.68579 45.9299 9.98869 46.2348C10.5105 46.7601 10.4818 47.5336 10.4818 48.2364C10.4818 48.9393 10.5095 49.8261 9.98869 50.3514M9.61458 46.6189C9.35418 46.3493 9.01514 46.2498 8.6272 46.2498H7.53567V50.3375H8.62826C9.0162 50.3375 9.35418 50.238 9.61564 49.9684C9.96106 49.6068 9.94724 48.8548 9.94724 48.2364C9.94724 47.6181 9.96106 46.9805 9.61564 46.6189" fill="black"/> +<path d="M13.2816 50.8607C12.2666 50.8607 11.5332 50.1579 11.5332 49.1501V45.7653H12.0689V49.1073C12.0689 49.8733 12.5482 50.3772 13.2816 50.3772C14.0149 50.3772 14.5017 49.8733 14.5017 49.1073V45.7653H15.0374V49.1501C15.0374 50.1579 14.2966 50.8607 13.2816 50.8607Z" fill="black"/> +<path d="M19.216 50.2798C18.8568 50.6564 18.3838 50.8618 17.8131 50.8618C17.2423 50.8618 16.8119 50.6628 16.459 50.3087C15.952 49.7973 15.9659 49.1662 15.9659 48.2932C15.9659 47.4202 15.952 46.7891 16.459 46.2777C16.8119 45.9225 17.2487 45.7246 17.8131 45.7246C18.5113 45.7246 18.8993 45.9161 19.3499 46.3708L18.6867 47.0383C18.4051 46.7548 18.1999 46.6051 17.8131 46.6051C17.5452 46.6051 17.3263 46.711 17.186 46.8746C16.9957 47.0875 16.9469 47.3218 16.9469 48.2943C16.9469 49.2667 16.9957 49.5074 17.186 49.7203C17.3273 49.884 17.5452 49.9824 17.8131 49.9824C18.1096 49.9824 18.3211 49.8765 18.4827 49.6989C18.6453 49.5213 18.7016 49.2592 18.7016 49.011V48.8335H17.8131V48.0097H19.6815V48.734C19.6815 49.4646 19.5689 49.9118 19.216 50.2809" fill="black"/> +<path d="M23.1494 50.8189L22.1695 48.8034H21.4648V50.8189H20.4849V45.7662H22.4522C23.4746 45.7662 24.0804 46.4691 24.0804 47.3132C24.0804 48.0225 23.65 48.4632 23.1643 48.6397L24.2856 50.8178H23.1505L23.1494 50.8189ZM22.3884 46.6467H21.4648V47.9807H22.3884C22.8189 47.9807 23.1005 47.7036 23.1005 47.3142C23.1005 46.9248 22.8189 46.6478 22.3884 46.6478" fill="black"/> +<path d="M27.8106 50.8189L27.5141 49.9246H25.7306L25.4277 50.8189H24.4053L26.2312 45.7662H26.9997L28.833 50.8189H27.8106ZM26.6404 47.2565L26.0059 49.0944H27.2537L26.6404 47.2565Z" fill="black"/> +<path d="M32.279 50.8189L30.2905 47.7176V50.8189H29.3105V45.7662H30.1853L32.1728 48.8601V45.7662H33.1527V50.8189H32.279Z" fill="black"/> +<path d="M37.3196 50.3364C36.988 50.6702 36.5161 50.8189 35.9943 50.8189H34.1821V45.7662H35.9943C36.5161 45.7662 36.988 45.916 37.3196 46.2487C37.884 46.8168 37.8277 47.5122 37.8277 48.2706C37.8277 49.0291 37.884 49.7684 37.3196 50.3354M36.6362 46.958C36.4672 46.7526 36.2419 46.6456 35.9029 46.6456H35.1631V49.9385H35.9029C36.2408 49.9385 36.4672 49.8315 36.6362 49.6261C36.819 49.3993 36.8477 49.0377 36.8477 48.2706C36.8477 47.5036 36.819 47.1848 36.6362 46.958Z" fill="black"/> +<path d="M38.6865 50.8189V45.7662H39.6665V49.9385H41.9431V50.8189H38.6865Z" fill="black"/> +<path d="M43.9524 48.7467V50.8189H42.9799V48.7467L41.4707 45.7662H42.5357L43.4731 47.8021L44.3967 45.7662H45.4606L43.9524 48.7467Z" fill="black"/> +<path d="M48.8942 50.3076C48.5413 50.6628 48.112 50.8607 47.5402 50.8607C46.9683 50.8607 46.5315 50.6617 46.1797 50.3076C45.6717 49.7963 45.6866 49.1651 45.6866 48.2921C45.6866 47.4191 45.6728 46.788 46.1797 46.2766C46.5326 45.9214 46.9694 45.7235 47.5402 45.7235C48.1109 45.7235 48.5413 45.9225 48.8942 46.2766C49.4022 46.788 49.3948 47.4191 49.3948 48.2921C49.3948 49.1651 49.4022 49.7963 48.8942 50.3076ZM48.1683 46.8725C48.0269 46.7088 47.8091 46.6029 47.5412 46.6029C47.2734 46.6029 47.0481 46.7088 46.9067 46.8725C46.7165 47.0854 46.6676 47.3197 46.6676 48.2921C46.6676 49.2646 46.7165 49.4988 46.9067 49.7117C47.0481 49.8754 47.2734 49.9813 47.5412 49.9813C47.8091 49.9813 48.028 49.8754 48.1683 49.7117C48.3585 49.4988 48.4149 49.2646 48.4149 48.2921C48.4149 47.3197 48.3585 47.0854 48.1683 46.8725Z" fill="black"/> +<path d="M53.2229 50.8189L51.2343 47.7176V50.8189H50.2544V45.7662H51.1291L53.1166 48.8601V45.7662H54.0965V50.8189H53.2229Z" fill="black"/> +<path d="M20.8979 32.9372C20.7417 32.6334 20.5291 32.2942 20.2634 31.9262C20.105 31.7272 19.8925 31.4833 19.6299 31.1987C19.2611 30.8479 18.9954 30.62 18.8211 30.5034C18.5416 30.2926 18.3099 30.1332 18.1143 30.0145C17.7732 29.808 17.3172 29.6037 16.7581 29.4058C16.028 29.1608 15.2744 29.0313 14.5177 29.0206H14.3721C13.6015 29.0206 12.8182 29.1501 12.0434 29.4058C11.4844 29.6037 11.0284 29.808 10.6883 30.0145C10.4917 30.1322 10.2547 30.2969 9.9847 30.5012C9.8072 30.6189 9.5415 30.8479 9.1695 31.202C8.91017 31.4833 8.6976 31.7272 8.53712 31.9284C8.27141 32.2953 8.05884 32.6344 7.90473 32.9361C7.32548 34.0476 7.0332 35.2105 7.0332 36.3916V36.4804C7.0332 37.6796 7.3308 38.8575 7.91748 39.9808C8.10454 40.3274 8.35218 40.6965 8.65403 41.0773C8.92718 41.4314 9.28323 41.7952 9.7158 42.16C9.96132 42.3579 10.1834 42.5226 10.3779 42.6499C11.6087 43.4469 12.967 43.8513 14.4146 43.8513C15.4891 43.8513 16.5551 43.6117 17.584 43.1378C17.9847 42.9313 18.3811 42.6884 18.7595 42.4146C18.9657 42.2755 19.2144 42.0647 19.495 41.7919C19.6841 41.6336 19.7809 41.4731 19.7809 41.3169V41.2742C19.7809 41.1832 19.7522 41.0966 19.6958 41.0153L18.7148 40.0129C18.5767 39.8406 18.4268 39.7529 18.2716 39.7529C18.1622 39.7529 18.0548 39.7925 17.956 39.8695L17.9496 39.8749C17.8348 39.9904 17.7136 40.1027 17.5882 40.2097C17.3278 40.4333 17.0855 40.6087 16.8687 40.7318C16.0939 41.165 15.2787 41.3854 14.4454 41.3854C13.3539 41.3854 12.3548 41.0634 11.4727 40.4269C11.3196 40.322 11.1071 40.1316 10.8413 39.8631C10.6288 39.6288 10.463 39.4277 10.3503 39.2672C10.0113 38.7601 9.76682 38.2252 9.62015 37.6753H21.2943C21.6057 37.686 21.7694 37.5213 21.7694 37.2003V35.7005C21.7694 35.5882 21.7492 35.4919 21.7088 35.4148C21.5898 34.5729 21.3188 33.7385 20.9 32.9372M14.3731 31.4715C14.5475 31.4715 14.7069 31.4812 14.8631 31.5004C15.3329 31.5486 15.809 31.6663 16.2767 31.8481C17.5117 32.3798 18.4098 33.2688 18.9455 34.4895C19.0401 34.7238 19.1208 34.9655 19.1857 35.2105H9.61802C9.68179 34.9666 9.76257 34.7248 9.85716 34.4905C10.3928 33.2688 11.292 32.3798 12.5259 31.8481C13.1477 31.5978 13.7695 31.4715 14.3721 31.4715" fill="black"/> +<path d="M37.7937 36.4866C37.7937 34.7353 37.2484 33.1542 36.1728 31.7848C35.8508 31.3922 35.4799 31.0188 35.0685 30.6733C34.6944 30.377 34.3479 30.1363 34.0376 29.9608C32.9025 29.3328 31.7025 29.014 30.4707 29.014H30.3836C29.2963 29.014 28.2207 29.2687 27.1876 29.7693C26.9049 29.8966 26.5627 30.101 26.1694 30.378C25.9218 30.5471 25.6253 30.7963 25.2841 31.1205C25.0024 31.4029 24.7888 31.6372 24.6496 31.818C24.3945 32.1635 24.1862 32.477 24.0321 32.7519C23.3869 33.9127 23.0596 35.1355 23.0596 36.385V36.4727C23.0596 37.5265 23.2923 38.5738 23.7525 39.588C24.3977 40.9349 25.3691 42.0132 26.6403 42.791C27.8232 43.4895 29.088 43.8437 30.3974 43.8437H37.3037C37.3133 43.8437 37.3239 43.8437 37.3335 43.8437C37.4993 43.8437 37.6236 43.7998 37.7012 43.7131C37.7767 43.6286 37.8075 43.5056 37.7926 43.3526V36.4855L37.7937 36.4866ZM35.3598 36.5305V41.3917H30.4271C29.2974 41.3917 28.2494 41.0151 27.313 40.2748C27.1185 40.109 26.8943 39.8832 26.6488 39.6062C25.8835 38.6519 25.4945 37.5832 25.4945 36.4267C25.4945 35.8009 25.6157 35.175 25.8548 34.5685C26.0759 34.0186 26.3958 33.5168 26.805 33.0761L26.8783 33.0012C27.1005 32.768 27.2854 32.5979 27.4257 32.493C28.3355 31.8094 29.3441 31.4617 30.4261 31.4617C31.3922 31.4617 32.2999 31.7356 33.1214 32.2737C33.334 32.4192 33.5774 32.615 33.842 32.8525C34.0982 33.121 34.2735 33.3211 34.3766 33.4634C34.5786 33.7436 34.738 34.0122 34.8539 34.2625C35.1887 34.9268 35.3587 35.6896 35.3587 36.5273" fill="black"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M53.951 29.1362C54.0286 29.2164 54.0658 29.3341 54.0605 29.4838H54.0616V32.1219H51.6266V29.4368C51.6266 29.241 51.7085 29.0067 52.0985 29.0067H53.5737C53.7417 29.0067 53.8681 29.0506 53.951 29.1362ZM51.4746 37.6603C51.3318 38.2213 51.0887 38.7582 50.7477 39.2651C50.6339 39.4277 50.4724 39.6234 50.2577 39.8599C49.9888 40.1305 49.7752 40.321 49.6232 40.4258C48.7421 41.0613 47.7568 41.3833 46.6951 41.3833C45.6333 41.3833 44.648 41.0613 43.7659 40.4247C43.615 40.321 43.4013 40.1305 43.1346 39.862C42.922 39.6277 42.7562 39.4266 42.6435 39.2661C42.06 38.3996 41.7635 37.4475 41.7635 36.4354V29.4528C41.7635 29.256 41.6817 29.0217 41.2905 29.0217H39.8153C39.6463 29.0217 39.5199 29.0656 39.437 29.1511C39.3594 29.2324 39.3232 29.3491 39.3275 29.4967V36.5103C39.3275 37.7021 39.6251 38.8692 40.2118 39.9808C40.3999 40.3284 40.6475 40.6975 40.9483 41.0773C41.2225 41.4325 41.5796 41.7962 42.0101 42.1599C42.2545 42.3568 42.4777 42.5215 42.6733 42.6499C43.9041 43.4469 45.257 43.8513 46.6951 43.8513C48.1331 43.8513 49.4861 43.4469 50.7168 42.6499C50.9124 42.5215 51.1282 42.3621 51.3811 42.1589C51.8105 41.7951 52.1676 41.4314 52.4418 41.0773C52.7437 40.6954 52.9913 40.3263 53.1784 39.9797C53.5714 39.2286 53.8342 38.452 53.9649 37.6603H51.4746Z" fill="black"/> +<path d="M72.9993 37.7876H46.7632V31.9946H72.9993V37.7887V37.7876ZM47.0161 37.533H72.7463V32.2492H47.0161V37.533Z" fill="black"/> +<path d="M48.5164 36.5521C48.4856 36.5521 48.4644 36.5307 48.4644 36.4997V33.0656C48.4644 33.0346 48.4856 33.0132 48.5164 33.0132H49.8811C50.6453 33.0132 51.1055 33.4764 51.1055 34.1525C51.1055 34.8286 50.64 35.2865 49.8811 35.2865H49.2551C49.2338 35.2865 49.2243 35.2972 49.2243 35.3186V36.4986C49.2243 36.5296 49.203 36.551 49.1722 36.551H48.5154L48.5164 36.5521ZM50.3456 34.1547C50.3456 33.868 50.1543 33.6754 49.8344 33.6754H49.2551C49.2338 33.6754 49.2243 33.6861 49.2243 33.7064V34.5965C49.2243 34.6168 49.2349 34.6275 49.2551 34.6275H49.8344C50.1543 34.6275 50.3456 34.4403 50.3456 34.1547Z" fill="black"/> +<path d="M51.5767 35.2523V33.0678C51.5767 33.0368 51.5969 33.0154 51.6277 33.0154H52.2845C52.3153 33.0154 52.3366 33.0368 52.3366 33.0678V35.2737C52.3366 35.6952 52.5693 35.9349 52.9265 35.9349C53.2836 35.9349 53.51 35.6952 53.51 35.2737V33.0678C53.51 33.0368 53.5312 33.0154 53.562 33.0154H54.2178C54.2497 33.0154 54.2699 33.0368 54.2699 33.0678V35.2523C54.2699 36.1317 53.7119 36.6099 52.9265 36.6099C52.141 36.6099 51.5777 36.1317 51.5777 35.2523H51.5767Z" fill="black"/> +<path d="M54.9272 33.0665C54.9272 33.0354 54.9485 33.014 54.9793 33.014H56.3493C57.1135 33.014 57.4706 33.3938 57.4706 33.9555C57.4706 34.3406 57.2952 34.5802 57.0625 34.7107V34.7214C57.2952 34.8102 57.5323 35.1012 57.5323 35.5227C57.5323 36.2202 57.072 36.5529 56.3121 36.5529H54.9793C54.9485 36.5529 54.9272 36.5316 54.9272 36.5005V33.0665ZM56.2558 34.4615C56.5459 34.4615 56.716 34.3053 56.716 34.0453C56.716 33.7854 56.5459 33.6345 56.2558 33.6345H55.7191C55.6978 33.6345 55.6882 33.6452 55.6882 33.6655V34.4305C55.6882 34.4508 55.6989 34.4615 55.7191 34.4615H56.2558ZM55.7191 35.9335H56.2983C56.6087 35.9335 56.7734 35.7666 56.7734 35.4917C56.7734 35.2168 56.6076 35.0499 56.2983 35.0499H55.7191C55.6978 35.0499 55.6882 35.0606 55.6882 35.0809V35.9036C55.6882 35.9239 55.6989 35.9346 55.7191 35.9346V35.9335Z" fill="black"/> +<path d="M58.0815 33.0665C58.0815 33.0354 58.1028 33.014 58.1336 33.014H58.7905C58.8213 33.014 58.8425 33.0354 58.8425 33.0665V35.8394C58.8425 35.8608 58.8532 35.8704 58.8734 35.8704H60.424C60.4549 35.8704 60.4761 35.8918 60.4761 35.9228V36.5005C60.4761 36.5316 60.4549 36.5529 60.424 36.5529H58.1347C58.1039 36.5529 58.0826 36.5316 58.0826 36.5005V33.0665H58.0815Z" fill="black"/> +<path d="M60.9248 33.0665C60.9248 33.0354 60.9461 33.014 60.9769 33.014H61.6337C61.6645 33.014 61.6858 33.0354 61.6858 33.0665V36.5005C61.6858 36.5316 61.6645 36.5529 61.6337 36.5529H60.9769C60.9461 36.5529 60.9248 36.5316 60.9248 36.5005V33.0665Z" fill="black"/> +<path d="M64.7935 36.8066C64.7723 36.828 64.7415 36.8323 64.716 36.8066L64.3588 36.4472C64.1516 36.551 63.9093 36.6087 63.6457 36.6087C63.0314 36.6087 62.5446 36.3231 62.3639 35.7507C62.2874 35.5058 62.2661 35.3089 62.2661 34.7826C62.2661 34.2562 62.2874 34.0594 62.3639 33.8144C62.5446 33.2421 63.0314 32.9564 63.6457 32.9564C64.26 32.9564 64.7415 33.2431 64.9275 33.8144C65.005 34.0594 65.0263 34.2562 65.0263 34.7826C65.0263 35.3089 65.005 35.5058 64.9275 35.7507C64.9019 35.8288 64.8711 35.8962 64.8392 35.9647L65.2059 36.3284C65.2272 36.3498 65.2272 36.3809 65.2059 36.4012L64.7935 36.8066ZM63.8317 35.9176L63.6095 35.694C63.5883 35.6727 63.584 35.647 63.6095 35.6213L64.023 35.2265C64.0538 35.2009 64.0793 35.2051 64.0995 35.2265L64.2387 35.3667C64.2547 35.2469 64.26 35.0704 64.26 34.7836C64.26 34.3215 64.2451 34.1439 64.2037 34.0198C64.1261 33.7748 63.9348 33.6293 63.6457 33.6293C63.3566 33.6293 63.1642 33.7748 63.0877 34.0198C63.0462 34.1439 63.0314 34.3215 63.0314 34.7836C63.0314 35.2458 63.0462 35.4234 63.0877 35.5486C63.1642 35.7935 63.3555 35.939 63.6457 35.939C63.7126 35.939 63.7753 35.9337 63.8317 35.9176Z" fill="black"/> +<path d="M65.5908 35.2523V33.0678C65.5908 33.0368 65.611 33.0154 65.6429 33.0154H66.2987C66.3295 33.0154 66.3507 33.0368 66.3507 33.0678V35.2737C66.3507 35.6952 66.5835 35.9349 66.9406 35.9349C67.2977 35.9349 67.5241 35.6952 67.5241 35.2737V33.0678C67.5241 33.0368 67.5443 33.0154 67.5762 33.0154H68.232C68.2638 33.0154 68.284 33.0368 68.284 33.0678V35.2523C68.284 36.1317 67.7261 36.6099 66.9406 36.6099C66.1552 36.6099 65.5919 36.1317 65.5919 35.2523H65.5908Z" fill="black"/> +<path d="M68.9424 33.0665C68.9424 33.0354 68.9636 33.014 68.9945 33.014H71.2477C71.2785 33.014 71.2998 33.0354 71.2998 33.0665V33.6228C71.2998 33.6549 71.2785 33.6752 71.2477 33.6752H69.7331C69.7119 33.6752 69.7023 33.6859 69.7023 33.7062V34.4091C69.7023 34.4305 69.7129 34.4401 69.7331 34.4401H70.9947C71.0255 34.4401 71.0457 34.4615 71.0457 34.4925V35.0445C71.0457 35.0755 71.0255 35.0969 70.9947 35.0969H69.7331C69.7119 35.0969 69.7023 35.1076 69.7023 35.128V35.8608C69.7023 35.8822 69.7129 35.8918 69.7331 35.8918H71.2477C71.2785 35.8918 71.2998 35.9132 71.2998 35.9442V36.5005C71.2998 36.5316 71.2785 36.5529 71.2477 36.5529H68.9945C68.9636 36.5529 68.9424 36.5316 68.9424 36.5005V33.0665Z" fill="black"/> </svg> diff --git a/src/assets/icons/visu/partnerSteps/egl.svg b/src/assets/icons/visu/partnerSteps/egl.svg index d0de8bada5ff02119dabdb69231edde8b6f3992a..dcabb3675bb76468a52f8896308411265f75218a 100644 --- a/src/assets/icons/visu/partnerSteps/egl.svg +++ b/src/assets/icons/visu/partnerSteps/egl.svg @@ -1,30 +1,51 @@ <svg width="220" height="220" viewBox="0 0 220 220" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M2.5293 131.207H115.611V199.241C115.611 201.174 114.044 202.741 112.111 202.741H6.0293C4.0963 202.741 2.5293 201.174 2.5293 199.241V131.207Z" fill="url(#paint0_linear_11182_69405)" stroke="#52616C"/> -<path d="M2.0293 123.962C2.0293 121.753 3.82016 119.962 6.0293 119.962H112.111C114.321 119.962 116.111 121.753 116.111 123.962V130.707H2.0293V123.962Z" fill="#52616C"/> -<ellipse cx="8.90131" cy="126.678" rx="2.74897" ry="2.68643" fill="#FF5F5F"/> +<path d="M2.52899 131.208H115.611V199.241C115.611 201.174 114.044 202.741 112.111 202.741H6.02899C4.096 202.741 2.52899 201.174 2.52899 199.241V131.208Z" fill="url(#paint0_linear_115_37049)" stroke="#52616C"/> +<path d="M2.02899 123.962C2.02899 121.753 3.81985 119.962 6.02899 119.962H112.111C114.32 119.962 116.111 121.753 116.111 123.962V130.708H2.02899V123.962Z" fill="#52616C"/> +<ellipse cx="8.90143" cy="126.679" rx="2.74897" ry="2.68643" fill="#FF5F5F"/> <ellipse cx="17.1484" cy="126.678" rx="2.74897" ry="2.68643" fill="#FFB850"/> -<ellipse cx="25.3954" cy="126.678" rx="2.74896" ry="2.68643" fill="#3CE800"/> -<path d="M44.2788 179.917V181.115H39.0259V184.723H43.2786V185.875H39.0259V189.582H44.2788V190.78H37.5371V179.917H44.2788Z" fill="white"/> -<path d="M51.4717 184.465C51.431 184.521 51.3902 184.564 51.3495 184.594C51.3088 184.624 51.2503 184.64 51.1739 184.64C51.0976 184.64 51.0136 184.609 50.922 184.549C50.8354 184.483 50.7235 184.412 50.586 184.336C50.4486 184.261 50.2806 184.192 50.0821 184.132C49.8887 184.066 49.6495 184.033 49.3644 184.033C48.9878 184.033 48.6544 184.101 48.3643 184.238C48.0741 184.369 47.8298 184.561 47.6313 184.814C47.4379 185.067 47.2903 185.372 47.1885 185.731C47.0918 186.09 47.0434 186.492 47.0434 186.937C47.0434 187.402 47.0969 187.816 47.2038 188.18C47.3106 188.539 47.4608 188.842 47.6542 189.09C47.8476 189.332 48.0818 189.519 48.3566 189.651C48.6366 189.777 48.9496 189.84 49.2957 189.84C49.6266 189.84 49.8989 189.802 50.1127 189.726C50.3264 189.645 50.5046 189.557 50.6471 189.461C50.7896 189.365 50.9067 189.279 50.9983 189.203C51.0899 189.122 51.1816 189.082 51.2732 189.082C51.3902 189.082 51.4768 189.125 51.5328 189.211L51.9145 189.704C51.5786 190.113 51.1586 190.414 50.6547 190.606C50.1508 190.793 49.6189 190.886 49.059 190.886C48.5755 190.886 48.125 190.798 47.7077 190.621C47.2954 190.444 46.9365 190.189 46.6311 189.855C46.3257 189.517 46.084 189.102 45.9058 188.612C45.7328 188.122 45.6462 187.563 45.6462 186.937C45.6462 186.366 45.7251 185.837 45.8829 185.352C46.0458 184.867 46.2799 184.45 46.5853 184.101C46.8958 183.748 47.2776 183.472 47.7306 183.275C48.1836 183.078 48.7027 182.979 49.2881 182.979C49.8276 182.979 50.3061 183.068 50.7235 183.245C51.1408 183.417 51.5099 183.662 51.8305 183.98L51.4717 184.465Z" fill="white"/> -<path d="M56.4542 182.979C57.0192 182.979 57.5282 183.073 57.9812 183.26C58.4393 183.447 58.8261 183.712 59.1417 184.056C59.4623 184.4 59.7067 184.817 59.8746 185.307C60.0477 185.792 60.1342 186.335 60.1342 186.937C60.1342 187.543 60.0477 188.089 59.8746 188.574C59.7067 189.059 59.4623 189.474 59.1417 189.817C58.8261 190.161 58.4393 190.426 57.9812 190.613C57.5282 190.795 57.0192 190.886 56.4542 190.886C55.8892 190.886 55.3777 190.795 54.9196 190.613C54.4666 190.426 54.0797 190.161 53.7591 189.817C53.4384 189.474 53.1915 189.059 53.0185 188.574C52.8454 188.089 52.7589 187.543 52.7589 186.937C52.7589 186.335 52.8454 185.792 53.0185 185.307C53.1915 184.817 53.4384 184.4 53.7591 184.056C54.0797 183.712 54.4666 183.447 54.9196 183.26C55.3777 183.073 55.8892 182.979 56.4542 182.979ZM56.4542 189.832C57.2177 189.832 57.7878 189.58 58.1644 189.074C58.5411 188.564 58.7294 187.854 58.7294 186.944C58.7294 186.029 58.5411 185.317 58.1644 184.806C57.7878 184.296 57.2177 184.041 56.4542 184.041C56.0673 184.041 55.7314 184.106 55.4464 184.238C55.1613 184.369 54.9221 184.559 54.7287 184.806C54.5404 185.054 54.3978 185.36 54.3011 185.724C54.2095 186.083 54.1637 186.489 54.1637 186.944C54.1637 187.399 54.2095 187.806 54.3011 188.165C54.3978 188.524 54.5404 188.827 54.7287 189.074C54.9221 189.317 55.1613 189.504 55.4464 189.635C55.7314 189.767 56.0673 189.832 56.4542 189.832Z" fill="white"/> -<path d="M63.3205 179.614V190.78H61.9615V179.614H63.3205Z" fill="white"/> -<path d="M67.9833 193.047C67.9375 193.148 67.8789 193.229 67.8077 193.289C67.7415 193.35 67.6372 193.38 67.4946 193.38H66.4868L67.8993 190.333L64.7079 183.101H65.8837C66.0007 183.101 66.0924 183.131 66.1585 183.192C66.2247 183.247 66.2731 183.311 66.3036 183.381L68.3727 188.218C68.4185 188.329 68.4566 188.44 68.4872 188.551C68.5228 188.662 68.5534 188.776 68.5788 188.892C68.6144 188.776 68.6501 188.662 68.6857 188.551C68.7213 188.44 68.762 188.326 68.8078 188.21L70.8158 183.381C70.8464 183.3 70.8973 183.235 70.9685 183.184C71.0449 183.129 71.1263 183.101 71.2128 183.101H72.297L67.9833 193.047Z" fill="white"/> -<path d="M76.466 182.979C77.031 182.979 77.54 183.073 77.993 183.26C78.4511 183.447 78.838 183.712 79.1535 184.056C79.4742 184.4 79.7185 184.817 79.8865 185.307C80.0595 185.792 80.1461 186.335 80.1461 186.937C80.1461 187.543 80.0595 188.089 79.8865 188.574C79.7185 189.059 79.4742 189.474 79.1535 189.817C78.838 190.161 78.4511 190.426 77.993 190.613C77.54 190.795 77.031 190.886 76.466 190.886C75.9011 190.886 75.3895 190.795 74.9314 190.613C74.4784 190.426 74.0916 190.161 73.7709 189.817C73.4502 189.474 73.2034 189.059 73.0303 188.574C72.8573 188.089 72.7707 187.543 72.7707 186.937C72.7707 186.335 72.8573 185.792 73.0303 185.307C73.2034 184.817 73.4502 184.4 73.7709 184.056C74.0916 183.712 74.4784 183.447 74.9314 183.26C75.3895 183.073 75.9011 182.979 76.466 182.979ZM76.466 189.832C77.2295 189.832 77.7996 189.58 78.1763 189.074C78.5529 188.564 78.7412 187.854 78.7412 186.944C78.7412 186.029 78.5529 185.317 78.1763 184.806C77.7996 184.296 77.2295 184.041 76.466 184.041C76.0792 184.041 75.7433 184.106 75.4582 184.238C75.1732 184.369 74.934 184.559 74.7405 184.806C74.5522 185.054 74.4097 185.36 74.313 185.724C74.2214 186.083 74.1756 186.489 74.1756 186.944C74.1756 187.399 74.2214 187.806 74.313 188.165C74.4097 188.524 74.5522 188.827 74.7405 189.074C74.934 189.317 75.1732 189.504 75.4582 189.635C75.7433 189.767 76.0792 189.832 76.466 189.832Z" fill="white"/> -<path d="M59.1015 174.342C74.561 168.216 73.3594 159.506 72.5584 146.515C67.5922 146.293 63.1866 144.743 59.1015 142.16C55.0163 144.743 50.6107 146.293 45.6445 146.515C44.8435 159.506 43.6419 168.216 59.1015 174.342Z" fill="#1B1C22"/> -<path d="M59.1014 139.79L58.0541 140.452C54.2241 142.874 50.1454 144.301 45.5575 144.505L43.7785 144.584L43.6673 146.389C43.6342 146.925 43.5999 147.458 43.5657 147.988C43.1983 153.691 42.8537 159.041 44.4 163.651C46.1826 168.965 50.3182 173.02 58.3811 176.215L59.1014 176.501V174.342C44.248 168.456 44.7748 160.184 45.5494 148.023C45.581 147.527 45.613 147.024 45.6444 146.515C50.6107 146.293 55.0162 144.743 59.1014 142.16V139.79Z" fill="#FFC600"/> -<path d="M59.1017 139.79L60.1491 140.452C63.979 142.874 68.0577 144.301 72.6456 144.505L74.4246 144.584L74.5359 146.389C74.5689 146.925 74.6032 147.458 74.6374 147.988C75.0048 153.691 75.3494 159.041 73.8032 163.651C72.0205 168.965 67.8849 173.02 59.822 176.215L59.1017 176.501V174.342C73.9551 168.456 73.4283 160.184 72.6538 148.023C72.6221 147.527 72.5901 147.024 72.5587 146.515C67.5925 146.293 63.1869 144.743 59.1017 142.16V139.79Z" fill="#DB8300"/> -<path d="M54.2159 152.442H54.9187C55.1994 152.442 55.4686 152.554 55.667 152.754C55.8655 152.953 55.977 153.223 55.977 153.505V164.285H53.1576V153.505C53.1576 153.223 53.2691 152.953 53.4676 152.754C53.666 152.554 53.9352 152.442 54.2159 152.442ZM59.099 157.692H59.8018C60.0824 157.692 60.3516 157.804 60.5501 158.003C60.7486 158.202 60.8601 158.472 60.8601 158.754V164.285H58.0407V158.754C58.0407 158.472 58.1522 158.202 58.3506 158.003C58.5491 157.804 58.8183 157.692 59.099 157.692ZM64.2731 155.661H64.9759C65.2566 155.661 65.5257 155.773 65.7242 155.972C65.9227 156.172 66.0342 156.442 66.0342 156.723V164.285H63.2148V156.723C63.2148 156.442 63.3263 156.172 63.5248 155.972C63.7232 155.773 63.9924 155.661 64.2731 155.661Z" fill="#FFC600"/> -<path d="M121.39 51.5079C105.493 53.5148 90.8171 61.0772 79.9564 72.8584C69.0957 84.6397 62.7497 99.8812 62.04 115.889" stroke="#A0A0A0" stroke-width="2"/> +<ellipse cx="25.3953" cy="126.678" rx="2.74896" ry="2.68643" fill="#3CE800"/> +<path d="M44.2781 179.917V181.115H39.0252V184.724H43.2779V185.876H39.0252V189.583H44.2781V190.781H37.5364V179.917H44.2781Z" fill="white"/> +<path d="M51.471 184.466C51.4303 184.522 51.3896 184.564 51.3489 184.595C51.3081 184.625 51.2496 184.64 51.1732 184.64C51.0969 184.64 51.0129 184.61 50.9213 184.549C50.8348 184.484 50.7228 184.413 50.5854 184.337C50.4479 184.261 50.28 184.193 50.0815 184.132C49.888 184.067 49.6488 184.034 49.3638 184.034C48.9871 184.034 48.6537 184.102 48.3636 184.238C48.0735 184.37 47.8291 184.562 47.6306 184.815C47.4372 185.067 47.2896 185.373 47.1878 185.732C47.0911 186.091 47.0428 186.492 47.0428 186.937C47.0428 187.402 47.0962 187.817 47.2031 188.18C47.31 188.539 47.4601 188.843 47.6535 189.09C47.847 189.333 48.0811 189.52 48.356 189.651C48.6359 189.777 48.9489 189.841 49.2951 189.841C49.6259 189.841 49.8982 189.803 50.112 189.727C50.3258 189.646 50.5039 189.558 50.6464 189.462C50.789 189.366 50.906 189.28 50.9976 189.204C51.0893 189.123 51.1809 189.083 51.2725 189.083C51.3896 189.083 51.4761 189.126 51.5321 189.211L51.9138 189.704C51.5779 190.114 51.158 190.414 50.6541 190.606C50.1502 190.793 49.6183 190.887 49.0584 190.887C48.5748 190.887 48.1244 190.798 47.707 190.621C47.2947 190.445 46.9359 190.189 46.6305 189.856C46.3251 189.517 46.0833 189.103 45.9052 188.613C45.7321 188.122 45.6456 187.564 45.6456 186.937C45.6456 186.366 45.7245 185.838 45.8822 185.353C46.0451 184.868 46.2793 184.451 46.5847 184.102C46.8951 183.748 47.2769 183.473 47.7299 183.276C48.1829 183.079 48.7021 182.98 49.2874 182.98C49.827 182.98 50.3054 183.069 50.7228 183.245C51.1402 183.417 51.5092 183.662 51.8299 183.981L51.471 184.466Z" fill="white"/> +<path d="M56.4535 182.98C57.0185 182.98 57.5275 183.074 57.9805 183.261C58.4386 183.448 58.8254 183.713 59.141 184.057C59.4617 184.4 59.706 184.817 59.874 185.307C60.047 185.793 60.1335 186.336 60.1335 186.937C60.1335 187.544 60.047 188.089 59.874 188.575C59.706 189.06 59.4617 189.474 59.141 189.818C58.8254 190.162 58.4386 190.427 57.9805 190.614C57.5275 190.796 57.0185 190.887 56.4535 190.887C55.8885 190.887 55.377 190.796 54.9189 190.614C54.4659 190.427 54.0791 190.162 53.7584 189.818C53.4377 189.474 53.1909 189.06 53.0178 188.575C52.8447 188.089 52.7582 187.544 52.7582 186.937C52.7582 186.336 52.8447 185.793 53.0178 185.307C53.1909 184.817 53.4377 184.4 53.7584 184.057C54.0791 183.713 54.4659 183.448 54.9189 183.261C55.377 183.074 55.8885 182.98 56.4535 182.98ZM56.4535 189.833C57.217 189.833 57.7871 189.58 58.1637 189.075C58.5404 188.565 58.7287 187.854 58.7287 186.945C58.7287 186.03 58.5404 185.317 58.1637 184.807C57.7871 184.297 57.217 184.041 56.4535 184.041C56.0667 184.041 55.7307 184.107 55.4457 184.238C55.1607 184.37 54.9214 184.559 54.728 184.807C54.5397 185.055 54.3972 185.36 54.3005 185.724C54.2088 186.083 54.163 186.49 54.163 186.945C54.163 187.4 54.2088 187.806 54.3005 188.165C54.3972 188.524 54.5397 188.827 54.728 189.075C54.9214 189.318 55.1607 189.505 55.4457 189.636C55.7307 189.767 56.0667 189.833 56.4535 189.833Z" fill="white"/> +<path d="M63.3198 179.614V190.781H61.9608V179.614H63.3198Z" fill="white"/> +<path d="M67.9826 193.047C67.9368 193.148 67.8783 193.229 67.807 193.29C67.7408 193.351 67.6365 193.381 67.494 193.381H66.4862L67.8986 190.333L64.7072 183.101H65.883C66.0001 183.101 66.0917 183.132 66.1579 183.192C66.224 183.248 66.2724 183.311 66.3029 183.382L68.372 188.218C68.4178 188.33 68.456 188.441 68.4865 188.552C68.5221 188.663 68.5527 188.777 68.5781 188.893C68.6138 188.777 68.6494 188.663 68.685 188.552C68.7206 188.441 68.7614 188.327 68.8072 188.211L70.8152 183.382C70.8457 183.301 70.8966 183.235 70.9679 183.185C71.0442 183.129 71.1256 183.101 71.2122 183.101H72.2963L67.9826 193.047Z" fill="white"/> +<path d="M76.4654 182.98C77.0303 182.98 77.5393 183.074 77.9924 183.261C78.4504 183.448 78.8373 183.713 79.1529 184.057C79.4735 184.4 79.7178 184.817 79.8858 185.307C80.0589 185.793 80.1454 186.336 80.1454 186.937C80.1454 187.544 80.0589 188.089 79.8858 188.575C79.7178 189.06 79.4735 189.474 79.1529 189.818C78.8373 190.162 78.4504 190.427 77.9924 190.614C77.5393 190.796 77.0303 190.887 76.4654 190.887C75.9004 190.887 75.3888 190.796 74.9307 190.614C74.4777 190.427 74.0909 190.162 73.7702 189.818C73.4496 189.474 73.2027 189.06 73.0297 188.575C72.8566 188.089 72.7701 187.544 72.7701 186.937C72.7701 186.336 72.8566 185.793 73.0297 185.307C73.2027 184.817 73.4496 184.4 73.7702 184.057C74.0909 183.713 74.4777 183.448 74.9307 183.261C75.3888 183.074 75.9004 182.98 76.4654 182.98ZM76.4654 189.833C77.2289 189.833 77.7989 189.58 78.1756 189.075C78.5522 188.565 78.7406 187.854 78.7406 186.945C78.7406 186.03 78.5522 185.317 78.1756 184.807C77.7989 184.297 77.2289 184.041 76.4654 184.041C76.0785 184.041 75.7426 184.107 75.4576 184.238C75.1725 184.37 74.9333 184.559 74.7399 184.807C74.5515 185.055 74.409 185.36 74.3123 185.724C74.2207 186.083 74.1749 186.49 74.1749 186.945C74.1749 187.4 74.2207 187.806 74.3123 188.165C74.409 188.524 74.5515 188.827 74.7399 189.075C74.9333 189.318 75.1725 189.505 75.4576 189.636C75.7426 189.767 76.0785 189.833 76.4654 189.833Z" fill="white"/> +<path d="M59.1008 174.343C74.5603 168.216 73.3588 159.506 72.5578 146.516C67.5915 146.294 63.1859 144.744 59.1008 142.161C55.0156 144.744 50.6101 146.294 45.6438 146.516C44.8428 159.506 43.6413 168.216 59.1008 174.343Z" fill="#1B1C22"/> +<path d="M59.1007 139.791L58.0534 140.453C54.2234 142.875 50.1447 144.301 45.5568 144.506L43.7779 144.585L43.6666 146.389C43.6336 146.925 43.5992 147.458 43.5651 147.988C43.1976 153.692 42.853 159.041 44.3993 163.651C46.182 168.966 50.3175 173.021 58.3804 176.216L59.1007 176.501V174.342C44.2473 168.456 44.7741 160.185 45.5487 148.023C45.5803 147.527 45.6123 147.024 45.6437 146.515C50.61 146.294 55.0156 144.744 59.1007 142.16V139.791Z" fill="#FFC600"/> +<path d="M59.1008 139.791L60.1481 140.453C63.9781 142.875 68.0567 144.301 72.6447 144.506L74.4236 144.585L74.5349 146.389C74.5679 146.925 74.6023 147.458 74.6364 147.988C75.0038 153.692 75.3485 159.041 73.8022 163.651C72.0195 168.966 67.884 173.021 59.821 176.216L59.1008 176.501V174.342C73.9541 168.456 73.4274 160.185 72.6528 148.023C72.6212 147.527 72.5892 147.024 72.5577 146.515C67.5915 146.294 63.1859 144.744 59.1008 142.16V139.791Z" fill="#DB8300"/> +<path d="M54.2157 152.443H54.9185C55.1992 152.443 55.4684 152.555 55.6668 152.754C55.8653 152.953 55.9768 153.223 55.9768 153.505V164.286H53.1574V153.505C53.1574 153.223 53.2689 152.953 53.4674 152.754C53.6659 152.555 53.9351 152.443 54.2157 152.443ZM59.0988 157.692H59.8016C60.0823 157.692 60.3514 157.804 60.5499 158.004C60.7484 158.203 60.8599 158.473 60.8599 158.755V164.286H58.0405V158.755C58.0405 158.473 58.152 158.203 58.3505 158.004C58.5489 157.804 58.8181 157.692 59.0988 157.692ZM64.2729 155.662H64.9757C65.2564 155.662 65.5256 155.774 65.724 155.973C65.9225 156.172 66.034 156.442 66.034 156.724V164.286H63.2146V156.724C63.2146 156.442 63.3261 156.172 63.5246 155.973C63.723 155.774 63.9922 155.662 64.2729 155.662Z" fill="#FFC600"/> +<path d="M121.39 51.5076C105.492 53.5145 90.8163 61.0769 79.9556 72.8582C69.095 84.6394 62.7489 99.8809 62.0392 115.889" stroke="#A0A0A0" stroke-width="2"/> <path d="M131.5 25.5H213.5V75C213.5 76.933 211.933 78.5 210 78.5H135C133.067 78.5 131.5 76.933 131.5 75V25.5Z" fill="white" stroke="#A2B4C1"/> <path d="M131 21C131 18.7909 132.791 17 135 17H210C212.209 17 214 18.7909 214 21V25H131V21Z" fill="#A2B4C1"/> <circle cx="136" cy="22" r="2" fill="#FF5F5F"/> <circle cx="142" cy="22" r="2" fill="#FFB850"/> <circle cx="148" cy="22" r="2" fill="#3CE800"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M159.868 60.9967C158.886 60.9643 158.951 61.2556 158.973 60.1875H160.828C160.828 60.6946 160.85 61.2125 160.764 61.7088H160.753C160.753 61.7412 160.742 61.7843 160.742 61.8167H160.731V61.8598H160.721V61.903H160.71V61.9462C160.667 61.9462 160.688 62.0433 160.645 62.0433V62.0756H160.634V62.108C160.472 62.4101 160.116 62.6906 159.825 62.8417C159.804 62.8417 159.771 62.8525 159.75 62.8525V62.8633H159.706V62.8741H159.663V62.8848H159.62V62.8956H159.577V62.9064H159.512V62.9172C159.253 62.9604 158.886 62.9819 158.606 62.928V62.9172H158.541V62.9064H158.476V62.8956H158.433V62.8848H158.368V62.8741H158.336V62.8633H158.293V62.8525H158.261V62.8417H158.217C157.473 62.4856 157.138 61.7951 157.182 60.7809C157.149 59.6804 157.138 58.7417 157.98 58.213C158.056 58.1698 158.174 58.1159 158.25 58.0727H158.282V58.0619H158.325V58.0511H158.358V58.0404C159.07 57.8138 160.041 57.9756 160.548 58.569C160.321 58.7848 160.116 59.033 159.879 59.2272C159.62 58.8927 159.156 58.7309 158.725 58.8496V58.8604H158.692V58.8711H158.649V58.8819H158.617V58.8927C158.444 58.9467 158.347 59.1409 158.261 59.2811V59.3243H158.25V59.389H158.239V59.4646H158.228V59.5725H158.217C158.207 59.8098 158.196 60.0688 158.207 60.3277H158.196C158.217 60.7485 158.196 61.2017 158.271 61.5793H158.282V61.6225C158.368 61.7735 158.487 61.9677 158.671 62.0325V62.0433H158.714V62.054H158.757V62.0648H158.8V62.0756H158.876C159.469 62.2375 159.933 61.7519 159.868 60.9967ZM153.276 57.9648C153.33 59.2164 153.146 60.6083 153.373 61.8167C153.416 61.8059 153.384 61.8922 153.416 61.8814V61.9138H153.427C153.524 62.1727 153.837 62.4533 154.182 62.4964V62.5072H154.258V62.518H154.463V62.5288C154.495 62.5288 154.495 62.518 154.495 62.518H154.7V62.5072H154.797V62.4964H154.862V62.4856H154.905V62.4748H154.948V62.4641H154.991C155.24 62.3454 155.466 62.1296 155.585 61.8814V61.8383H155.596V61.8059H155.606V61.7627C155.811 60.619 155.617 59.2056 155.682 57.9972H156.211V61.5146H156.2V61.644H156.189V61.7412H156.178V61.8059H156.167V61.8706H156.157V61.9138H156.146V61.9569H156.135V62.0001C156.092 61.9893 156.124 62.0756 156.092 62.0648V62.108H156.081V62.1404H156.07C156.07 62.1943 155.995 62.2375 155.995 62.2914H155.984C155.898 62.4748 155.693 62.6259 155.542 62.7446C155.477 62.7554 155.412 62.8309 155.358 62.8417V62.8525H155.315C155.326 62.8956 155.24 62.8633 155.25 62.8956H155.207V62.9064H155.164V62.9172H155.121V62.928H155.078V62.9388H155.013V62.9496H154.937V62.9604H154.862V62.9712H154.732C154.581 63.0467 154.29 62.9496 154.117 62.9604V62.9496C154.074 62.9496 154.031 62.9388 153.988 62.9388V62.928H153.945V62.9172H153.902V62.9064H153.858V62.8956H153.815C153.826 62.8525 153.74 62.8848 153.751 62.8525C153.427 62.7446 153.168 62.4533 152.995 62.1835V62.1512C152.952 62.1512 152.974 62.054 152.931 62.054V62.0109H152.92V61.9785H152.909C152.898 61.9354 152.887 61.8814 152.877 61.8383H152.866C152.715 60.619 152.844 59.2596 152.801 58.008C152.855 57.9325 153.125 57.9648 153.276 57.9648ZM170.41 57.9648C170.701 57.9972 171.089 57.8893 171.316 58.008C171.337 58.0943 171.435 58.159 171.456 58.2561C171.521 58.3317 171.586 58.4288 171.629 58.5259C171.694 58.6014 171.758 58.6985 171.801 58.7956C171.866 58.8711 171.931 58.9683 171.974 59.0654C172.093 59.2164 172.201 59.3783 172.287 59.5509C172.352 59.6264 172.416 59.7235 172.46 59.8206C172.524 59.8962 172.589 59.9933 172.632 60.0904C172.87 60.3817 173.01 60.7054 173.258 61.029V57.9756H174.229V62.9604C173.646 62.9172 173.355 63.1546 173.118 62.5719C172.999 62.4209 172.891 62.2591 172.805 62.0864C172.686 61.9354 172.578 61.7735 172.492 61.6009C172.373 61.4498 172.265 61.288 172.179 61.1154C171.888 60.7377 171.683 60.2954 171.381 59.9285V62.9604H170.41V57.9648ZM179.732 57.9648H180.703V62.0972H182.969V62.9604H179.732V57.9648ZM182.505 57.9648C182.753 58.0188 183.584 57.8138 183.616 58.1051H183.627V58.1375H183.637V58.1698C183.691 58.2022 183.691 58.3425 183.745 58.3748V58.418C183.789 58.418 183.767 58.5151 183.81 58.5151V58.5475H183.821V58.5798H183.832V58.623C183.875 58.623 183.853 58.7201 183.896 58.7201V58.7525C183.94 58.7417 183.907 58.828 183.94 58.8172V58.8604C183.983 58.8604 183.961 58.9575 184.004 58.9575V58.9898H184.015V59.0222H184.026V59.0654C184.08 59.0869 184.069 59.1948 184.123 59.2164V59.2488H184.134V59.2919C184.177 59.2919 184.155 59.389 184.199 59.389V59.4214H184.209V59.4538H184.22V59.4969C184.263 59.4969 184.242 59.594 184.285 59.594V59.6264H184.296V59.6588H184.306V59.7019H184.317C184.328 59.799 184.414 59.853 184.425 59.9717H184.457C184.468 59.8746 184.533 59.8422 184.533 59.7559H184.544V59.7235H184.555V59.6911H184.565V59.6588H184.576V59.6264H184.587V59.594H184.598V59.5509C184.641 59.5509 184.619 59.4538 184.662 59.4538V59.4214C184.716 59.4106 184.695 59.2919 184.738 59.2811V59.2488H184.749C184.749 59.2272 184.76 59.1948 184.76 59.1733C184.803 59.1733 184.781 59.0761 184.824 59.0761V59.033C184.868 59.033 184.846 58.9359 184.889 58.9359V58.9035H184.9V58.8711H184.911V58.828C184.954 58.828 184.932 58.7309 184.975 58.7309V58.6985H184.986C184.986 58.6769 184.997 58.6446 184.997 58.623C185.04 58.623 185.019 58.5259 185.062 58.5259V58.4827C185.105 58.4827 185.083 58.3856 185.126 58.3856V58.3532H185.137V58.3101C185.18 58.3101 185.159 58.213 185.202 58.213V58.1806H185.213V58.1483H185.224V58.1051C185.256 58.1051 185.278 57.9756 185.299 57.9648H186.346C186.259 58.1914 186.119 58.3964 186.033 58.6014H186.022V58.6338H186.011V58.6661C185.968 58.6554 186 58.7417 185.968 58.7309V58.7632C185.925 58.7525 185.957 58.8388 185.925 58.828V58.8604H185.914V58.8927H185.903V58.9251H185.893V58.9575H185.882V58.9898C185.806 59.0977 185.72 59.2811 185.666 59.4106H185.655V59.443C185.612 59.4538 185.623 59.5509 185.58 59.5725V59.6048H185.569V59.6372H185.558V59.6696H185.547V59.7019H185.536V59.7343C185.482 59.7667 185.482 59.8854 185.429 59.9177V59.9501H185.418V59.9825H185.407V60.0148H185.396V60.0472C185.375 60.0688 185.342 60.1227 185.331 60.1551C185.31 60.1659 185.288 60.1875 185.299 60.2198H185.288V60.2522C185.224 60.2954 185.224 60.4248 185.159 60.468V60.5004H185.148V60.5327H185.137V60.5651H185.126V60.5975C185.083 60.5975 185.105 60.6946 185.062 60.6946V60.7269H185.051V60.7593H185.04V60.7917H185.029V60.824C184.986 60.8133 185.019 60.8996 184.986 60.8888V60.9211H184.975V60.9535H184.965V62.9819H184.015V60.9535H184.004C184.004 60.9104 183.972 60.8456 183.94 60.824V60.7917H183.929V60.7593H183.918V60.7269H183.907V60.6946H183.896V60.6622C183.821 60.5867 183.799 60.4248 183.724 60.3493V60.3169H183.713V60.2846H183.702V60.2522H183.691V60.2198H183.681V60.1875H183.67C183.681 60.1659 183.659 60.1443 183.637 60.1227C183.627 60.0904 183.605 60.0256 183.573 60.0148V59.9825H183.562V59.9501H183.551V59.9177H183.54V59.8854C183.454 59.7775 183.411 59.5833 183.325 59.4754V59.443H183.314V59.4106H183.303V59.3783H183.292V59.3459C183.249 59.3135 183.228 59.1948 183.184 59.1733V59.1409H183.174V59.1085H183.163V59.0761H183.152V59.0438H183.141V59.0114H183.13V58.979C183.087 58.9682 183.098 58.8711 183.055 58.8496V58.8172H183.044V58.7848H183.033V58.7525H183.023V58.7201C182.979 58.7309 183.012 58.6446 182.979 58.6554V58.623H182.969V58.5906H182.958V58.5583H182.947V58.5259H182.936V58.4935C182.677 58.364 182.591 58.1483 182.505 57.9648ZM191.233 57.9648C191.514 58.0188 192.096 57.8138 192.183 58.1159C192.248 58.1914 192.312 58.2885 192.355 58.3856C192.42 58.4611 192.485 58.5582 192.528 58.6554C192.593 58.7309 192.658 58.828 192.701 58.9251C192.765 59.0006 192.83 59.0977 192.873 59.1948C192.938 59.2704 193.003 59.3675 193.046 59.4646C193.111 59.5401 193.175 59.6372 193.219 59.7343C193.283 59.8098 193.348 59.9069 193.391 60.004C193.639 60.3277 193.812 60.6838 194.082 61.0398V57.9864H195.053V62.9712C194.287 62.9496 194.19 63.1546 193.844 62.4425C193.726 62.2914 193.618 62.1296 193.531 61.9569C193.467 61.8814 193.402 61.7843 193.359 61.6872C193.24 61.5362 193.132 61.3743 193.046 61.2017C192.733 60.8025 192.539 60.3817 192.204 59.9393V62.9712H191.233V57.9648ZM151.679 59.4646H151.668V59.3567H151.657V59.2811H151.647V59.2056H151.636V59.1409H151.625V59.0977H151.614V59.0546H151.603V59.0114H151.593C151.593 58.979 151.582 58.9467 151.582 58.9143C151.528 58.8604 151.496 58.7525 151.452 58.6769C150.924 57.8354 149.758 57.9756 148.852 57.9756C148.69 57.9756 148.399 57.9433 148.27 57.9864V62.9604C148.992 62.9388 149.802 63.0035 150.503 62.9172V62.9064H150.568V62.8956C150.611 62.8848 150.665 62.874 150.708 62.8633V62.8525H150.74V62.8417H150.783C150.783 62.7985 150.881 62.8201 150.881 62.7769H150.913C151.032 62.7014 151.15 62.6043 151.269 62.5072C151.366 62.3669 151.463 62.2483 151.539 62.0972V62.054H151.55V62.0217H151.56V61.9785H151.571V61.9354H151.582V61.8922H151.593V61.849H151.603C151.603 61.8059 151.614 61.7627 151.614 61.7196H151.625V61.644H151.636V61.5469H151.647V61.4175H151.657C151.711 60.7593 151.722 60.0904 151.679 59.4646ZM151.172 60.6838H151.161C151.172 60.9643 151.14 61.2664 151.118 61.5254H151.107V61.5901H151.096V61.6548H151.086V61.7196H151.075V61.7627H151.064V61.8059C151.021 61.7951 151.053 61.8814 151.021 61.8706C150.945 62.0972 150.73 62.2806 150.503 62.3562V62.3669H150.471V62.3777H150.427V62.3885H150.384V62.3993H150.341V62.4101H150.266V62.4209H150.19V62.4317C149.748 62.464 149.262 62.4425 148.809 62.4425V58.4072C149.575 58.4288 150.643 58.2238 151.032 58.9683V59.0006C151.075 59.0006 151.053 59.0977 151.096 59.0977V59.1409H151.107V59.184H151.118V59.2488H151.129V59.3135H151.14V59.4106H151.15V59.5077H151.161V59.6588H151.172C151.15 60.0256 151.183 60.3493 151.172 60.6838ZM189.572 58.213C189.518 58.213 189.475 58.1375 189.421 58.1375C189.119 57.9432 188.698 57.9217 188.299 57.9325C188.094 57.9756 187.813 58.0188 187.662 58.1375H187.63C187.328 58.3101 187.015 58.6014 186.864 58.9467V58.979H186.853V59.0222H186.842V59.0546H186.831C186.669 59.7343 186.723 60.6622 186.734 61.3959H186.745C186.756 61.493 186.766 61.5901 186.777 61.698H186.788V61.7627H186.799V61.8059H186.81V61.849H186.82V61.8922H186.831V61.9354C186.874 61.9354 186.853 62.0325 186.896 62.0325V62.0648H186.907V62.0972C186.928 62.1188 186.961 62.1727 186.971 62.2051C187.166 62.4533 187.414 62.7122 187.727 62.8201C187.964 62.9604 188.439 63.0359 188.73 62.9712H188.86V62.9604H188.957V62.9496H189.032V62.9388C189.065 62.9388 189.108 62.928 189.14 62.928V62.9172H189.183V62.9064C190.198 62.5935 190.435 61.5901 190.37 60.5867C190.424 59.6588 190.349 58.6985 189.572 58.213ZM188.968 62.0109C188.968 62.054 188.87 62.0325 188.87 62.0756H188.827V62.0864C188.784 62.0864 188.741 62.0972 188.698 62.0972C188.676 62.1404 188.288 62.1188 188.288 62.0864H188.245V62.0756H188.201C188.018 61.9893 187.856 61.8383 187.759 61.6548V61.6117H187.748V61.5469H187.738V61.4822H187.727V61.3851H187.716V61.2556H187.705C187.684 60.673 187.651 59.9177 187.748 59.3675H187.759V59.3243H187.77V59.2811H187.781V59.2488C187.856 59.0977 188.007 58.9575 188.158 58.8711H188.191V58.8604H188.234V58.8496H188.277V58.8388H188.342V58.828H188.471V58.8172C188.806 58.8172 188.978 58.9251 189.173 59.0869C189.291 59.2596 189.399 59.4861 189.378 59.7451H189.388C189.345 60.4464 189.626 61.6117 188.968 62.0109ZM165.241 62.5935H165.231V62.5612H165.22V62.5288H165.209V62.4964H165.198V62.4641H165.187V62.4317H165.177V62.3993C165.09 62.3022 165.036 62.0864 164.939 61.9785V61.9462H164.929C164.875 61.8275 164.799 61.6656 164.724 61.5577V61.5254H164.713V61.493H164.702C164.713 61.4714 164.691 61.4498 164.67 61.4283C164.67 61.3959 164.659 61.3851 164.637 61.3851C164.637 61.3312 164.583 61.3096 164.594 61.2556H164.583V61.2233H164.572V61.1909C164.508 61.0722 164.411 60.9427 164.367 60.7809C164.702 60.6838 164.961 60.4248 165.123 60.1551V60.1227C165.166 60.1227 165.144 60.0256 165.187 60.0256C165.187 59.9933 165.198 59.9609 165.198 59.9285H165.209C165.285 59.6048 165.274 59.238 165.177 58.9143H165.166V58.8819H165.155V58.8388C165.036 58.6122 164.853 58.364 164.626 58.213C164.594 58.2022 164.529 58.1806 164.519 58.1483H164.486V58.1375H164.454C164.454 58.0943 164.357 58.1159 164.357 58.0727H164.314V58.0619H164.27V58.0511H164.227V58.0404H164.184V58.0296C163.386 57.9217 162.501 57.954 161.713 57.9864V62.9604H162.695V60.9751H163.386C163.407 60.9859 163.429 61.1154 163.461 61.1154V61.1477H163.472V61.1801H163.483V61.2125H163.494V61.2448C163.547 61.288 163.558 61.4175 163.623 61.4606V61.493H163.634V61.5254H163.645V61.5577H163.655V61.5901H163.666V61.6225H163.677V61.6656C163.72 61.6656 163.699 61.7627 163.742 61.7627V61.7951H163.752V61.8275H163.763V61.8598H163.774V61.8922H163.785V61.9246C163.839 61.9462 163.828 62.054 163.882 62.0756V62.108H163.893V62.1404H163.904V62.1727H163.914V62.2051H163.925V62.2375H163.936V62.2698H163.947V62.3022H163.957V62.3346C164.011 62.3454 163.99 62.464 164.033 62.4748V62.5072H164.044V62.5396H164.055V62.5719H164.065V62.6043C164.13 62.7014 164.195 62.8417 164.249 62.9819H165.371C165.371 62.8201 165.274 62.7014 165.241 62.5935ZM164.206 59.7451C164.173 59.7883 164.13 59.8746 164.098 59.9285C164.044 59.9501 164.011 60.0364 163.947 60.0364C163.947 60.0796 163.85 60.058 163.85 60.1011H163.806C163.494 60.2198 162.997 60.1119 162.63 60.1443V58.828C163.019 58.8388 163.483 58.7956 163.85 58.8711V58.8819H163.882C163.914 58.9143 163.99 58.9575 164.033 58.979C164.055 59.033 164.141 59.0654 164.141 59.1301C164.184 59.1301 164.162 59.2272 164.206 59.2272V59.2704H164.216V59.3351C164.281 59.389 164.216 59.7127 164.206 59.7451ZM177.908 58.1159H177.865V58.1051H177.833V58.0943H177.79V58.0835H177.746V58.0727C177.714 58.0727 177.671 58.0619 177.639 58.0619V58.0511C177.585 58.0511 177.531 58.0404 177.487 58.0404V58.0296C176.786 57.9648 175.999 58.008 175.286 57.9972V62.9819C175.999 62.9712 176.754 63.0143 177.455 62.9712V62.9604H177.552V62.9496H177.617V62.9388H177.682V62.928C178.146 62.8309 178.545 62.4964 178.696 62.0972H178.707V62.0648C178.75 62.0756 178.717 61.9893 178.75 62.0001V61.9569H178.761V61.9138H178.771V61.8706H178.782C178.782 61.8383 178.793 61.7951 178.793 61.7627H178.804V61.6872H178.815V61.6117H178.825V61.4822H178.836C178.879 60.209 179.117 58.6338 177.908 58.1159ZM176.236 62.0864V58.828C176.98 58.8064 177.574 58.774 177.811 59.3243C177.811 59.3567 177.822 59.389 177.822 59.4214H177.833V59.4969H177.844V59.5725H177.854V59.7127H177.865C177.908 61.2017 178.2 62.3022 176.236 62.0864ZM169.849 62.6798H169.838V62.6475H169.827C169.816 62.6043 169.805 62.5504 169.795 62.5072H169.784V62.4748H169.773C169.773 62.4425 169.762 62.4101 169.762 62.3777H169.751V62.3454H169.741C169.741 62.313 169.73 62.2806 169.73 62.2483H169.719V62.2051H169.708V62.1727H169.697C169.697 62.1404 169.687 62.108 169.687 62.0756H169.676C169.622 61.8059 169.449 61.5362 169.395 61.2664H169.385V61.2233H169.374V61.1909H169.363C169.363 61.1585 169.352 61.1262 169.352 61.0938H169.341C169.287 60.8025 169.104 60.5219 169.039 60.2306H169.029V60.1983H169.018C169.007 60.1551 168.996 60.1011 168.985 60.058H168.975V60.0256H168.964C168.953 59.9825 168.942 59.9285 168.931 59.8854H168.921V59.853H168.91C168.899 59.8098 168.888 59.7559 168.877 59.7127H168.867V59.6804H168.856C168.856 59.648 168.845 59.6156 168.845 59.5833H168.834V59.5509H168.824V59.5077H168.813C168.813 59.4754 168.802 59.443 168.802 59.4106H168.791V59.3783H168.78V59.3351H168.77C168.77 59.3027 168.759 59.2704 168.759 59.238H168.748V59.2056H168.737C168.726 59.1625 168.716 59.1085 168.705 59.0654H168.694V59.033H168.683C168.672 58.9898 168.662 58.9359 168.651 58.8927H168.64V58.8604H168.629C168.23 57.8569 168.586 57.9217 167.54 57.9325C167.529 58.0188 167.464 58.0727 167.475 58.1483H167.464V58.1806H167.453C167.442 58.2238 167.432 58.2777 167.421 58.3209H167.41V58.3532H167.399C167.335 58.6769 167.14 58.9898 167.076 59.3027H167.065V59.3459H167.054V59.3783H167.043C167.043 59.4106 167.032 59.443 167.032 59.4754H167.022V59.5185H167.011V59.5509H167C167 59.5833 166.989 59.6156 166.989 59.648H166.979V59.6804H166.968C166.957 59.7235 166.946 59.7775 166.935 59.8206H166.925V59.853H166.914C166.784 60.3493 166.536 60.8348 166.396 61.3204H166.385V61.3635H166.374V61.3959H166.364V61.439H166.353C166.353 61.4714 166.342 61.5038 166.342 61.5362H166.331V61.5685H166.32C166.245 61.9138 166.051 62.2267 165.975 62.5719H165.964V62.6043H165.954C165.954 62.723 165.867 62.7877 165.856 62.9172H166.871C166.914 62.8201 166.914 62.6583 166.979 62.5935V62.5504H166.989V62.5072H167V62.4641H167.011V62.4209H167.022V62.3885H167.032C167.043 62.2698 167.108 62.1835 167.13 62.0648H168.91C169.244 63.2085 169.082 62.9064 170.205 62.9388C169.913 62.8417 169.859 62.7877 169.849 62.6798ZM167.13 61.2448C167.194 61.0722 167.27 60.9104 167.302 60.7269H167.313V60.6946H167.324C167.324 60.6622 167.335 60.6298 167.335 60.5975H167.345V60.5543H167.356V60.5111H167.367V60.468H167.378V60.4248H167.389V60.3817H167.399V60.3493H167.41V60.3062C167.486 60.2414 167.464 60.0364 167.54 59.9825V59.9501H167.55C167.55 59.9177 167.561 59.8854 167.561 59.853H167.572V59.8098H167.583V59.7667H167.594V59.7235H167.604V59.6804H167.615V59.6372H167.626V59.6048H167.637C167.637 59.5725 167.647 59.5401 167.647 59.5077H167.658V59.4754H167.669C167.669 59.5077 167.68 59.5401 167.68 59.5725H167.691V59.6156H167.701V59.6588H167.712V59.7019H167.723V59.7451H167.734V59.7883H167.745V59.8314H167.755V59.8746H167.766C167.809 60.1443 167.971 60.4033 168.014 60.673H168.025V60.7162H168.036V60.7593H168.047V60.8025H168.057C168.068 60.8456 168.079 60.8996 168.09 60.9427H168.101V60.9751H168.111V61.0183H168.122C168.122 61.1046 168.165 61.1585 168.187 61.234C167.95 61.2448 167.54 61.2448 167.13 61.2448Z" fill="#020304"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M192.69 41.0575C193.305 41.1115 194.104 40.9388 194.643 41.1546C194.816 41.3165 194.772 41.5754 194.772 41.8775V47.4341C194.794 48.6102 194.794 49.8402 194.352 50.9191V50.9515H194.341C194.33 50.9947 194.319 51.0486 194.309 51.0918H194.298V51.1241H194.287V51.1673H194.276C194.276 51.1889 194.265 51.2212 194.265 51.2428H194.255V51.2752H194.244V51.3183C194.201 51.3076 194.233 51.3939 194.201 51.3831V51.4262C194.157 51.4154 194.19 51.5018 194.157 51.491V51.5233H194.147V51.5665H194.136V51.5989C194.093 51.5881 194.125 51.6744 194.093 51.6636V51.696H194.082V51.7283H194.071V51.7607H194.06V51.7931H194.05V51.8254H194.039V51.8578H194.028V51.8902H194.017V51.9226H194.006C193.974 52.0412 193.866 52.1383 193.834 52.2462H193.823C193.801 52.3326 193.715 52.3757 193.694 52.462C193.672 52.4728 193.629 52.5268 193.629 52.5591C193.122 53.3036 192.312 54.0912 191.579 54.5876C191.428 54.6415 191.298 54.7818 191.136 54.8357V54.8465C191.093 54.8357 191.082 54.8897 191.039 54.8789C191.029 54.9005 191.018 54.9112 190.996 54.9112C190.985 54.9328 190.964 54.9544 190.931 54.9436V54.9544H190.899V54.9652H190.867V54.976H190.834C190.845 55.0191 190.759 54.9868 190.77 55.0191H190.737V55.0299H190.705V55.0407H190.672V55.0515H190.64C190.651 55.0947 190.565 55.0623 190.575 55.0947H190.543V55.1055H190.5V55.1162H190.467C190.478 55.1594 190.392 55.127 190.403 55.1594H190.36V55.1702H190.327V55.181H190.284C190.295 55.2241 190.209 55.1918 190.219 55.2241C190.187 55.2241 190.155 55.2349 190.122 55.2349V55.2457H190.09V55.2565C190.057 55.2565 190.025 55.2673 189.993 55.2673V55.2781H189.96V55.2889C189.928 55.2889 189.896 55.2997 189.863 55.2997V55.3105H189.82V55.3212H189.777V55.332H189.734V55.3428H189.691V55.3536H189.647V55.3644H189.583V55.3752H189.54V55.386C189.507 55.386 189.464 55.3968 189.432 55.3968V55.4076H189.367V55.4183C189.324 55.4183 189.281 55.4291 189.237 55.4291V55.4399H189.173V55.4507H189.108V55.4615H189.032V55.4723H188.957V55.4831H188.881V55.4939H188.806V55.5047C188.741 55.5047 188.666 55.5155 188.601 55.5155V55.5262H188.493V55.537H188.364V55.5478H188.223V55.5586H188.04V55.5694H187.738V55.5802H187.252V55.5694C186.842 55.5802 186.465 55.5047 186.109 55.4615V55.4507H186.033V55.4399H185.957V55.4291H185.893V55.4183H185.817V55.4076H185.752V55.3968H185.688V55.386H185.623V55.3752H185.558V55.3644H185.515V55.3536C185.289 55.3105 185.008 55.2133 184.814 55.1162H184.781V55.1055H184.738V55.0947H184.706V55.0839H184.663C184.673 55.0407 184.587 55.0731 184.598 55.0407H184.555C184.566 54.9976 184.479 55.0299 184.49 54.9976H184.458V54.9868H184.415V54.976H184.382C184.393 54.9328 184.307 54.9652 184.317 54.9328H184.285V54.922H184.253V54.9112H184.22V54.9005H184.188V54.8897H184.156V54.8789H184.123V54.8681H184.091V54.8573C184.069 54.8681 184.048 54.8465 184.026 54.8249C183.983 54.8357 183.994 54.7818 183.951 54.7926V54.7818C183.735 54.6955 183.551 54.5336 183.357 54.4365C183.077 54.2099 182.731 53.9941 182.451 53.6812C181.793 53.0986 181.361 52.4728 180.983 51.7715H180.973V51.7391H180.962V51.7068H180.951V51.6744H180.94V51.642H180.93V51.6097H180.919V51.5773H180.908V51.5449C180.865 51.5449 180.886 51.4478 180.843 51.4478C180.843 51.4262 180.832 51.3939 180.832 51.3723C180.789 51.3831 180.822 51.2968 180.789 51.3076V51.2644C180.703 51.1997 180.714 50.9947 180.638 50.9191V50.8868H180.627V50.8436H180.617V50.8004H180.606V50.7573H180.595V50.7141H180.584V50.671H180.573V50.6278H180.563V50.5847H180.552V50.5415H180.541V50.4983H180.53V50.4552H180.52C180.52 50.4228 180.509 50.3797 180.509 50.3473H180.498C180.498 50.3041 180.487 50.261 180.487 50.2178H180.476V50.1531H180.466V50.0883H180.455V50.0236H180.444V49.9589H180.433C180.412 49.7107 180.325 49.4625 180.325 49.2036H180.315V49.0525H180.304V48.8475H180.293V41.5323C180.271 41.3165 180.315 41.0899 180.53 41.036V41.0252H180.573V41.0144H180.649V41.0036H182.008C182.311 40.9928 182.548 40.9928 182.677 41.2086C182.764 43.6254 182.677 46.0746 182.71 48.4915H182.721V48.7936H182.731V48.9447H182.742V49.0525H182.753C182.764 49.1712 182.785 49.2899 182.796 49.4086H182.807V49.4733H182.818V49.5381H182.828V49.6028H182.839V49.6675H182.85V49.7323H182.861V49.7754H182.872V49.8186H182.882V49.8618H182.893V49.9049H182.904V49.9481H182.915V49.9912H182.926C182.926 50.0236 182.936 50.056 182.936 50.0883H182.947V50.1207H182.958V50.1639H182.969V50.1962H182.98V50.2394C183.023 50.2286 182.99 50.3149 183.023 50.3041V50.3473H183.033V50.3797C183.077 50.3689 183.044 50.4552 183.077 50.4444V50.4768H183.087V50.5091H183.098V50.5415H183.109V50.5739H183.12V50.6062H183.131V50.6386H183.141V50.671H183.152C183.195 50.822 183.336 50.9515 183.39 51.0918C183.692 51.491 184.123 52.0197 184.576 52.311C184.674 52.3973 184.792 52.4728 184.9 52.5268V52.5376C184.954 52.5376 184.997 52.6131 185.051 52.6131V52.6239H185.083V52.6347C185.105 52.6239 185.127 52.6454 185.148 52.667C185.213 52.6994 185.299 52.7318 185.353 52.7749H185.396V52.7857H185.429C185.429 52.8289 185.526 52.8073 185.526 52.8504H185.569V52.8612H185.601V52.872H185.645V52.8828H185.677C185.882 52.9799 186.162 53.0662 186.4 53.0986V53.1094H186.465V53.1202H186.54V53.131H186.637V53.1418H186.734V53.1526H186.842V53.1633H186.982V53.1741C187.339 53.2065 187.781 53.1957 188.137 53.1633V53.1526H188.245V53.1418H188.342V53.131H188.439V53.1202H188.515V53.1094H188.579V53.0986H188.655V53.0878C188.698 53.0878 188.741 53.077 188.784 53.077V53.0662C188.817 53.0662 188.86 53.0555 188.892 53.0555V53.0447H188.935V53.0339H188.979V53.0231H189.022V53.0123H189.065V53.0015H189.108V52.9907H189.151V52.9799H189.194V52.9691H189.227V52.9583C189.259 52.9583 189.291 52.9476 189.324 52.9476C189.313 52.9044 189.399 52.9368 189.389 52.9044H189.432V52.8936H189.464V52.8828H189.496V52.872H189.529V52.8612H189.572C189.572 52.8181 189.669 52.8397 189.669 52.7965H189.701V52.7857H189.734V52.7749C189.928 52.7102 190.09 52.5591 190.262 52.4728C190.726 52.1491 191.266 51.5881 191.59 51.1241C191.59 51.0702 191.665 51.027 191.665 50.9731H191.676C191.697 50.8868 191.784 50.8112 191.805 50.7249H191.816V50.6926H191.827V50.6602H191.838V50.6278H191.849V50.5954H191.859V50.5631H191.87V50.5307H191.881V50.4983H191.892V50.466C191.935 50.4768 191.902 50.3904 191.935 50.4012V50.3689H191.946V50.3257C191.989 50.3365 191.956 50.2502 191.989 50.261V50.2178H192V50.1854H192.01C192.01 50.1531 192.021 50.1207 192.021 50.0883H192.032V50.056C192.107 49.8941 192.183 49.646 192.205 49.441H192.215V49.3762H192.226V49.3007H192.237V49.2036H192.248V49.1065H192.259V48.977H192.269V48.8368H192.28C192.323 46.4739 192.28 44.0894 192.291 41.7157C192.269 41.4567 192.259 41.1007 192.528 41.0467V41.036C192.561 41.036 192.604 41.0252 192.636 41.0252C192.69 41.0683 192.69 41.0575 192.69 41.0575ZM178.513 54.2423C178.491 52.0844 178.556 49.9049 178.48 47.747H178.47C178.459 47.3046 178.329 46.8731 178.254 46.4523H178.243C178.243 46.4199 178.232 46.3768 178.232 46.3444H178.221C178.211 46.2904 178.2 46.2365 178.189 46.1933H178.178V46.1502H178.167V46.107H178.157C178.157 46.0746 178.146 46.0423 178.146 46.0099H178.135V45.9775H178.124C178.113 45.9344 178.103 45.8804 178.092 45.8373H178.081V45.8049H178.07V45.7617H178.06C178.06 45.7402 178.049 45.7078 178.049 45.6862H178.038V45.6539H178.027V45.6107C177.984 45.6215 178.016 45.5352 177.984 45.546V45.5028C177.941 45.5136 177.973 45.4273 177.941 45.4381V45.3949H177.93V45.3625C177.887 45.3733 177.919 45.287 177.887 45.2978V45.2654H177.876V45.2331H177.865V45.2007H177.855V45.1683H177.844V45.136H177.833V45.1036H177.822V45.0712H177.811V45.0389H177.801C177.811 45.0173 177.79 44.9957 177.768 44.9741C177.768 44.9417 177.757 44.931 177.736 44.931C177.747 44.8878 177.693 44.877 177.703 44.8339H177.693C177.606 44.6289 177.445 44.4454 177.347 44.2512C176.851 43.5283 176.01 42.7407 175.319 42.266C175.287 42.266 175.243 42.2228 175.222 42.2012C175.06 42.1365 174.909 41.9962 174.736 41.9315V41.9207H174.704V41.9099H174.672V41.8991H174.639V41.8883H174.607V41.8775H174.575V41.8667H174.542V41.856H174.51C174.499 41.8128 174.402 41.8236 174.38 41.7804H174.348V41.7696H174.305C174.316 41.7265 174.229 41.7588 174.24 41.7265H174.208V41.7157H174.165C174.175 41.6725 174.089 41.7049 174.1 41.6725H174.057V41.6617H174.024V41.651H173.981V41.6402H173.949V41.6294C173.916 41.6294 173.884 41.6186 173.852 41.6186V41.6078H173.819V41.597C173.787 41.597 173.755 41.5862 173.722 41.5862V41.5754H173.69V41.5646C173.657 41.5646 173.625 41.5538 173.593 41.5538V41.5431H173.55V41.5323H173.506V41.5215H173.463V41.5107H173.398V41.4999H173.355V41.4891H173.312V41.4783C173.258 41.4675 173.193 41.4567 173.14 41.4459V41.4352C173.075 41.4244 173.01 41.4136 172.956 41.4028V41.392C172.773 41.392 172.568 41.2841 172.373 41.2949V41.2841H172.266V41.2733H172.158V41.2625H172.007V41.2517C171.694 41.241 171.413 41.2086 171.079 41.2194C171.025 41.2841 170.798 41.187 170.755 41.2517H170.572V41.2625H170.421V41.2733H170.313V41.2841H170.205V41.2949C169.946 41.2949 169.698 41.392 169.439 41.4352V41.4459C169.385 41.4567 169.32 41.4675 169.266 41.4783V41.4891C169.212 41.4999 169.158 41.5107 169.115 41.5215V41.5323H169.072V41.5431H169.029V41.5538H168.986V41.5646C168.953 41.5646 168.921 41.5754 168.888 41.5754V41.5862H168.856V41.597C168.813 41.6078 168.759 41.6186 168.716 41.6294V41.6402H168.683V41.651H168.64V41.6617C168.619 41.6617 168.586 41.6725 168.565 41.6725V41.6833H168.532V41.6941H168.489V41.7049H168.457V41.7157H168.414C168.425 41.7588 168.338 41.7265 168.349 41.7588H168.306C168.306 41.802 168.209 41.7804 168.209 41.8236H168.176V41.8344H168.144V41.8452H168.101C168.101 41.8883 168.004 41.8667 168.004 41.9099H167.971V41.9207H167.939V41.9315H167.907V41.9423H167.874V41.9531C167.853 41.9423 167.831 41.9638 167.81 41.9854C167.777 41.9854 167.766 41.9962 167.766 42.0178C167.68 42.0286 167.637 42.1041 167.561 42.1149C167.421 42.2444 167.227 42.3091 167.097 42.4386C166.439 42.8486 165.706 43.6362 165.263 44.2512C165.209 44.3807 165.091 44.4886 165.047 44.6073H165.037C165.004 44.7152 164.896 44.8231 164.864 44.931H164.853V44.9633C164.81 44.9849 164.799 45.082 164.756 45.1036V45.136C164.713 45.136 164.735 45.2331 164.691 45.2331V45.2762C164.648 45.2762 164.67 45.3733 164.627 45.3733V45.4057H164.616V45.4381H164.605V45.4812H164.594V45.5136H164.583V45.546H164.573V45.5783H164.562V45.6215H164.551V45.6539H164.54V45.697H164.53C164.53 45.7186 164.519 45.751 164.519 45.7725H164.508V45.8049H164.497V45.8481H164.486V45.8804H164.476C164.476 45.9128 164.465 45.9452 164.465 45.9775H164.454V46.0099C164.26 46.5062 164.13 47.0996 164.076 47.6499H164.066C164.022 48.1246 164.022 48.6425 164.055 49.1065H164.066V49.2575H164.076V49.387H164.087V49.5165H164.098V49.6136H164.109C164.109 49.8618 164.227 50.1207 164.249 50.3689H164.26C164.271 50.4444 164.292 50.5199 164.303 50.5847H164.314V50.6278H164.325V50.671H164.335V50.7141H164.346V50.7573H164.357V50.822H164.368V50.8544H164.378V50.8976H164.389C164.4 50.9407 164.411 50.9947 164.422 51.0378H164.432C164.432 51.0594 164.443 51.0918 164.443 51.1133H164.454V51.1457H164.465C164.465 51.1781 164.476 51.2105 164.476 51.2428C164.519 51.232 164.486 51.3183 164.519 51.3076V51.3507H164.53V51.3831H164.54V51.4262C164.583 51.4154 164.551 51.5018 164.583 51.491V51.5233H164.594V51.5665C164.637 51.5665 164.616 51.6636 164.659 51.6636V51.696H164.67V51.7283H164.681V51.7607H164.691V51.7931H164.702C164.691 51.8147 164.713 51.8362 164.735 51.8578C164.735 51.8902 164.745 51.901 164.767 51.901C164.756 51.9441 164.81 51.9549 164.799 51.9981H164.81C165.285 52.9368 166.202 53.897 167.097 54.5336C167.27 54.6199 167.41 54.7602 167.594 54.8357V54.8465C167.637 54.8357 167.626 54.8897 167.669 54.8789C167.68 54.9005 167.702 54.922 167.734 54.9112V54.922H167.766V54.9328C167.81 54.922 167.799 54.976 167.842 54.9652C167.853 54.9868 167.874 55.0084 167.907 54.9976V55.0083H167.939V55.0191H167.971V55.0299H168.004C168.004 55.0731 168.101 55.0515 168.101 55.0947H168.144C168.144 55.1378 168.241 55.1162 168.241 55.1594H168.273V55.1702H168.317C168.306 55.2133 168.392 55.181 168.381 55.2134H168.425C168.414 55.2565 168.5 55.2241 168.489 55.2565H168.532V55.2673H168.565V55.2781C168.586 55.2781 168.619 55.2889 168.64 55.2889V55.2997C168.673 55.2997 168.705 55.3105 168.737 55.3105V55.3212H168.77V55.332C168.813 55.3428 168.867 55.3536 168.91 55.3644V55.3752H168.953V55.386H168.996V55.3968H169.04V55.4076H169.083V55.4183H169.126V55.4291C169.158 55.4291 169.201 55.4399 169.234 55.4399V55.4507C169.266 55.4507 169.309 55.4615 169.342 55.4615V55.4723C169.752 55.5478 170.162 55.6665 170.582 55.6773V55.6881C173.032 55.7312 175.524 55.6881 177.984 55.6989C178.243 55.7097 178.426 55.7097 178.567 55.5478C178.588 55.2349 178.48 54.6739 178.513 54.2423ZM176.074 53.3468H170.744C170.313 53.2928 169.838 53.2173 169.46 53.0447H169.428V53.0339H169.385V53.0231C169.363 53.0231 169.331 53.0123 169.309 53.0123V53.0015H169.277V52.9907H169.234C169.245 52.9476 169.158 52.9799 169.169 52.9476H169.126C169.126 52.9044 169.029 52.926 169.029 52.8828H168.996V52.872H168.964V52.8612H168.932V52.8504C168.91 52.8612 168.888 52.8397 168.867 52.8181C168.835 52.8181 168.824 52.8073 168.824 52.7857C168.781 52.7965 168.77 52.7426 168.727 52.7533V52.7426C168.586 52.6994 168.478 52.5699 168.349 52.5268C168.025 52.311 167.691 51.9657 167.378 51.6528C167.281 51.5018 167.162 51.3615 167.065 51.232C167.043 51.1457 166.957 51.1026 166.936 51.0162H166.925C166.763 50.671 166.493 50.2825 166.428 49.8618H166.418V49.8186H166.407V49.7754H166.396V49.7107H166.385V49.646H166.375V49.5812H166.364C166.364 49.5381 166.353 49.4841 166.353 49.441H166.342V49.3439H166.331V49.2468H166.321V49.1497H166.31C166.267 48.7936 166.267 48.2757 166.299 47.9089H166.31C166.321 47.6175 166.407 47.3478 166.461 47.0673H166.472V47.0241H166.482V46.981H166.493V46.9378H166.504V46.8946H166.515V46.8515H166.526V46.8083H166.536C166.536 46.776 166.547 46.7436 166.547 46.7112H166.558V46.6789H166.569V46.6357H166.58V46.6033H166.59V46.5602C166.633 46.571 166.601 46.4847 166.633 46.4954V46.4631H166.644V46.4199C166.687 46.4199 166.666 46.3228 166.709 46.3228V46.2904C166.741 46.2689 166.774 46.1825 166.785 46.1502C166.806 46.1394 166.828 46.1178 166.817 46.0854H166.828C166.817 46.0423 166.871 46.0531 166.86 46.0099H166.871C166.892 45.9128 166.99 45.8481 167.011 45.7617C167.335 45.3086 167.863 44.7475 168.338 44.4131C168.489 44.3483 168.63 44.2081 168.802 44.1433V44.1325H168.835V44.1218H168.867V44.111H168.899V44.1002H168.932V44.0894H168.964V44.0786H168.996V44.0678H169.029V44.057H169.061C169.05 44.0139 169.137 44.0462 169.126 44.0139H169.158V44.0031H169.201C169.191 43.9599 169.277 43.9923 169.266 43.9599H169.309V43.9491H169.342V43.9383H169.385V43.9275H169.417V43.9167C169.45 43.9167 169.482 43.906 169.514 43.906V43.8952H169.557V43.8844H169.601V43.8736H169.644V43.8628H169.687V43.852H169.73V43.8412C169.773 43.8412 169.816 43.8304 169.86 43.8304V43.8196H169.903V43.8089C169.946 43.8089 170 43.7981 170.043 43.7981V43.7873H170.108V43.7765H170.205V43.7657H170.28V43.7549H170.377V43.7441H170.507V43.7333H170.647V43.7225C170.831 43.7549 171.197 43.647 171.37 43.7225H171.586V43.7333H171.726V43.7441C172.093 43.7765 172.503 43.8736 172.816 44.0139H172.848V44.0246H172.891V44.0354H172.924V44.0462H172.967C172.956 44.0894 173.042 44.057 173.032 44.0894H173.075C173.075 44.1325 173.172 44.111 173.172 44.1541H173.204V44.1649H173.237V44.1757H173.269C173.442 44.2728 173.647 44.3807 173.798 44.4778C174.337 44.8662 174.985 45.4596 175.287 46.0315H175.297C175.297 46.0854 175.373 46.1286 175.373 46.1825C175.395 46.1933 175.416 46.2149 175.405 46.2473H175.416C175.438 46.3012 175.47 46.3768 175.513 46.4199V46.4631C175.556 46.4523 175.524 46.5386 175.556 46.5278V46.5602H175.567V46.5925C175.61 46.5925 175.589 46.6896 175.632 46.6896V46.7328H175.643V46.7652C175.729 46.927 175.815 47.1752 175.848 47.3802H175.858V47.4449H175.869V47.5096H175.88V47.5852H175.891C175.891 47.7362 175.966 47.8981 175.956 48.0491H175.966V48.2002H175.977C176.096 49.7862 176.063 51.5773 176.074 53.3468ZM162.328 49.592C162.479 49.4194 162.49 49.3007 162.48 48.9986V47.5744H162.469C162.469 47.542 162.458 47.4989 162.458 47.4665H162.447V47.4341H162.436C162.436 47.2075 162.339 46.9918 162.328 46.776H162.318C162.307 46.7112 162.296 46.6465 162.285 46.5925H162.274C162.264 46.5386 162.253 46.4739 162.242 46.4199H162.231V46.3768H162.221V46.3336H162.21V46.2904H162.199V46.2257H162.188V46.1825H162.177V46.1394H162.167V46.0962H162.156V46.0531H162.145V46.0207H162.134C162.123 45.9775 162.113 45.9236 162.102 45.8804H162.091V45.8481H162.08V45.8049H162.069V45.7725H162.059V45.7294H162.048V45.697H162.037V45.6539H162.026V45.6215H162.016V45.5783H162.005V45.546H161.994V45.5136H161.983V45.4812H161.972V45.4381C161.929 45.4381 161.951 45.341 161.908 45.341V45.3086H161.897V45.2762H161.886V45.2331C161.843 45.2331 161.865 45.136 161.821 45.136V45.1036C161.778 45.0712 161.757 44.9525 161.713 44.931V44.8986H161.703C161.66 44.7583 161.541 44.6504 161.498 44.521H161.487C161.455 44.4239 161.357 44.3591 161.336 44.2512C161.152 44.0138 160.958 43.7225 160.71 43.496C160.322 42.9996 159.771 42.6328 159.329 42.2875H159.297C159.221 42.212 159.102 42.1365 159.016 42.1041V42.0933C158.951 42.0717 158.876 42.0178 158.833 41.9854H158.8V41.9746H158.768V41.9639H158.736V41.9531H158.703V41.9423H158.671C158.682 41.8991 158.595 41.9315 158.606 41.8991H158.574V41.8883H158.541V41.8775H158.509C158.509 41.8344 158.412 41.856 158.412 41.8128C158.39 41.8128 158.358 41.802 158.336 41.802C158.347 41.7589 158.261 41.7912 158.272 41.7588H158.228V41.7481H158.196V41.7373C158.174 41.7373 158.142 41.7265 158.121 41.7265V41.7157H158.077C158.088 41.6725 158.002 41.7049 158.013 41.6725H157.969V41.6617H157.926V41.651H157.894V41.6402C157.862 41.6402 157.829 41.6294 157.797 41.6294V41.6186H157.764C157.7 41.5431 157.495 41.5646 157.441 41.4891H157.376V41.4783H157.333V41.4675H157.29V41.4567C157.139 41.4567 156.988 41.3596 156.837 41.3596V41.3488H156.772V41.3381H156.696V41.3273H156.599V41.3165H156.524V41.3057H156.427V41.2949C156.178 41.2949 155.919 41.2194 155.671 41.2302V41.2194C155.272 41.2086 154.873 41.2194 154.484 41.2517V41.2625C154.301 41.2517 154.118 41.3273 153.934 41.3273V41.3381C153.88 41.3381 153.826 41.3488 153.783 41.3488V41.3596H153.708V41.3704C153.643 41.3812 153.567 41.392 153.503 41.4028V41.4136H153.438V41.4244H153.373V41.4352H153.33V41.4459C153.287 41.4459 153.244 41.4567 153.201 41.4567V41.4675H153.157V41.4783H153.114V41.4891H153.049V41.4999H153.006V41.5107H152.963V41.5215H152.92V41.5323C152.888 41.5323 152.855 41.5431 152.823 41.5431V41.5538H152.791V41.5646C152.758 41.5646 152.726 41.5754 152.693 41.5754V41.5862H152.661V41.597C152.629 41.597 152.596 41.6078 152.564 41.6078V41.6186H152.532V41.6294H152.488V41.6402H152.456V41.651H152.413V41.6617H152.381V41.6725H152.337C152.348 41.7157 152.262 41.6833 152.273 41.7157H152.229C152.24 41.7588 152.154 41.7265 152.165 41.7588H152.132V41.7696H152.089V41.7804H152.057C152.068 41.8236 151.981 41.7912 151.992 41.8236H151.96V41.8344H151.927V41.8452H151.895V41.856H151.863V41.8667H151.83V41.8775H151.798V41.8883H151.766V41.8991C151.507 42.0178 151.28 42.1796 151.075 42.3415C150.406 42.7623 149.716 43.496 149.241 44.1218C149.241 44.1541 149.198 44.1973 149.176 44.2189C149.09 44.4023 148.928 44.5749 148.852 44.7799H148.842C148.615 45.2546 148.324 45.7941 148.205 46.3552H148.194C148.194 46.3875 148.183 46.4307 148.183 46.4631H148.173V46.5062H148.162V46.571H148.151C148.151 46.6141 148.14 46.6573 148.14 46.7004H148.129V46.776H148.119V46.8407H148.108V46.9162H148.097V46.9918H148.086V47.0673H148.076C148.076 47.132 148.065 47.1968 148.065 47.2507H148.054C148.054 47.3262 148.043 47.4018 148.043 47.4881H148.032V47.6175H148.022V47.801H148.011V48.1139H148V48.6425C148.065 48.7612 148.011 48.9878 148.032 49.1281H148.043V49.2683H148.054V49.3978H148.065C148.054 49.6028 148.162 49.8078 148.162 50.0128H148.173C148.183 50.0776 148.194 50.1423 148.205 50.1962H148.216C148.216 50.2394 148.227 50.2826 148.227 50.3257H148.237C148.237 50.3581 148.248 50.4012 148.248 50.4336H148.259V50.4768H148.27V50.5199H148.281V50.5847H148.291V50.6278H148.302V50.671H148.313V50.7141H148.324V50.7573H148.334C148.334 50.7897 148.345 50.822 148.345 50.8544H148.356V50.8868H148.367C148.367 50.9191 148.378 50.9515 148.378 50.9839H148.388V51.0162H148.399V51.0594H148.41C148.41 51.081 148.421 51.1133 148.421 51.1349H148.432V51.1673H148.442V51.2104H148.453V51.2428H148.464V51.286C148.507 51.2752 148.475 51.3615 148.507 51.3507V51.3939C148.55 51.3939 148.529 51.491 148.572 51.491V51.5233H148.583V51.5557H148.593V51.5989C148.637 51.5989 148.615 51.696 148.658 51.696V51.7283H148.669V51.7607C148.701 51.7823 148.734 51.8686 148.744 51.901C148.766 51.9118 148.788 51.9333 148.777 51.9657H148.788C149.273 52.8936 150.201 53.8539 151.107 54.4797C151.28 54.5552 151.431 54.7062 151.625 54.7818V54.7926C151.701 54.8465 151.852 54.8789 151.927 54.9436H151.96V54.9544H151.992V54.9652H152.024V54.976H152.057C152.068 55.0191 152.165 55.0084 152.186 55.0515H152.219V55.0623H152.262C152.251 55.1055 152.337 55.0731 152.327 55.1055H152.37C152.359 55.1486 152.445 55.1162 152.434 55.1486H152.478V55.1594H152.51V55.1702H152.553V55.181H152.586C153.082 55.3968 153.686 55.5478 154.247 55.6018V55.6126H154.377V55.6234H154.517V55.6341H154.689V55.6449H154.992V55.6557H155.509V55.6449C155.671 55.6449 155.822 55.6341 155.973 55.6341V55.6234C156.362 55.6126 156.739 55.5047 157.117 55.4399V55.4291C157.171 55.4184 157.236 55.4076 157.29 55.3968V55.386C157.344 55.3752 157.398 55.3644 157.441 55.3536V55.3428H157.484V55.332H157.527V55.3212H157.57V55.3105H157.613V55.2997C157.657 55.2889 157.711 55.2781 157.754 55.2673V55.2565H157.786V55.2457C157.818 55.2457 157.851 55.2349 157.883 55.2349V55.2241H157.916V55.2134C157.948 55.2134 157.98 55.2026 158.013 55.2026V55.1918H158.045V55.181H158.088C158.077 55.1378 158.164 55.1702 158.153 55.1378H158.196V55.127H158.228V55.1162H158.272C158.261 55.0731 158.347 55.1055 158.336 55.0731H158.369V55.0623C158.412 55.0623 158.466 55.0299 158.498 54.9976H158.531V54.9868H158.563V54.976C158.887 54.8465 159.167 54.6091 159.437 54.4581C159.491 54.3934 159.599 54.3502 159.653 54.2855C159.89 54.1344 160.117 53.9294 160.322 53.7028C160.44 53.6597 160.505 53.4978 160.57 53.4223V53.3899H160.581C160.699 52.8612 160.138 52.6347 159.858 52.3002C159.663 52.1276 159.512 51.8794 159.307 51.7715C159.318 51.7283 159.232 51.7607 159.243 51.7283H159.199V51.7176H159.124V51.7068H159.048V51.7176H158.973C158.584 51.9333 158.25 52.3433 157.894 52.5591C157.797 52.5807 157.732 52.6778 157.624 52.6994V52.7102H157.592V52.721C157.527 52.7533 157.441 52.7857 157.387 52.8289H157.344V52.8397H157.311C157.311 52.8828 157.214 52.8612 157.214 52.9044H157.171C157.182 52.9476 157.096 52.9152 157.106 52.9476H157.063V52.9583H157.031V52.9691C156.998 52.9691 156.966 52.9799 156.934 52.9799V52.9907H156.901C156.599 53.1202 156.211 53.2065 155.866 53.2389V53.2497H155.736V53.2604C155.434 53.282 155.035 53.282 154.733 53.2604V53.2497H154.592V53.2389H154.463V53.2281H154.366V53.2173C154.064 53.1849 153.729 53.0986 153.47 52.9799H153.438V52.9691H153.395V52.9583C153.373 52.9583 153.341 52.9476 153.319 52.9476V52.9368H153.287V52.926H153.244C153.254 52.8828 153.168 52.9152 153.179 52.8828H153.136C153.136 52.8397 153.039 52.8612 153.039 52.8181H153.006V52.8073H152.974V52.7965H152.942V52.7857H152.909V52.7749C152.704 52.6994 152.532 52.5483 152.359 52.462C151.744 52.0089 151.14 51.3615 150.827 50.6926H150.816V50.6602H150.805V50.6278H150.794V50.5954H150.784V50.5631H150.773V50.5307H150.762V50.4983H150.751V50.466H150.741C150.741 50.4444 150.73 50.412 150.73 50.3904C150.687 50.4012 150.719 50.3149 150.687 50.3257V50.2826H150.676V50.2502H150.665C150.665 50.2286 150.654 50.1962 150.654 50.1747H150.643V50.1315H150.633V50.0991H150.622C150.6 49.9481 150.514 49.8294 150.492 49.6568C154.323 49.592 158.39 49.8186 162.328 49.592ZM150.428 46.9486V46.9054H150.438C150.438 46.8731 150.449 46.8407 150.449 46.8083H150.46C150.471 46.7652 150.482 46.7112 150.492 46.6681H150.503V46.6357H150.514C150.514 46.6033 150.525 46.571 150.525 46.5386C150.568 46.5494 150.536 46.4631 150.568 46.4739V46.4307C150.611 46.4307 150.589 46.3336 150.633 46.3336V46.3012H150.643V46.2689H150.654V46.2365H150.665V46.2041H150.676V46.1718H150.687V46.1394H150.697C150.719 46.0531 150.805 45.9775 150.827 45.8912H150.838C151.129 45.341 151.722 44.7583 152.24 44.3699C152.424 44.2836 152.586 44.1325 152.791 44.057V44.0462H152.823V44.0354H152.855V44.0246H152.888V44.0139H152.92V44.0031H152.952V43.9923H152.985C152.985 43.9491 153.082 43.9707 153.082 43.9275H153.125C153.859 43.5715 154.819 43.4528 155.671 43.5499V43.5607H155.779V43.5715H155.876V43.5823H155.973V43.5931H156.049V43.6038H156.114V43.6146H156.189V43.6254H156.254V43.6362H156.319V43.647C156.373 43.6578 156.437 43.6686 156.491 43.6794V43.6902H156.534V43.701H156.578V43.7117H156.621V43.7225H156.664V43.7333H156.707V43.7441C156.75 43.7549 156.804 43.7657 156.847 43.7765V43.7873H156.88V43.7981H156.923C156.912 43.8412 156.998 43.8089 156.988 43.8412H157.031V43.852H157.063C157.052 43.8952 157.139 43.8628 157.128 43.8952H157.16V43.906H157.193V43.9167H157.225V43.9275H157.257V43.9383H157.29V43.9491H157.322V43.9599H157.354V43.9707H157.387V43.9815C158.218 44.3915 158.994 45.1683 159.404 45.9991H159.415C159.448 46.0639 159.48 46.1502 159.523 46.2041V46.2473H159.534V46.2796C159.577 46.2796 159.556 46.3768 159.599 46.3768V46.4199H159.609V46.4523H159.62C159.62 46.4846 159.631 46.517 159.631 46.5494H159.642V46.5818H159.653C159.653 46.6141 159.663 46.6465 159.663 46.6789H159.674C159.674 46.7112 159.685 46.7436 159.685 46.776H159.696V46.8191H159.707V46.8623H159.717V46.9054H159.728V46.9702H159.739C159.739 47.0025 159.75 47.0457 159.75 47.0781H159.761V47.0889H150.201C150.384 47.1428 150.374 47.0025 150.428 46.9486Z" fill="#FE001C"/> +<path d="M145.497 60.4122C145.229 60.6696 144.837 60.8078 144.376 60.8078H142.857V56.5425H144.376C144.837 56.5425 145.229 56.6807 145.497 56.938C145.958 57.3815 145.932 58.0344 145.932 58.6277C145.932 59.221 145.957 59.9697 145.497 60.4131M145.166 57.2622C144.936 57.0347 144.637 56.9507 144.294 56.9507H143.33V60.4014H144.295C144.638 60.4014 144.936 60.3174 145.167 60.0898C145.472 59.7846 145.46 59.1497 145.46 58.6277C145.46 58.1057 145.472 57.5675 145.167 57.2622" fill="#1A171B"/> +<path d="M148.405 60.8429C147.508 60.8429 146.861 60.2496 146.861 59.3989V56.5415H147.334V59.3628C147.334 60.0094 147.757 60.4347 148.405 60.4347C149.053 60.4347 149.482 60.0094 149.482 59.3628V56.5415H149.955V59.3989C149.955 60.2496 149.301 60.8429 148.405 60.8429Z" fill="#1A171B"/> +<path d="M153.646 60.3527C153.328 60.6706 152.911 60.844 152.407 60.844C151.903 60.844 151.523 60.676 151.211 60.3771C150.763 59.9454 150.775 59.4126 150.775 58.6756C150.775 57.9387 150.763 57.4059 151.211 56.9742C151.523 56.6744 151.908 56.5073 152.407 56.5073C153.023 56.5073 153.366 56.669 153.764 57.0528L153.178 57.6163C152.93 57.377 152.748 57.2506 152.407 57.2506C152.17 57.2506 151.977 57.34 151.853 57.4781C151.685 57.6579 151.642 57.8556 151.642 58.6765C151.642 59.4975 151.685 59.7007 151.853 59.8804C151.978 60.0185 152.17 60.1016 152.407 60.1016C152.669 60.1016 152.855 60.0122 152.998 59.8623C153.142 59.7124 153.191 59.4911 153.191 59.2816V59.1317H152.407V58.4363H154.057V59.0477C154.057 59.6645 153.957 60.042 153.646 60.3536" fill="#1A171B"/> +<path d="M157.12 60.8078L156.254 59.1064H155.632V60.8078H154.766V56.5425H156.504C157.407 56.5425 157.942 57.1358 157.942 57.8483C157.942 58.4471 157.562 58.8192 157.133 58.9682L158.123 60.8069H157.121L157.12 60.8078ZM156.448 57.2857H155.632V58.4119H156.448C156.828 58.4119 157.076 58.178 157.076 57.8493C157.076 57.5205 156.828 57.2866 156.448 57.2866" fill="#1A171B"/> +<path d="M161.236 60.8078L160.974 60.0528H159.399L159.132 60.8078H158.229L159.841 56.5425H160.52L162.139 60.8078H161.236ZM160.203 57.8005L159.642 59.352H160.744L160.203 57.8005Z" fill="#1A171B"/> +<path d="M165.182 60.8078L163.426 58.1897V60.8078H162.561V56.5425H163.333L165.088 59.1542V56.5425H165.954V60.8078H165.182Z" fill="#1A171B"/> +<path d="M169.633 60.4005C169.341 60.6823 168.924 60.8078 168.463 60.8078H166.863V56.5425H168.463C168.924 56.5425 169.341 56.6689 169.633 56.9498C170.132 57.4293 170.082 58.0163 170.082 58.6566C170.082 59.2969 170.132 59.9209 169.633 60.3996M169.03 57.5485C168.881 57.3751 168.682 57.2848 168.382 57.2848H167.729V60.0645H168.382C168.681 60.0645 168.881 59.9742 169.03 59.8008C169.191 59.6094 169.217 59.3041 169.217 58.6566C169.217 58.0091 169.191 57.74 169.03 57.5485Z" fill="#1A171B"/> +<path d="M170.841 60.8078V56.5425H171.706V60.0645H173.717V60.8078H170.841Z" fill="#1A171B"/> +<path d="M175.491 59.0585V60.8078H174.632V59.0585L173.299 56.5425H174.24L175.068 58.2611L175.883 56.5425H176.823L175.491 59.0585Z" fill="#1A171B"/> +<path d="M179.855 60.3761C179.544 60.6759 179.164 60.843 178.659 60.843C178.154 60.843 177.769 60.675 177.458 60.3761C177.009 59.9444 177.022 59.4116 177.022 58.6747C177.022 57.9377 177.01 57.4049 177.458 56.9732C177.77 56.6734 178.155 56.5063 178.659 56.5063C179.163 56.5063 179.544 56.6743 179.855 56.9732C180.304 57.4049 180.297 57.9377 180.297 58.6747C180.297 59.4116 180.304 59.9444 179.855 60.3761ZM179.214 57.4763C179.089 57.3381 178.897 57.2487 178.66 57.2487C178.424 57.2487 178.225 57.3381 178.1 57.4763C177.932 57.656 177.889 57.8538 177.889 58.6747C177.889 59.4956 177.932 59.6934 178.1 59.8731C178.225 60.0112 178.424 60.1007 178.66 60.1007C178.897 60.1007 179.09 60.0112 179.214 59.8731C179.382 59.6934 179.432 59.4956 179.432 58.6747C179.432 57.8538 179.382 57.656 179.214 57.4763Z" fill="#1A171B"/> +<path d="M183.678 60.8078L181.922 58.1897V60.8078H181.056V56.5425H181.829L183.584 59.1542V56.5425H184.45V60.8078H183.678Z" fill="#1A171B"/> +<path d="M155.131 45.7125C154.993 45.456 154.805 45.1697 154.571 44.859C154.431 44.6911 154.243 44.4852 154.011 44.2449C153.686 43.9487 153.451 43.7564 153.297 43.6579C153.05 43.48 152.845 43.3455 152.673 43.2452C152.371 43.0709 151.969 42.8984 151.475 42.7314C150.83 42.5246 150.165 42.4153 149.496 42.4062H149.368C148.687 42.4062 147.996 42.5155 147.311 42.7314C146.818 42.8984 146.415 43.0709 146.115 43.2452C145.941 43.3446 145.732 43.4836 145.493 43.6561C145.337 43.7555 145.102 43.9487 144.773 44.2477C144.544 44.4852 144.357 44.6911 144.215 44.8609C143.98 45.1706 143.792 45.4569 143.656 45.7116C143.145 46.6499 142.887 47.6315 142.887 48.6285V48.7035C142.887 49.7159 143.15 50.7102 143.668 51.6584C143.833 51.951 144.052 52.2626 144.318 52.5841C144.559 52.883 144.874 53.1901 145.256 53.498C145.473 53.6651 145.669 53.8042 145.841 53.9116C146.927 54.5844 148.127 54.9258 149.405 54.9258C150.354 54.9258 151.296 54.7235 152.204 54.3234C152.558 54.1491 152.908 53.9441 153.243 53.713C153.425 53.5956 153.644 53.4176 153.892 53.1874C154.059 53.0537 154.145 52.9182 154.145 52.7864V52.7503C154.145 52.6735 154.119 52.6003 154.069 52.5317L153.203 51.6855C153.081 51.5401 152.949 51.4661 152.812 51.4661C152.715 51.4661 152.62 51.4995 152.533 51.5645L152.527 51.569C152.426 51.6665 152.319 51.7614 152.208 51.8517C151.978 52.0404 151.764 52.1885 151.573 52.2924C150.888 52.6581 150.169 52.8442 149.433 52.8442C148.469 52.8442 147.586 52.5723 146.807 52.035C146.672 51.9465 146.484 51.7858 146.25 51.5591C146.062 51.3613 145.916 51.1915 145.816 51.0561C145.517 50.628 145.301 50.1764 145.171 49.7123H155.481C155.756 49.7213 155.901 49.5822 155.901 49.3113V48.0452C155.901 47.9503 155.883 47.869 155.847 47.804C155.742 47.0933 155.503 46.3889 155.133 45.7125M149.369 44.4752C149.523 44.4752 149.664 44.4834 149.802 44.4996C150.216 44.5403 150.637 44.6396 151.05 44.7931C152.141 45.242 152.934 45.9924 153.407 47.0229C153.49 47.2206 153.562 47.4247 153.619 47.6315H145.169C145.226 47.4256 145.297 47.2215 145.381 47.0238C145.854 45.9924 146.648 45.242 147.738 44.7931C148.287 44.5818 148.836 44.4752 149.368 44.4752" fill="#E20025"/> +<path d="M170.052 48.709C170.052 47.2306 169.571 45.8958 168.621 44.7399C168.336 44.4085 168.009 44.0933 167.645 43.8016C167.315 43.5514 167.009 43.3482 166.735 43.2001C165.733 42.67 164.673 42.4009 163.585 42.4009H163.508C162.548 42.4009 161.598 42.6158 160.686 43.0385C160.436 43.1459 160.134 43.3184 159.786 43.5523C159.568 43.695 159.306 43.9054 159.005 44.1791C158.756 44.4175 158.567 44.6153 158.444 44.7679C158.219 45.0596 158.035 45.3242 157.899 45.5563C157.329 46.5361 157.04 47.5684 157.04 48.6232V48.6972C157.04 49.5868 157.246 50.4709 157.652 51.327C158.222 52.464 159.08 53.3743 160.202 54.0309C161.247 54.6206 162.364 54.9195 163.52 54.9195H169.619C169.628 54.9195 169.637 54.9195 169.646 54.9195C169.792 54.9195 169.902 54.8825 169.97 54.8094C170.037 54.738 170.064 54.6342 170.051 54.505V48.7081L170.052 48.709ZM167.903 48.746V52.8496H163.547C162.549 52.8496 161.623 52.5318 160.796 51.9068C160.625 51.7668 160.427 51.5763 160.21 51.3424C159.534 50.5368 159.19 49.6346 159.19 48.6584C159.19 48.1301 159.297 47.6018 159.509 47.0897C159.704 46.6255 159.986 46.202 160.348 45.8299L160.412 45.7667C160.609 45.5698 160.772 45.4262 160.896 45.3377C161.699 44.7607 162.59 44.4672 163.546 44.4672C164.399 44.4672 165.2 44.6983 165.926 45.1526C166.114 45.2754 166.329 45.4407 166.562 45.6412C166.789 45.8678 166.943 46.0367 167.034 46.1568C167.213 46.3934 167.354 46.6201 167.456 46.8314C167.752 47.3923 167.902 48.0362 167.902 48.7433" fill="#E20025"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M184.321 42.5038C184.39 42.5715 184.422 42.6709 184.418 42.7973H184.419V45.0243H182.268V42.7576C182.268 42.5923 182.341 42.3945 182.685 42.3945H183.988C184.136 42.3945 184.248 42.4316 184.321 42.5038ZM182.134 49.6996C182.008 50.1732 181.793 50.6264 181.492 51.0543C181.392 51.1915 181.249 51.3568 181.059 51.5564C180.822 51.7849 180.633 51.9456 180.499 52.0341C179.721 52.5706 178.851 52.8424 177.913 52.8424C176.975 52.8424 176.105 52.5706 175.326 52.0332C175.193 51.9456 175.004 51.7849 174.769 51.5582C174.581 51.3604 174.435 51.1906 174.335 51.0552C173.82 50.3237 173.558 49.5199 173.558 48.6656V42.7711C173.558 42.605 173.486 42.4072 173.14 42.4072H171.837C171.688 42.4072 171.577 42.4442 171.503 42.5164C171.435 42.5851 171.403 42.6835 171.407 42.8081V48.7288C171.407 49.7349 171.669 50.7201 172.188 51.6584C172.354 51.9519 172.572 52.2635 172.838 52.5841C173.08 52.8839 173.396 53.191 173.776 53.498C173.992 53.6642 174.189 53.8033 174.361 53.9117C175.448 54.5845 176.643 54.9258 177.913 54.9258C179.183 54.9258 180.378 54.5845 181.465 53.9117C181.638 53.8033 181.828 53.6687 182.052 53.4971C182.431 53.1901 182.746 52.883 182.988 52.5841C183.255 52.2617 183.474 51.9501 183.639 51.6575C183.986 51.0235 184.218 50.3679 184.333 49.6996H182.134Z" fill="#E20025"/> +<path d="M201.143 49.8072H177.974V44.917H201.143V49.8081V49.8072ZM178.197 49.5923H200.92V45.1319H178.197V49.5923Z" fill="#E4212C"/> +<path d="M179.522 48.7638C179.495 48.7638 179.476 48.7457 179.476 48.7195V45.8206C179.476 45.7944 179.495 45.7764 179.522 45.7764H180.727C181.402 45.7764 181.808 46.1674 181.808 46.7382C181.808 47.3089 181.397 47.6954 180.727 47.6954H180.174C180.156 47.6954 180.147 47.7045 180.147 47.7225V48.7186C180.147 48.7448 180.128 48.7629 180.101 48.7629H179.521L179.522 48.7638ZM181.137 46.74C181.137 46.4979 180.968 46.3354 180.686 46.3354H180.174C180.156 46.3354 180.147 46.3444 180.147 46.3616V47.1129C180.147 47.1301 180.156 47.1391 180.174 47.1391H180.686C180.968 47.1391 181.137 46.9811 181.137 46.74Z" fill="#E4212C"/> +<path d="M182.224 47.6667V45.8226C182.224 45.7964 182.242 45.7783 182.27 45.7783H182.85C182.877 45.7783 182.896 45.7964 182.896 45.8226V47.6847C182.896 48.0406 183.101 48.2429 183.417 48.2429C183.732 48.2429 183.932 48.0406 183.932 47.6847V45.8226C183.932 45.7964 183.951 45.7783 183.978 45.7783H184.557C184.585 45.7783 184.603 45.7964 184.603 45.8226V47.6667C184.603 48.409 184.11 48.8127 183.417 48.8127C182.723 48.8127 182.225 48.409 182.225 47.6667H182.224Z" fill="#E4212C"/> +<path d="M185.183 45.8216C185.183 45.7954 185.202 45.7773 185.229 45.7773H186.439C187.114 45.7773 187.43 46.0979 187.43 46.5721C187.43 46.8972 187.275 47.0995 187.069 47.2096V47.2187C187.275 47.2936 187.484 47.5393 187.484 47.8951C187.484 48.4839 187.078 48.7648 186.406 48.7648H185.229C185.202 48.7648 185.183 48.7467 185.183 48.7205V45.8216ZM186.357 46.9992C186.613 46.9992 186.763 46.8674 186.763 46.6479C186.763 46.4285 186.613 46.3011 186.357 46.3011H185.883C185.864 46.3011 185.856 46.3102 185.856 46.3273V46.973C185.856 46.9902 185.865 46.9992 185.883 46.9992H186.357ZM185.883 48.2419H186.394C186.668 48.2419 186.814 48.101 186.814 47.8689C186.814 47.6368 186.667 47.4959 186.394 47.4959H185.883C185.864 47.4959 185.856 47.505 185.856 47.5221V48.2166C185.856 48.2338 185.865 48.2428 185.883 48.2428V48.2419Z" fill="#E4212C"/> +<path d="M187.969 45.8216C187.969 45.7954 187.988 45.7773 188.015 45.7773H188.595C188.623 45.7773 188.641 45.7954 188.641 45.8216V48.1624C188.641 48.1805 188.651 48.1886 188.669 48.1886H190.038C190.065 48.1886 190.084 48.2067 190.084 48.2328V48.7205C190.084 48.7467 190.065 48.7648 190.038 48.7648H188.016C187.989 48.7648 187.97 48.7467 187.97 48.7205V45.8216H187.969Z" fill="#E4212C"/> +<path d="M190.48 45.8216C190.48 45.7954 190.499 45.7773 190.526 45.7773H191.107C191.134 45.7773 191.153 45.7954 191.153 45.8216V48.7205C191.153 48.7467 191.134 48.7648 191.107 48.7648H190.526C190.499 48.7648 190.48 48.7467 190.48 48.7205V45.8216Z" fill="#E4212C"/> +<path d="M193.897 48.9787C193.878 48.9968 193.851 49.0004 193.828 48.9787L193.513 48.6753C193.33 48.7629 193.116 48.8117 192.883 48.8117C192.34 48.8117 191.911 48.5705 191.751 48.0874C191.683 47.8806 191.665 47.7144 191.665 47.2701C191.665 46.8258 191.683 46.6596 191.751 46.4528C191.911 45.9696 192.34 45.7285 192.883 45.7285C193.426 45.7285 193.851 45.9705 194.015 46.4528C194.083 46.6596 194.102 46.8258 194.102 47.2701C194.102 47.7144 194.083 47.8806 194.015 48.0874C193.992 48.1533 193.965 48.2102 193.937 48.268L194.261 48.5751C194.28 48.5931 194.28 48.6193 194.261 48.6365L193.897 48.9787ZM193.047 48.2283L192.851 48.0395C192.832 48.0215 192.829 47.9998 192.851 47.9781L193.216 47.6449C193.243 47.6232 193.266 47.6268 193.284 47.6449L193.407 47.7632C193.421 47.662 193.426 47.513 193.426 47.271C193.426 46.8809 193.412 46.7309 193.376 46.6262C193.307 46.4194 193.138 46.2966 192.883 46.2966C192.628 46.2966 192.458 46.4194 192.39 46.6262C192.354 46.7309 192.34 46.8809 192.34 47.271C192.34 47.6611 192.354 47.811 192.39 47.9167C192.458 48.1235 192.627 48.2463 192.883 48.2463C192.942 48.2463 192.998 48.2418 193.047 48.2283Z" fill="#E4212C"/> +<path d="M194.601 47.6667V45.8226C194.601 45.7964 194.619 45.7783 194.647 45.7783H195.226C195.253 45.7783 195.272 45.7964 195.272 45.8226V47.6847C195.272 48.0406 195.478 48.2429 195.793 48.2429C196.108 48.2429 196.308 48.0406 196.308 47.6847V45.8226C196.308 45.7964 196.326 45.7783 196.354 45.7783H196.933C196.961 45.7783 196.979 45.7964 196.979 45.8226V47.6667C196.979 48.409 196.487 48.8127 195.793 48.8127C195.099 48.8127 194.602 48.409 194.602 47.6667H194.601Z" fill="#E4212C"/> +<path d="M197.561 45.8216C197.561 45.7954 197.579 45.7773 197.607 45.7773H199.597C199.624 45.7773 199.643 45.7954 199.643 45.8216V46.2912C199.643 46.3183 199.624 46.3355 199.597 46.3355H198.259C198.24 46.3355 198.232 46.3445 198.232 46.3616V46.955C198.232 46.973 198.241 46.9812 198.259 46.9812H199.373C199.4 46.9812 199.418 46.9992 199.418 47.0254V47.4914C199.418 47.5176 199.4 47.5357 199.373 47.5357H198.259C198.24 47.5357 198.232 47.5447 198.232 47.5619V48.1805C198.232 48.1985 198.241 48.2067 198.259 48.2067H199.597C199.624 48.2067 199.643 48.2247 199.643 48.2509V48.7205C199.643 48.7467 199.624 48.7648 199.597 48.7648H197.607C197.579 48.7648 197.561 48.7467 197.561 48.7205V45.8216Z" fill="#E4212C"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M188.177 86C192.818 94.2213 195.697 103.387 196.553 112.912C197.9 127.919 194.144 142.942 185.892 155.548C177.643 168.152 165.384 177.603 151.097 182.375C147.902 183.347 139.667 184.868 121.422 184.992L126.071 180.343C126.462 179.953 126.462 179.319 126.071 178.929C125.681 178.538 125.047 178.538 124.657 178.929L118.293 185.293C117.902 185.683 117.902 186.317 118.293 186.707L124.657 193.071C125.047 193.462 125.681 193.462 126.071 193.071C126.462 192.681 126.462 192.047 126.071 191.657L121.406 186.992C139.762 186.869 148.23 185.34 151.693 184.284L151.705 184.28L151.718 184.276C166.437 179.363 179.068 169.627 187.566 156.644C196.064 143.66 199.932 128.189 198.545 112.734C197.698 103.301 194.924 94.2119 190.463 86H188.177Z" fill="#A0A0A0"/> <defs> -<linearGradient id="paint0_linear_11182_69405" x1="57.1095" y1="130.707" x2="57.1095" y2="203.241" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint0_linear_115_37049" x1="57.1092" y1="130.708" x2="57.1092" y2="203.241" gradientUnits="userSpaceOnUse"> <stop stop-color="#323339"/> <stop offset="1" stop-color="#25262B"/> </linearGradient> diff --git a/src/components/Analysis/AnalysisErrorModal.tsx b/src/components/Analysis/AnalysisErrorModal.tsx index b83f392cc47e95dddae6ad5b8769952397c32d69..561e0e0e284e646bfce0cd6087d14531abe556d8 100644 --- a/src/components/Analysis/AnalysisErrorModal.tsx +++ b/src/components/Analysis/AnalysisErrorModal.tsx @@ -1,9 +1,9 @@ -import React from 'react' +import Button from '@material-ui/core/Button' +import Dialog from '@material-ui/core/Dialog' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import React from 'react' import { useHistory } from 'react-router-dom' -import Button from '@material-ui/core/Button' import './analysisError.scss' -import Dialog from '@material-ui/core/Dialog' const AnalysisErrorModal: React.FC = () => { const { t } = useI18n() @@ -32,15 +32,15 @@ const AnalysisErrorModal: React.FC = () => { <div id={'accessibility-title'}> {t('analysis_error_modal.accessibility.window_title')} </div> - <div className="em-root analyis-error-container"> + <div className="em-root analysis-error-container"> <div className="em-content"> - <div className="analyis-error-title text-20-bold"> + <div className="analysis-error-title text-20-bold"> {t('analysis_error_modal.title')} </div> - <div className="analyis-error-message text-16-normal"> + <div className="analysis-error-message text-16-normal"> {t('analysis_error_modal.message')} </div> - <div className="analyis-error-button"> + <div className="analysis-error-button"> <Button aria-label={t( 'analysis_error_modal.accessibility.button_go_back' diff --git a/src/components/Analysis/analysisError.scss b/src/components/Analysis/analysisError.scss index 94328619c599f47e6202ecfbab2978c04638f1fa..20fe6495e9c43389f0307b1071a18210eba3eabd 100644 --- a/src/components/Analysis/analysisError.scss +++ b/src/components/Analysis/analysisError.scss @@ -9,20 +9,22 @@ } } -.analyis-error-container { +.analysis-error-container { border-radius: 4px; margin-bottom: 1rem; color: $grey-bright; text-align: center; - .analyis-error-title { + .analysis-error-title { color: $gold-shadow; margin-bottom: 2rem; } - .analyis-error-button { + .analysis-error-button { display: flex; justify-content: space-between; + gap: 1rem; margin-top: 2rem; button { + margin: 0; &.btn-highlight, &.btn-secondary-positive { width: 45%; diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx index c3560ac13c6d4128400fe0df8daa087362691340..60740d100b40f11a1c9ea0ef2548fdf3b4922d45 100644 --- a/src/components/Connection/ConnectionResult.tsx +++ b/src/components/Connection/ConnectionResult.tsx @@ -4,7 +4,7 @@ import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import Loader from 'components/Loader/Loader' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidType } from 'enum/fluid.enum' import { DateTime } from 'luxon' import { Account, @@ -169,14 +169,12 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ <div className="connection-update-result"> <div className={ - status === 'errored' && - !hasUpdatedToday() && - fluidStatus.status !== FluidState.PARTNER_ISSUE + status === 'errored' && !hasUpdatedToday() && !fluidStatus.maintenance ? 'connection-update-errored' : '' } > - {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( + {fluidStatus.maintenance ? ( // First check if there is partner error from backoffice <div className="connection-caption text-16-normal"> <div className="text-16-normal"> diff --git a/src/components/Connection/SGEConnect/SgeConnect.scss b/src/components/Connection/SGEConnect/SgeConnect.scss index 76ae66c9c6e904d690f278eabafe360df1836964..cc76bd39863df6426034ce80897757cbc033b146 100644 --- a/src/components/Connection/SGEConnect/SgeConnect.scss +++ b/src/components/Connection/SGEConnect/SgeConnect.scss @@ -45,7 +45,8 @@ padding: 0 0.5rem; &:focus, &:focus-visible { - outline: 1px solid $gold-shadow; + border: 1px solid $gold-shadow; + outline: none; } } /* Chrome, Safari, Edge, Opera */ @@ -59,12 +60,12 @@ -moz-appearance: textfield; } .pdl-hint { + display: inline-block; cursor: pointer; border-bottom: solid 1px $grey-bright; text-align: center; margin: 1rem auto auto; padding: 0.2rem; - width: 175px; @media (min-width: $width-tablet) { margin-left: 0; } diff --git a/src/components/Connection/SGEConnect/SgeConnectView.tsx b/src/components/Connection/SGEConnect/SgeConnectView.tsx index 0850fd8433fbfb87f2a491e02a44446cfbb480cf..4097240cce25b7bd4b5893985a8af81018003a7e 100644 --- a/src/components/Connection/SGEConnect/SgeConnectView.tsx +++ b/src/components/Connection/SGEConnect/SgeConnectView.tsx @@ -1,30 +1,41 @@ -import React, { useCallback, useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' -import CozyBar from 'components/Header/CozyBar' import Content from 'components/Content/Content' +import FormNavigation from 'components/FormGlobal/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' import { SgeStep } from 'enum/sgeStep.enum' -import StepIdentityAndPdl from './StepIdentityAndPdl' -import StepAddress from './StepAddress' -import StepConsent from './StepConsent' -import './SgeConnect.scss' -import FormNavigation from 'components/FormGlobal/FormNavigation' import { SgeStore } from 'models/sgeStore.model' +import React, { useCallback, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' import { updateSgeStore } from 'store/global/global.actions' -import FormProgress from 'components/FormGlobal/FormProgress' +import './SgeConnect.scss' +import StepAddress from './StepAddress' +import StepConsent from './StepConsent' +import StepIdentityAndPdl from './StepIdentityAndPdl' + +export type SGEKeysForm = + | 'firstName' + | 'lastName' + | 'pdl' + | 'address' + | 'zipCode' + | 'city' + | 'dataConsent' + | 'pdlConfirm' const SgeConnectView: React.FC = () => { const [headerHeight, setHeaderHeight] = useState<number>(0) const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) const dispatch = useDispatch() - const [currentStep, setcurrentStep] = useState<SgeStep>( + const [currentStep, setCurrentStep] = useState<SgeStep>( sgeConnect.currentStep ) - const [currentSgeState, setcurrentSgeState] = useState<SgeStore>(sgeConnect) + const [currentSgeState, setCurrentSgeState] = useState<SgeStore>(sgeConnect) const defineHeaderHeight = useCallback((height: number) => { setHeaderHeight(height) }, []) + const [isLoading, setIsLoading] = useState(false) const isNextValid = useCallback(() => { switch (currentStep) { @@ -61,41 +72,44 @@ const SgeConnectView: React.FC = () => { const handleNext = useCallback(() => { if (currentStep < SgeStep.Consent && isNextValid()) { - setcurrentStep(prev => prev + 1) + setCurrentStep(prev => prev + 1) dispatch(updateSgeStore(currentSgeState)) } - if (currentStep === SgeStep.Consent && isNextValid()) { + if (currentStep === SgeStep.Consent && isNextValid() && !isLoading) { + setIsLoading(true) const updatedState = { ...currentSgeState, + city: currentSgeState.city.trim(), shouldLaunchAccount: true, - // switch to false in case the form fails and the user have to give its consent again - dataConsent: false, - pdlConfirm: false, } - setcurrentSgeState(updatedState) + setCurrentSgeState(updatedState) dispatch(updateSgeStore(updatedState)) } - }, [currentSgeState, currentStep, dispatch, isNextValid]) + }, [currentSgeState, currentStep, dispatch, isNextValid, isLoading]) const handlePrev = useCallback(() => { if (currentStep !== SgeStep.IdentityAndPDL) { - setcurrentStep(prev => prev - 1) + setCurrentStep(prev => prev - 1) } dispatch(updateSgeStore(currentSgeState)) }, [currentSgeState, currentStep, dispatch]) const onChange = useCallback( - (objkey: string, value: string | boolean | number, maxLength?: number) => { + ( + key: SGEKeysForm, + value: string | boolean | number, + maxLength?: number + ) => { if ( - !maxLength || // optionnal ? + !maxLength || value === '' || (/[0-9]/.test(value.toString()) && value.toString().length <= maxLength) ) { const updatedState = { ...currentSgeState, - [objkey]: value, + [key]: value, } - setcurrentSgeState(updatedState) + setCurrentSgeState(updatedState) } }, [currentSgeState] @@ -133,7 +147,8 @@ const SgeConnectView: React.FC = () => { step={currentStep} handlePrevious={handlePrev} handleNext={handleNext} - disableNextButton={!isNextValid()} + isLoading={isLoading} + disableNextButton={!isNextValid() || isLoading} disablePrevButton={currentStep === SgeStep.IdentityAndPDL} isLastConnectStep={currentStep === SgeStep.Consent} isEcogesture={false} diff --git a/src/components/Connection/SGEConnect/SgeInit.spec.tsx b/src/components/Connection/SGEConnect/SgeInit.spec.tsx index 1b093367e95dd2fbfb4c4bc9534f9b85330b76dd..8755cca5bb3038b261b16375203bf7e596b27026 100644 --- a/src/components/Connection/SGEConnect/SgeInit.spec.tsx +++ b/src/components/Connection/SGEConnect/SgeInit.spec.tsx @@ -1,16 +1,17 @@ -import React from 'react' +import { Button } from '@material-ui/core' import { mount } from 'enzyme' -import configureStore from 'redux-mock-store' +import toJson from 'enzyme-to-json' +import { GlobalState } from 'models/global.model' +import React from 'react' import { Provider } from 'react-redux' -import SgeInit from './SgeInit' +import configureStore from 'redux-mock-store' import { fluidStatusData, - SgeStatusWithAccout, + SgeStatusWithAccount, } from '../../../../tests/__mocks__/fluidStatusData.mock' import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' -import toJson from 'enzyme-to-json' -import { Button } from '@material-ui/core' import { waitForComponentToPaint } from '../../../../tests/__mocks__/testUtils' +import SgeInit from './SgeInit' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -35,7 +36,7 @@ const mockUpdate = jest.fn() jest.mock('components/Hooks/useKonnectorAuth', () => jest.fn(() => [mockConnect, mockUpdate]) ) -const mockStore = configureStore([]) +const mockStore = configureStore<{ ecolyo: { global: GlobalState } }>([]) describe('SgeInit component', () => { it('should be rendered correctly', () => { @@ -70,7 +71,10 @@ describe('SgeInit component', () => { ecolyo: { global: { ...globalStateData, - sgeConnect: { shouldLaunchAccount: true }, + sgeConnect: { + ...globalStateData.sgeConnect, + shouldLaunchAccount: true, + }, }, }, }) @@ -88,13 +92,16 @@ describe('SgeInit component', () => { ecolyo: { global: { ...globalStateData, - sgeConnect: { shouldLaunchAccount: true }, + sgeConnect: { + ...globalStateData.sgeConnect, + shouldLaunchAccount: true, + }, }, }, }) const wrapper = mount( <Provider store={store}> - <SgeInit fluidStatus={SgeStatusWithAccout} /> + <SgeInit fluidStatus={SgeStatusWithAccount} /> </Provider> ) await waitForComponentToPaint(wrapper) diff --git a/src/components/Connection/SGEConnect/SgeInit.tsx b/src/components/Connection/SGEConnect/SgeInit.tsx index b2a55732edc70b0db64b6de7a96fa7502d4312b7..6cf6b71d6aa9bd30671109c483c966268de70f5f 100644 --- a/src/components/Connection/SGEConnect/SgeInit.tsx +++ b/src/components/Connection/SGEConnect/SgeInit.tsx @@ -1,18 +1,18 @@ -import React, { useEffect } from 'react' -import { Account, FluidStatus } from 'models' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { Button } from '@material-ui/core' -import { decoreText } from 'utils/decoreText' import ElectricityBillIcon from 'assets/icons/visu/partnerSteps/electricity_bill.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { useHistory } from 'react-router-dom' +import useKonnectorAuth from 'components/Hooks/useKonnectorAuth' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { Account, FluidStatus } from 'models' +import React, { useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' import { AppStore } from 'store' -import useKonnectorAuth from 'components/Hooks/useKonnectorAuth' import { setShouldRefreshConsent, updateSgeStore, } from 'store/global/global.actions' +import { decoreText } from 'utils/decoreText' interface SgeInitProps { fluidStatus: FluidStatus } diff --git a/src/components/Connection/SGEConnect/StepAddress.tsx b/src/components/Connection/SGEConnect/StepAddress.tsx index c5265592c3f82126e1332df5d3d8c2f3aab6a94a..73a405da655d1dd4033ad04e7ff0c9bb75a73518 100644 --- a/src/components/Connection/SGEConnect/StepAddress.tsx +++ b/src/components/Connection/SGEConnect/StepAddress.tsx @@ -1,10 +1,11 @@ -import React from 'react' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { SgeStore } from 'models/sgeStore.model' +import React from 'react' +import { SGEKeysForm } from './SgeConnectView' interface StepAddressProps { sgeState: SgeStore - onChange: (key: string, value: string, maxLength?: number) => void + onChange: (key: SGEKeysForm, value: string, maxLength?: number) => void } const StepAddress: React.FC<StepAddressProps> = ({ @@ -25,9 +26,7 @@ const StepAddress: React.FC<StepAddressProps> = ({ id="address" name="address" value={sgeState.address} - onChange={(e: React.ChangeEvent<HTMLInputElement>) => - onChange('address', e.target.value) - } + onChange={e => onChange('address', e.target.value)} /> <label htmlFor="zipCode" className="text-16-normal"> {t('auth.enedissgegrandlyon.zipCode')} @@ -38,9 +37,7 @@ const StepAddress: React.FC<StepAddressProps> = ({ id="zipCode" name="zipCode" value={sgeState.zipCode !== null ? sgeState.zipCode : undefined} - onChange={(e: React.ChangeEvent<HTMLInputElement>) => - onChange('zipCode', e.target.value, 5) - } + onChange={e => onChange('zipCode', e.target.value, 5)} /> <label htmlFor="city" className="text-16-normal"> @@ -51,9 +48,7 @@ const StepAddress: React.FC<StepAddressProps> = ({ id="city" name="city" value={sgeState.city} - onChange={(e: React.ChangeEvent<HTMLInputElement>) => - onChange('city', e.target.value) - } + onChange={e => onChange('city', e.target.value)} /> </div> ) diff --git a/src/components/Connection/SGEConnect/StepConsent.spec.tsx b/src/components/Connection/SGEConnect/StepConsent.spec.tsx index 985082b68f6aeea772e9df4dd723cb85fac38d72..09498f8b583a532e2bb823c9fc3a20ffcdf7bb3a 100644 --- a/src/components/Connection/SGEConnect/StepConsent.spec.tsx +++ b/src/components/Connection/SGEConnect/StepConsent.spec.tsx @@ -1,9 +1,10 @@ -import React from 'react' import { mount } from 'enzyme' -import configureStore from 'redux-mock-store' +import toJson from 'enzyme-to-json' +import { GlobalState } from 'models/global.model' +import React from 'react' import { Provider } from 'react-redux' +import configureStore from 'redux-mock-store' import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' -import toJson from 'enzyme-to-json' import StepConsent from './StepConsent' jest.mock('cozy-ui/transpiled/react/I18n', () => { @@ -15,7 +16,7 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) -const mockStore = configureStore([]) +const mockStore = configureStore<{ ecolyo: { global: GlobalState } }>([]) describe('StepConsent component', () => { it('should be rendered correctly', () => { diff --git a/src/components/Connection/SGEConnect/StepConsent.tsx b/src/components/Connection/SGEConnect/StepConsent.tsx index 53c09677e9f12f52c421d59aa9793266103416dc..f3e6bbac2049c0683ad1d1515c860b2f6a262b63 100644 --- a/src/components/Connection/SGEConnect/StepConsent.tsx +++ b/src/components/Connection/SGEConnect/StepConsent.tsx @@ -1,12 +1,13 @@ -import React from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { decoreText } from 'utils/decoreText' import classNames from 'classnames' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { SgeStore } from 'models/sgeStore.model' +import React from 'react' +import { decoreText } from 'utils/decoreText' +import { SGEKeysForm } from './SgeConnectView' interface StepConsentProps { sgeState: SgeStore - onChange: (key: string, value: boolean, maxLength?: number) => void + onChange: (key: SGEKeysForm, value: boolean) => void } const StepConsent: React.FC<StepConsentProps> = ({ sgeState, diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx index e545c2b98c080839c01abc5537c179fb8a6c9776..eebeb80f914f49dc01c5055fe3ab19c8c4bdedbf 100644 --- a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx @@ -1,11 +1,16 @@ -import React, { useCallback, useState } from 'react' +import SgeModalHint from 'components/Connection/SGEConnect/SgeModalHint' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { SgeStore } from 'models/sgeStore.model' -import SgeModalHint from 'components/Connection/SGEConnect/SgeModalHint' +import React, { useCallback, useState } from 'react' +import { SGEKeysForm } from './SgeConnectView' interface StepIdentityAndPdlProps { sgeState: SgeStore - onChange: (key: string, value: string | number, maxLength?: number) => void + onChange: ( + key: SGEKeysForm, + value: string | number, + maxLength?: number + ) => void } const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ @@ -13,9 +18,9 @@ const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ onChange, }: StepIdentityAndPdlProps) => { const { t } = useI18n() - const [openHintModal, setopenHintModal] = useState<boolean>(false) + const [openHintModal, setOpenHintModal] = useState<boolean>(false) const toggleModal = useCallback(() => { - setopenHintModal(prev => !prev) + setOpenHintModal(prev => !prev) }, []) return ( @@ -31,9 +36,7 @@ const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ id="firstName" name="firstName" value={sgeState.firstName} - onChange={(e: React.ChangeEvent<HTMLInputElement>) => - onChange('firstName', e.target.value) - } + onChange={e => onChange('firstName', e.target.value)} required /> <label htmlFor="lastName" className="text-16-normal"> @@ -44,9 +47,7 @@ const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ id="lastName" name="lastName" value={sgeState.lastName} - onChange={(e: React.ChangeEvent<HTMLInputElement>) => - onChange('lastName', e.target.value) - } + onChange={e => onChange('lastName', e.target.value)} required /> <div className="title text-22-bold"> @@ -61,12 +62,11 @@ const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ type="number" min={0} value={sgeState.pdl ? sgeState.pdl : undefined} - onChange={(e: React.ChangeEvent<HTMLInputElement>) => - onChange('pdl', e.target.value, 14) - } + onChange={e => onChange('pdl', e.target.value, 14)} inputMode="numeric" required /> + <br /> <div onClick={toggleModal} className="pdl-hint text-16-normal"> {t('auth.enedissgegrandlyon.pdlHint')} </div> diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap index 4875200e3e8dde4ff5b23bb5a359017cb8c41d57..f942fe39679b7581059f24af1d030026f0da57ff 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap @@ -642,6 +642,7 @@ exports[`SgeConnectView component should be rendered correctly 1`] = ` "dataConsent": false, "firstName": "", "lastName": "", + "openSGEForm": false, "pdl": null, "pdlConfirm": false, "shouldLaunchAccount": false, @@ -705,6 +706,7 @@ exports[`SgeConnectView component should be rendered correctly 1`] = ` required={true} type="number" /> + <br /> <div className="pdl-hint text-16-normal" onClick={[Function]} @@ -1095,6 +1097,7 @@ exports[`SgeConnectView component should be rendered correctly 1`] = ` handlePrevious={[Function]} isEcogesture={false} isLastConnectStep={false} + isLoading={false} step={0} > <div diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap index bffbbf9d0daf4c604fe6515786a9fa9d54a83c71..26812fdf7014e4a971b43a489b87dcd3202f7ece 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap @@ -23,6 +23,7 @@ exports[`StepAddress component should be rendered correctly 1`] = ` "dataConsent": false, "firstName": "", "lastName": "", + "openSGEForm": false, "pdl": null, "pdlConfirm": false, "shouldLaunchAccount": false, diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap index f5fd68d492c79666b431eae5ce7719273b7005d1..b377c4e67e55737300f2a633b16de3503e32ade0 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap @@ -23,6 +23,7 @@ exports[`StepConsent component should be rendered correctly 1`] = ` "dataConsent": false, "firstName": "", "lastName": "", + "openSGEForm": false, "pdl": null, "pdlConfirm": false, "shouldLaunchAccount": false, diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap index e5fd436186347e2a50eaf39f652ef27a388c17ae..d02da53ca004a9588d0971dfa7199fd70a289efc 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap @@ -23,6 +23,7 @@ exports[`StepIdentityAndPdl component should be rendered correctly 1`] = ` "dataConsent": false, "firstName": "", "lastName": "", + "openSGEForm": false, "pdl": null, "pdlConfirm": false, "shouldLaunchAccount": false, @@ -86,6 +87,7 @@ exports[`StepIdentityAndPdl component should be rendered correctly 1`] = ` required={true} type="number" /> + <br /> <div className="pdl-hint text-16-normal" onClick={[Function]} diff --git a/src/components/CustomPopup/CustomPopupModal.tsx b/src/components/CustomPopup/CustomPopupModal.tsx index 8e1d402d506314ea7fb28d9dae128e4fd7431e12..030ed9371a446b6451fc4c2726a6321e73b0db37 100644 --- a/src/components/CustomPopup/CustomPopupModal.tsx +++ b/src/components/CustomPopup/CustomPopupModal.tsx @@ -64,7 +64,7 @@ const CustomPopupModal: React.FC<CustomPopupModalProps> = ({ label: 'text-16-bold', }} > - {t('consumption.partners_issue_modal.ok')} + {t('consumption.partner_issue_modal.ok')} </Button> </div> </Dialog> diff --git a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap index bb492567614e5d308210feb46a05d3790acd9f93..763abb2f2d90f65a61f92aa5db07d8850cae1a1f 100644 --- a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap +++ b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap @@ -476,7 +476,7 @@ exports[`CustomPopupModal component should render correctly 1`] = ` <span class="MuiButton-label text-16-bold" > - consumption.partners_issue_modal.ok + consumption.partner_issue_modal.ok </span> <span class="MuiTouchRipple-root" @@ -962,7 +962,7 @@ exports[`CustomPopupModal component should render correctly 1`] = ` <span className="MuiButton-label text-16-bold" > - consumption.partners_issue_modal.ok + consumption.partner_issue_modal.ok </span> <WithStyles(memo) center={false} diff --git a/src/components/FormGlobal/FormNavigation.tsx b/src/components/FormGlobal/FormNavigation.tsx index d2711c30bb04c4f18c8360ea7e55836d582aa1fc..8a8bbf29b561d5500cad58918bf3f5bdbbb58902 100644 --- a/src/components/FormGlobal/FormNavigation.tsx +++ b/src/components/FormGlobal/FormNavigation.tsx @@ -1,11 +1,11 @@ -import React from 'react' -import 'components/FormGlobal/formNavigation.scss' +import Button from '@material-ui/core/Button' import classNames from 'classnames' +import 'components/FormGlobal/formNavigation.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import Button from '@material-ui/core/Button' -import { ProfileTypeStepForm } from 'enum/profileType.enum' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' +import { ProfileTypeStepForm } from 'enum/profileType.enum' import { SgeStep } from 'enum/sgeStep.enum' +import React, { useCallback } from 'react' import { useHistory } from 'react-router-dom' interface FormNavigationProps { @@ -16,6 +16,7 @@ interface FormNavigationProps { disablePrevButton?: boolean isEcogesture?: boolean isLastConnectStep?: boolean + isLoading?: boolean } const FormNavigation: React.FC<FormNavigationProps> = ({ @@ -26,6 +27,7 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ disablePrevButton, isEcogesture, isLastConnectStep, + isLoading, }: FormNavigationProps) => { const { t } = useI18n() const history = useHistory() @@ -40,6 +42,20 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ } } + const getSecondButtonLabel = useCallback(() => { + if (isLoading) { + return t('profile_type.form.button_loading') + } else if ( + isLastConnectStep || + step === ProfileTypeStepForm.UPDATE_DATE || + (step === EcogestureStepForm.EQUIPMENTS && isEcogesture) + ) { + return t('profile_type.form.button_end') + } else { + return `${t('profile_type.form.button_next')} >` + } + }, [isEcogesture, isLastConnectStep, isLoading, step, t]) + return ( <div className="profile-navigation"> <Button @@ -73,11 +89,7 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ label: 'text-16-bold', }} > - {step === ProfileTypeStepForm.UPDATE_DATE || - isLastConnectStep || - (step === EcogestureStepForm.EQUIPMENTS && isEcogesture) - ? t('profile_type.form.button_end') - : `${t('profile_type.form.button_next')} >`} + {getSecondButtonLabel()} </Button> </div> ) diff --git a/src/components/Home/ConsumptionView.spec.tsx b/src/components/Home/ConsumptionView.spec.tsx index 9aae9a9603d0c59ee157bfc52692b83b9c014375..70fd20ef2754ecc0ba5ad327de48470c77503f11 100644 --- a/src/components/Home/ConsumptionView.spec.tsx +++ b/src/components/Home/ConsumptionView.spec.tsx @@ -2,10 +2,11 @@ import Loader from 'components/Loader/Loader' import { FluidState, FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import { mount } from 'enzyme' -import { FluidStatus } from 'models' +import { ChartState, FluidStatus, GlobalState } from 'models' import React from 'react' import * as reactRedux from 'react-redux' import { Provider } from 'react-redux' +import { MockStoreEnhanced } from 'redux-mock-store' import * as chartActions from 'store/chart/chart.actions' import { mockTestProfile1 } from '../../../tests/__mocks__/profileType.mock' import { @@ -47,19 +48,36 @@ jest.mock( () => 'mock-konnectorviewercard' ) jest.mock( - 'components/PartnersIssue/PartnersIssueModal', - () => 'mock-partnersissuemodal' + 'components/PartnerIssue/PartnerIssueModal', + () => 'mock-partnerissuemodal' ) jest.mock('components/CustomPopup/CustomPopupModal', () => 'mock-custompopup') jest.mock('components/Home/ReleaseNotesModal', () => 'mock-releasenotes') +jest.mock( + 'components/Connection/SGEConnect/SgeConnectView', + () => 'mock-SgeConnectView' +) const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') const setCurrentTimeStepSpy = jest.spyOn(chartActions, 'setCurrentTimeStep') +const mockedPartnersIssueModal = { + enedis: false, + egl: false, + grdf: false, +} + describe('ConsumptionView component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let store: any + let store: MockStoreEnhanced< + { + ecolyo: { + global: GlobalState + chart?: ChartState + } + }, + {} + > beforeEach(() => { store = createMockStore(mockInitialEcolyoState) useDispatchSpy.mockClear() @@ -71,10 +89,14 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus mockFluidStatus[FluidType.ELECTRICITY].status = FluidState.DONE useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: false, - fluidStatus: mockFluidStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: mockFluidStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }, }) const wrapper = mount( <Provider store={store}> @@ -94,10 +116,14 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus mockFluidStatus[FluidType.ELECTRICITY].status = FluidState.DONE useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: mockFluidStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: mockFluidStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }, }) const wrapper = mount( <Provider store={store}> @@ -112,10 +138,14 @@ describe('ConsumptionView component', () => { it('should set CurrentTimeStep to WEEK when fluid != ELECTRICITY and timeStep = HALF_AN_HOUR', () => { useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.HALF_AN_HOUR, - loading: true, - fluidStatus: mockInitialEcolyoState.global.fluidStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.HALF_AN_HOUR, + loading: true, + }, + global: { + fluidStatus: mockInitialEcolyoState.global.fluidStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }, }) mount( <Provider store={store}> @@ -128,10 +158,15 @@ describe('ConsumptionView component', () => { it('should render konnector list when no fluid is connected', () => { useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: mockInitialEcolyoState.global.fluidStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: [], + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }, + fluidStatus: [], }) const wrapper = mount( <Provider store={store}> @@ -146,10 +181,15 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus updatedStatus[1].status = FluidState.DONE useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }, fluidStatus: updatedStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, }) const wrapper = mount( <Provider store={store}> @@ -164,10 +204,14 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus updatedStatus[0].status = FluidState.DONE useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: updatedStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }, }) const wrapper = mount( <Provider store={store}> @@ -177,15 +221,22 @@ describe('ConsumptionView component', () => { expect(wrapper.find('.consumptionview-content').exists()).toBeTruthy() expect(wrapper.find('mock-consumptiondetails').exists()).toBeTruthy() }) + + // todo describe and add multiple fluids ? it('should render partner issue Modal', async () => { const updatedStatus: FluidStatus[] = mockInitialEcolyoState.global.fluidStatus updatedStatus[0] = mockExpiredElec useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: updatedStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + openPartnersIssueModal: { ...mockedPartnersIssueModal, egl: true }, + }, }) useDispatchSpy.mockReturnValue(jest.fn()) mockUpdateProfile.mockResolvedValue(mockTestProfile1) @@ -194,23 +245,27 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.ELECTRICITY} /> </Provider> ) - expect(wrapper.find('mock-partnersissuemodal').exists()).toBeTruthy() + expect(wrapper.find('mock-partnerissuemodal').exists()).toBeTruthy() }) it('should show expired modal when a GRDF consent is expired', () => { const updatedStatus: FluidStatus[] = mockInitialEcolyoState.global.fluidStatus updatedStatus[0] = mockExpiredGas useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: updatedStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + openPartnersIssueModal: false, + }, }) useDispatchSpy.mockReturnValue(jest.fn()) const wrapper = mount( <Provider store={store}> - <ConsumptionView fluidType={FluidType.MULTIFLUID} /> + <ConsumptionView fluidType={FluidType.GAS} /> </Provider> ) expect(wrapper.find('.title').text()).toBe('consent_outdated.title.2') @@ -220,15 +275,20 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus updatedStatus[0] = mockExpiredElec useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: updatedStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + openPartnersIssueModal: mockedPartnersIssueModal, + }, }) useDispatchSpy.mockReturnValue(jest.fn()) const wrapper = mount( <Provider store={store}> - <ConsumptionView fluidType={FluidType.MULTIFLUID} /> + <ConsumptionView fluidType={FluidType.ELECTRICITY} /> </Provider> ) @@ -239,10 +299,15 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus updatedStatus[0] = mockExpiredElec useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: updatedStatus, - releaseNotes: mockInitialEcolyoState.global.releaseNotes, + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + openPartnersIssueModal: mockedPartnersIssueModal, + }, }) useDispatchSpy.mockReturnValue(jest.fn()) mockUpdateProfile.mockResolvedValue(mockTestProfile1) @@ -258,13 +323,19 @@ describe('ConsumptionView component', () => { mockInitialEcolyoState.global.fluidStatus updatedStatus[0] = mockExpiredElec useSelectorSpy.mockReturnValue({ - currentTimeStep: TimeStep.WEEK, - loading: true, - fluidStatus: updatedStatus, - releaseNotes: { - show: true, - notes: [{ description: 'description', title: 'title' }], + chart: { + currentTimeStep: TimeStep.WEEK, + loading: true, + }, + global: { + fluidStatus: updatedStatus, + openPartnersIssueModal: mockedPartnersIssueModal, + releaseNotes: { + show: true, + notes: [{ description: 'description', title: 'title' }], + }, }, + openPartnersIssueModal: mockedPartnersIssueModal, }) useDispatchSpy.mockReturnValue(jest.fn()) mockUpdateProfile.mockResolvedValue(mockTestProfile1) diff --git a/src/components/Home/ConsumptionView.tsx b/src/components/Home/ConsumptionView.tsx index ae00f24586dd6041ec9c2c7e05c11380cefe1ec2..c16b6ce740a524f091fd55dd4262b36371344efb 100644 --- a/src/components/Home/ConsumptionView.tsx +++ b/src/components/Home/ConsumptionView.tsx @@ -1,10 +1,3 @@ -import { FluidType } from 'enum/fluid.enum' -import { TimeStep } from 'enum/timeStep.enum' -import React, { useCallback, useEffect, useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' -import './consumptionView.scss' - import classNames from 'classnames' import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal' import Content from 'components/Content/Content' @@ -18,10 +11,15 @@ import FluidButtons from 'components/Home/FluidButtons' import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard' import KonnectorViewerList from 'components/Konnector/KonnectorViewerList' import Loader from 'components/Loader/Loader' -import PartnersIssueModal from 'components/PartnersIssue/PartnersIssueModal' +import PartnerIssueModal from 'components/PartnerIssue/PartnerIssueModal' import { useClient } from 'cozy-client' +import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' +import React, { useCallback, useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' import { useHistory } from 'react-router-dom' import ProfileService from 'services/profile.service' +import { AppStore } from 'store' import { setCurrentTimeStep, setLoading } from 'store/chart/chart.actions' import { setCustomPopup, @@ -33,7 +31,9 @@ import { getTodayDate, isKonnectorActive, } from 'utils/utils' +import './consumptionView.scss' import ReleaseNotesModal from './ReleaseNotesModal' + interface ConsumptionViewProps { fluidType: FluidType } @@ -44,15 +44,15 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ const client = useClient() const dispatch = useDispatch() const isMulti = fluidType !== FluidType.MULTIFLUID - const { currentTimeStep, loading } = useSelector( - (state: AppStore) => state.ecolyo.chart - ) const { - fluidStatus, - releaseNotes, - customPopupModal, - openPartnersIssueModal, - } = useSelector((state: AppStore) => state.ecolyo.global) + chart: { currentTimeStep, loading }, + global: { + fluidStatus, + releaseNotes, + customPopupModal, + openPartnersIssueModal, + }, + } = useSelector((state: AppStore) => state.ecolyo) const [isFluidKonnected, setIsFluidKonnected] = useState<boolean>(false) const [openReleaseNoteModal, setOpenReleaseNoteModal] = useState<boolean>( @@ -61,13 +61,13 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ const [headerHeight, setHeaderHeight] = useState<number>(0) const [active, setActive] = useState<boolean>(false) - const [openExpiredConsentModal, setopenExpiredConsentModal] = + const [openExpiredConsentModal, setOpenExpiredConsentModal] = useState<boolean>(true) - const [consentExpiredFluids, setconsentExpiredFluids] = useState<FluidType[]>( + const [consentExpiredFluids, setConsentExpiredFluids] = useState<FluidType[]>( [] ) - const updatekey = + const updateKey = fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate ? `${fluidStatus[fluidType].lastDataDate!.toLocaleString()} + ${ fluidStatus[fluidType].status + fluidType @@ -92,15 +92,42 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ } }, [dispatch, history, releaseNotes.notes, releaseNotes.redirectLink]) - const handleCloseModal = useCallback(async () => { - const profileService = new ProfileService(client) - const updatedProfile = await profileService.updateProfile({ - partnersIssueDate: getTodayDate(), - }) - if (updatedProfile) { - dispatch(setPartnersIssue(false)) + const getPartnerKey = (fluidType: FluidType): 'enedis' | 'egl' | 'grdf' => { + switch (fluidType) { + case FluidType.ELECTRICITY: + return 'enedis' + case FluidType.WATER: + return 'egl' + case FluidType.GAS: + return 'grdf' + default: + throw new Error('unknown fluidtype') } - }, [client, dispatch]) + } + + const handleClosePartnerIssueModal = useCallback( + async (fluidType: FluidType) => { + const profileService = new ProfileService(client) + const profileValues = await profileService.getProfile() + if (profileValues) { + const updatedProfile = await profileService.updateProfile({ + partnersIssueSeenDate: { + ...profileValues.partnersIssueSeenDate, + [getPartnerKey(fluidType)]: getTodayDate(), + }, + }) + if (updatedProfile) { + dispatch( + setPartnersIssue({ + ...openPartnersIssueModal, + [getPartnerKey(fluidType)]: false, + }) + ) + } + } + }, + [client, dispatch, openPartnersIssueModal] + ) const handleCloseCustomPopupModal = async () => { const profileService = new ProfileService(client) @@ -142,7 +169,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ } } - if (subscribed) setconsentExpiredFluids(expiredConsents) + if (subscribed) setConsentExpiredFluids(expiredConsents) return () => { subscribed = false } @@ -155,7 +182,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ <DateNavigator /> </Header> <Content height={headerHeight}> - <FluidButtons activeFluid={fluidType} key={updatekey} /> + <FluidButtons activeFluid={fluidType} key={updateKey} /> {openReleaseNoteModal && ( <ReleaseNotesModal @@ -213,25 +240,31 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ </div> )} </Content> - - <PartnersIssueModal - open={openPartnersIssueModal} - fluidStatus={fluidStatus} - handleCloseClick={handleCloseModal} - /> + {/* Partner issue modals for individual fluids */} + {fluidStatus + .filter(fluid => fluid.maintenance) + .filter(fluid => fluid.fluidType === fluidType) + .map(issuedFluid => ( + <PartnerIssueModal + key={issuedFluid.fluidType} + issuedFluid={issuedFluid} + open={openPartnersIssueModal[getPartnerKey(issuedFluid.fluidType)]} + handleCloseClick={handleClosePartnerIssueModal} + /> + ))} <CustomPopupModal customPopup={customPopupModal} handleCloseClick={handleCloseCustomPopupModal} /> - {consentExpiredFluids.length && + {Boolean(consentExpiredFluids.length) && consentExpiredFluids.map(fluid => { return ( <ExpiredConsentModal key={fluid} open={openExpiredConsentModal} - handleCloseClick={() => setopenExpiredConsentModal(false)} + handleCloseClick={() => setOpenExpiredConsentModal(false)} fluidType={fluid} - toggleModal={() => setopenExpiredConsentModal(prev => !prev)} + toggleModal={() => setOpenExpiredConsentModal(prev => !prev)} /> ) })} diff --git a/src/components/Home/FluidButton.tsx b/src/components/Home/FluidButton.tsx index bd1cc74ad471cf7713147a85c80d764316cc3744..73aee6c00d8ee731f892d15d43770d7a24991ed8 100644 --- a/src/components/Home/FluidButton.tsx +++ b/src/components/Home/FluidButton.tsx @@ -1,19 +1,18 @@ -import React, { useCallback, useEffect, useState } from 'react' +import ErrorNotif from 'assets/icons/ico/notif_error.svg' +import PartnerIssueNotif from 'assets/icons/ico/notif_maintenance.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' - import { FluidState, FluidType } from 'enum/fluid.enum' -import { getNavPicto } from 'utils/picto' -import { useHistory } from 'react-router' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { UsageEventType } from 'enum/usageEvent.enum' -import UsageEventService from 'services/usageEvent.service' -import { useClient } from 'cozy-client' +import React, { useCallback, useEffect, useState } from 'react' import { useSelector } from 'react-redux' +import { useHistory } from 'react-router' +import DateChartService from 'services/dateChart.service' +import UsageEventService from 'services/usageEvent.service' import { AppStore } from 'store' +import { getNavPicto } from 'utils/picto' import { isKonnectorActive } from 'utils/utils' -import ErrorNotif from 'assets/icons/ico/notif_error.svg' -import PartnerIssueNotif from 'assets/icons/ico/notif_maintenance.svg' -import DateChartService from 'services/dateChart.service' interface FluidButtonProps { fluidType: FluidType @@ -71,12 +70,7 @@ const FluidButton: React.FC<FluidButtonProps> = ({ ) }, [history, fluidType, client]) - const serviceIsDown = () => { - return ( - fluidType !== FluidType.MULTIFLUID && - fluidStatus[fluidType]?.status === FluidState.PARTNER_ISSUE - ) - } + const isFluidMaintenance = () => fluidStatus[fluidType]?.maintenance useEffect(() => { //Show errors only on konnected konnectors that are in error, outdated, with no data (specific case), and not in multifluid @@ -102,7 +96,7 @@ const FluidButton: React.FC<FluidButtonProps> = ({ icon={iconType} size={fluidType === FluidType.MULTIFLUID ? 36 : 32} /> - {serviceIsDown() ? ( + {isFluidMaintenance() ? ( <StyledIcon icon={PartnerIssueNotif} size={22} diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx index a71533554111eeff77da2b520d25bbcbb3cc8287..1b6dd8ddb1ae49e9c3313e1e38ec11349999f17f 100644 --- a/src/components/Konnector/KonnectorModal.tsx +++ b/src/components/Konnector/KonnectorModal.tsx @@ -58,7 +58,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ ) const [showCommonErrors, setShowCommonErrors] = useState(false) - const getUpdatingText = useCallback((): JSX.Element => { + const getUpdatingText = useCallback(() => { return ( <div className="kmodal-waiting-text text-18-italic"> {shuffledWaitingTexts.map((text, idx) => ( @@ -76,7 +76,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ ) }, [index, shuffledWaitingTexts]) - const getConnectionText = useCallback((): JSX.Element => { + const getConnectionText = useCallback(() => { return ( <div className="kmodal-waiting-text text-18-italic"> {isLogging ? ( @@ -101,7 +101,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ useEffect(() => { const interval = setInterval(() => { if (open && !state) { - setIndex((prev: number) => prev + 1) + setIndex(prev => prev + 1) } }, 8000) return () => { diff --git a/src/components/Konnector/KonnectorModalFooter.spec.tsx b/src/components/Konnector/KonnectorModalFooter.spec.tsx index 53cb597641b9fba6a8500545a73a28420aee7031..9a07e71b6390229c9bcd11ea9c131d8484bc2f59 100644 --- a/src/components/Konnector/KonnectorModalFooter.spec.tsx +++ b/src/components/Konnector/KonnectorModalFooter.spec.tsx @@ -1,18 +1,20 @@ -import React from 'react' +import { Button } from '@material-ui/core' +import { ERROR_EVENT } from 'cozy-harvest-lib/dist/models/flowEvents' +import { FluidType } from 'enum/fluid.enum' +import { KonnectorError } from 'enum/konnectorError.enum' import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { GlobalState } from 'models/global.model' +import React from 'react' import { Provider } from 'react-redux' +import { MockStoreEnhanced } from 'redux-mock-store' +import { accountsData } from '../../../tests/__mocks__/accountsData.mock' import { createMockStore, mockInitialEcolyoState, } from '../../../tests/__mocks__/store' -import { ERROR_EVENT } from 'cozy-harvest-lib/dist/models/flowEvents' -import toJson from 'enzyme-to-json' -import KonnectorModalFooter from './KonnectorModalFooter' -import { FluidType } from 'enum/fluid.enum' -import { KonnectorError } from 'enum/konnectorError.enum' -import { Button } from '@material-ui/core' -import { accountsData } from '../../../tests/__mocks__/accountsData.mock' import { waitForComponentToPaint } from '../../../tests/__mocks__/testUtils' +import KonnectorModalFooter from './KonnectorModalFooter' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -33,7 +35,14 @@ jest.mock('react-router-dom', () => ({ const mockClose = jest.fn() const mockDelete = jest.fn() describe('KonnectorModalFooter component', () => { - let store: any + let store: MockStoreEnhanced< + { + ecolyo: { + global: GlobalState + } + }, + {} + > beforeEach(() => { store = createMockStore(mockInitialEcolyoState) mockDelete.mockClear() @@ -148,7 +157,6 @@ describe('KonnectorModalFooter component', () => { wrapper.find(Button).at(1).simulate('click') await waitForComponentToPaint(wrapper) expect(mockDelete).toHaveBeenCalled() - expect(mockHistoryPush).toHaveBeenCalledTimes(1) }) it('should reset sge account and go back to login', async () => { const wrapper = mount( @@ -167,7 +175,6 @@ describe('KonnectorModalFooter component', () => { wrapper.find(Button).at(1).simulate('click') await waitForComponentToPaint(wrapper) expect(mockDelete).toHaveBeenCalled() - expect(mockHistoryPush).toHaveBeenCalledTimes(1) }) it('should not reset account if no account', () => { const wrapper = mount( @@ -184,7 +191,6 @@ describe('KonnectorModalFooter component', () => { </Provider> ) wrapper.find(Button).at(1).simulate('click') - expect(mockHistoryPush).toHaveBeenCalledTimes(1) expect(mockDelete).toHaveBeenCalledTimes(0) }) }) diff --git a/src/components/Konnector/KonnectorModalFooter.tsx b/src/components/Konnector/KonnectorModalFooter.tsx index 40b11039edd43a581182994d6e3fe7b5a37cf97b..e476536b4972a3c12b910fccd23ed7f62bfb0421 100644 --- a/src/components/Konnector/KonnectorModalFooter.tsx +++ b/src/components/Konnector/KonnectorModalFooter.tsx @@ -33,8 +33,8 @@ const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({ isUpdating, }: KonnectorModalFooterProps) => { const { t } = useI18n() - const history = useHistory() const client = useClient() + const history = useHistory() const handleSGELoginRetry = useCallback(() => { handleCloseClick(state === SUCCESS_EVENT) history.push('/sge-connect') diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index c160dc6332b4f0f4b35bfd1cb950caf39af4f93a..5bc0ce5666a1486ee5688c10afd2556298e66ffc 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -1,65 +1,64 @@ -import React, { useState, useEffect, useCallback, useMemo } from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useClient } from 'cozy-client' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' import classNames from 'classnames' -import './konnectorViewerCard.scss' - +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { FluidState, FluidType } from 'enum/fluid.enum' import { UserChallengeState } from 'enum/userChallenge.enum' import { UserDuelState } from 'enum/userDuel.enum' import { Account, + AccountAuthData, + FluidConnection, + FluidStatus, Konnector, Trigger, - FluidStatus, - FluidConnection, UsageEvent, - AccountAuthData, } from 'models' -import { getAddPicto, getParamPicto } from 'utils/picto' +import React, { useCallback, useEffect, useMemo, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import AccountService from 'services/account.service' +import ChallengeService from 'services/challenge.service' +import FluidService from 'services/fluid.service' +import { AppStore } from 'store' import { setChallengeConsumption } from 'store/challenge/challenge.actions' import { setFluidStatus, toggleChallengeDuelNotification, updatedFluidConnection, } from 'store/global/global.actions' -import FluidService from 'services/fluid.service' -import ChallengeService from 'services/challenge.service' -import AccountService from 'services/account.service' +import { getAddPicto, getParamPicto } from 'utils/picto' +import './konnectorViewerCard.scss' -import chevronDown from 'assets/icons/ico/chevron-down.svg' -import Icon from 'cozy-ui/transpiled/react/Icon' import { Accordion, - AccordionSummary, AccordionDetails, + AccordionSummary, } from '@material-ui/core' +import chevronDown from 'assets/icons/ico/chevron-down.svg' import ErrorNotif from 'assets/icons/ico/notif_error.svg' import PartnersIssueNotif from 'assets/icons/ico/notif_maintenance.svg' -import ConnectionNotFound from 'components/Connection/ConnectionNotFound' import Connection from 'components/Connection/Connection' +import ConnectionNotFound from 'components/Connection/ConnectionNotFound' import ConnectionResult from 'components/Connection/ConnectionResult' import KonnectorModal from 'components/Konnector/KonnectorModal' +import Icon from 'cozy-ui/transpiled/react/Icon' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers' import ConnectionFlow from 'cozy-harvest-lib/dist/models/ConnectionFlow' import { ERROR_EVENT, - SUCCESS_EVENT, LOGIN_SUCCESS_EVENT, + SUCCESS_EVENT, } from 'cozy-harvest-lib/dist/models/flowEvents' +import { FluidSlugType } from 'enum/fluidSlug.enum' +import { KonnectorError } from 'enum/konnectorError.enum' +import { UsageEventType } from 'enum/usageEvent.enum' import { DateTime } from 'luxon' -import { setSelectedDate } from 'store/chart/chart.actions' +import { PartnersInfo } from 'models/partnersInfo.model' import DateChartService from 'services/dateChart.service' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import UsageEventService from 'services/usageEvent.service' -import { UsageEventType } from 'enum/usageEvent.enum' import PartnersInfoService from 'services/partnersInfo.service' -import { PartnersInfo } from 'models/partnersInfo.model' -import { FluidSlugType } from 'enum/fluidSlug.enum' -import { KonnectorError } from 'enum/konnectorError.enum' +import UsageEventService from 'services/usageEvent.service' +import { setSelectedDate } from 'store/chart/chart.actions' interface KonnectorViewerCardProps { fluidStatus: FluidStatus @@ -87,9 +86,11 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const konnector: Konnector | null = fluidStatus.connection.konnector const account: Account | null = fluidStatus.connection.account const trigger: Trigger | null = fluidStatus.connection.trigger - const { fluidStatus: statusArray, shouldRefreshConsent } = useSelector( - (state: AppStore) => state.ecolyo.global - ) + const { + fluidStatus: statusArray, + shouldRefreshConsent, + sgeConnect, + } = useSelector((state: AppStore) => state.ecolyo.global) const [openModal, setOpenModal] = useState(false) const [isUpdating, setIsUpdating] = useState(false) @@ -132,7 +133,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const _updatedFluidStatus: FluidStatus[] = await fluidService.getFluidStatus() setUpdatedFluidStatus(_updatedFluidStatus) - const refDate: DateTime = DateTime.fromISO('0001-01-01') + const refDate = DateTime.fromISO('0001-01-01') let _lastDataDate: DateTime | null = DateTime.fromISO('0001-01-01') for (const fluid of _updatedFluidStatus) { if (fluid && fluid?.lastDataDate && fluid?.lastDataDate > _lastDataDate) { @@ -347,12 +348,11 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const displayKonnectorIcon = useCallback(() => { return ( <div className="konnector-icon"> - {fluidStatus.connection.account ? ( - <Icon icon={iconType} size={49} /> - ) : ( - <Icon icon={iconAddType} size={49} /> - )} - {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( + <Icon + icon={fluidStatus.connection.account ? iconType : iconAddType} + size={49} + /> + {fluidStatus.maintenance ? ( <StyledIcon icon={PartnersIssueNotif} size={24} @@ -373,6 +373,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ ) }, [ fluidStatus.connection.account, + fluidStatus.maintenance, fluidStatus.status, iconAddType, iconType, @@ -380,7 +381,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ ]) const displayKonnectorHeader = useCallback(() => { - if (fluidStatus.status === FluidState.PARTNER_ISSUE) { + if (fluidStatus.maintenance) { return ( <span className="text-16-bold"> {t(`konnector_options.partner_issue`)} @@ -395,7 +396,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ </span> ) } else if (fluidStatus.connection.account && !isOutdatedData) { - return t('FLUID.' + FluidType[fluidStatus.fluidType] + '.LABEL') + return t(`FLUID.${FluidType[fluidStatus.fluidType]}.LABEL`) } else { return t( `konnector_options.label_connect_to_${FluidType[ @@ -406,7 +407,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ }, [ fluidStatus.connection.account, fluidStatus.fluidType, - fluidStatus.status, + fluidStatus.maintenance, isOutdatedData, t, ]) @@ -487,7 +488,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ onChange={toggleAccordion} classes={{ root: `expansion-panel-root ${ - fluidStatus.status !== FluidState.PARTNER_ISSUE && + !fluidStatus.maintenance && (fluidStatus.status === FluidState.ERROR || fluidStatus.status === FluidState.ERROR_LOGIN_FAILED || isOutdatedData) @@ -517,7 +518,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ fluidStatus.fluidType ].toLowerCase()}-connected text-16-bold`]: fluidStatus.status !== FluidState.NOT_CONNECTED && - fluidStatus.status !== FluidState.PARTNER_ISSUE, + !fluidStatus.maintenance, })} > {displayKonnectorHeader()} diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index 7cd951e62a565438de5ca3e263fac258381c64ee..75ed3cf5dbede0a9618099432c8ba4b1ba698acb 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -42,7 +42,7 @@ export const Navbar: React.FC = () => { ) return ( <aside className="o-sidebar"> - <nav role="navigation"> + <nav role="navigation" aria-label="navigation"> <ul className="c-nav"> <li className="c-nav-item" diff --git a/src/components/Navbar/navBar.scss b/src/components/Navbar/navBar.scss index eec9e331f0a42e72d97906fe970aa40d60de7d70..c65e38f0b3b078de768942f2148aa9ff90a78013 100644 --- a/src/components/Navbar/navBar.scss +++ b/src/components/Navbar/navBar.scss @@ -3,6 +3,7 @@ @import 'src/styles/base/z-index'; .o-sidebar { + width: 15%; background-color: $bottom-bar-grey; box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.2), 0px 3px 14px rgba(0, 0, 0, 0.12), 0px 8px 10px rgba(0, 0, 0, 0.14); diff --git a/src/components/PartnersIssue/PartnersIssueModal.spec.tsx b/src/components/PartnerIssue/PartnerIssueModal.spec.tsx similarity index 52% rename from src/components/PartnersIssue/PartnersIssueModal.spec.tsx rename to src/components/PartnerIssue/PartnerIssueModal.spec.tsx index 8d04d89bd6f5524332a6623d6d7c1f0ae6e9e02a..de6d946e2b07f301babef14a9df3194189e3ff11 100644 --- a/src/components/PartnersIssue/PartnersIssueModal.spec.tsx +++ b/src/components/PartnerIssue/PartnerIssueModal.spec.tsx @@ -1,11 +1,11 @@ -import React from 'react' +import { Button } from '@material-ui/core' import { mount } from 'enzyme' -import { Provider } from 'react-redux' import toJson from 'enzyme-to-json' +import React from 'react' +import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import { mockInitialEcolyoState } from '../../../tests/__mocks__/store' -import PartnersIssueModal from './PartnersIssueModal' -import { Button } from '@material-ui/core' +import PartnerIssueModal from './PartnerIssueModal' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -19,29 +19,53 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { const mockStore = configureStore([]) const mockHandleClose = jest.fn() -describe('PartnersIssueModal component', () => { +describe('PartnerIssueModal component', () => { const store = mockStore({ ecolyo: mockInitialEcolyoState, }) it('should render correctly', () => { const wrapper = mount( <Provider store={store}> - <PartnersIssueModal + <PartnerIssueModal open={true} handleCloseClick={mockHandleClose} - fluidStatus={mockInitialEcolyoState.global.fluidStatus} + issuedFluid={mockInitialEcolyoState.global.fluidStatus[0]} /> </Provider> ) expect(toJson(wrapper)).toMatchSnapshot() }) + it('should render elec modal', () => { + const wrapper = mount( + <Provider store={store}> + <PartnerIssueModal + open={true} + handleCloseClick={mockHandleClose} + issuedFluid={mockInitialEcolyoState.global.fluidStatus[0]} + /> + </Provider> + ) + expect(wrapper.text().includes('error_connect_elec')).toBeTruthy() + }) + it('should render water modal', () => { + const wrapper = mount( + <Provider store={store}> + <PartnerIssueModal + open={true} + handleCloseClick={mockHandleClose} + issuedFluid={mockInitialEcolyoState.global.fluidStatus[1]} + /> + </Provider> + ) + expect(wrapper.text().includes('error_connect_water')).toBeTruthy() + }) it('should close modal', () => { const wrapper = mount( <Provider store={store}> - <PartnersIssueModal + <PartnerIssueModal open={true} handleCloseClick={mockHandleClose} - fluidStatus={mockInitialEcolyoState.global.fluidStatus} + issuedFluid={mockInitialEcolyoState.global.fluidStatus[0]} /> </Provider> ) @@ -52,13 +76,13 @@ describe('PartnersIssueModal component', () => { it('should not be rendered', () => { const wrapper = mount( <Provider store={store}> - <PartnersIssueModal + <PartnerIssueModal open={false} handleCloseClick={mockHandleClose} - fluidStatus={mockInitialEcolyoState.global.fluidStatus} + issuedFluid={mockInitialEcolyoState.global.fluidStatus[0]} /> </Provider> ) - expect(wrapper.find('div.partnersIssueModal').exists()).toBeFalsy() + expect(wrapper.find('div.partnerIssueModal').exists()).toBeFalsy() }) }) diff --git a/src/components/PartnerIssue/PartnerIssueModal.tsx b/src/components/PartnerIssue/PartnerIssueModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3e449f713934ae6f63d3ad17c0a21f0f7a7abd60 --- /dev/null +++ b/src/components/PartnerIssue/PartnerIssueModal.tsx @@ -0,0 +1,98 @@ +import Button from '@material-ui/core/Button' +import Dialog from '@material-ui/core/Dialog' +import IconButton from '@material-ui/core/IconButton' +import CloseIcon from 'assets/icons/ico/close.svg' +import OrangeWarn from 'assets/icons/ico/warn-orange.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { FluidType } from 'enum/fluid.enum' +import { FluidStatus } from 'models' +import React from 'react' +import './partnerIssueModal.scss' + +interface PartnerIssueModalProps { + open: boolean + issuedFluid: FluidStatus + handleCloseClick: (fluidType: FluidType) => void +} + +const PartnerIssueModal: React.FC<PartnerIssueModalProps> = ({ + open, + issuedFluid, + handleCloseClick, +}: PartnerIssueModalProps) => { + const { t } = useI18n() + + const getFluidTypeLabel = () => { + switch (issuedFluid.fluidType) { + case FluidType.ELECTRICITY: + return 'elec' + case FluidType.WATER: + return 'water' + case FluidType.GAS: + return 'gaz' + } + } + + return ( + <Dialog + open={open} + disableEscapeKeyDown + onClose={(event, reason): void => { + event && + reason !== 'backdropClick' && + handleCloseClick(issuedFluid.fluidType) + }} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + style={{ zIndex: 1500 }} + > + <div id={'accessibility-title'}> + {t('feedback.accessibility.window_title')} + </div> + <IconButton + aria-label={t('feedback.accessibility.button_close')} + className="modal-paper-close-button" + onClick={() => handleCloseClick(issuedFluid.fluidType)} + > + <Icon icon={CloseIcon} size={16} /> + </IconButton> + + <div className="partnerIssueModal"> + <StyledIcon icon={OrangeWarn} size={40} className={'warn-icon'} /> + <div className="partner-issue-title text-20-bold"> + {t('consumption.partner_issue_modal.title')} + </div> + <div + className="partner-issue-content text-16-normal" + dangerouslySetInnerHTML={{ + __html: t( + `consumption.partner_issue_modal.error_connect_${getFluidTypeLabel()}` + ), + }} + /> + <br /> + <div + dangerouslySetInnerHTML={{ + __html: t(`consumption.partner_issue_modal.additional_text`), + }} + /> + <Button + onClick={() => handleCloseClick(issuedFluid.fluidType)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + {t('consumption.partner_issue_modal.ok')} + </Button> + </div> + </Dialog> + ) +} + +export default PartnerIssueModal diff --git a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap b/src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap similarity index 91% rename from src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap rename to src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap index 4da8c4e6889a12c8b55fffeb912ed50bac6fec2f..1b915b824f4f32b3047300b8500f8607388f185a 100644 --- a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap +++ b/src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PartnersIssueModal component should render correctly 1`] = ` +exports[`PartnerIssueModal component should render correctly 1`] = ` <Provider store={ Object { @@ -13,75 +13,32 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` } } > - <PartnersIssueModal - fluidStatus={ - Array [ - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "enedissgegrandlyon", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, - }, - "firstDataDate": null, - "fluidType": 0, - "lastDataDate": null, - "status": 0, - }, - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "eglgrandlyon", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, - }, - "firstDataDate": null, - "fluidType": 1, - "lastDataDate": null, - "status": 0, - }, - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "grdfgrandlyon", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, + <PartnerIssueModal + handleCloseClick={[MockFunction]} + issuedFluid={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedissgegrandlyon", }, - "firstDataDate": null, - "fluidType": 2, - "lastDataDate": null, - "status": 0, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, }, - ] + "firstDataDate": null, + "fluidType": 0, + "lastDataDate": null, + "maintenance": false, + "status": 0, + } } - handleCloseClick={[MockFunction]} open={true} > <WithStyles(ForwardRef(Dialog)) @@ -528,7 +485,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` /> </button> <div - class="partnersIssueModal" + class="partnerIssueModal" > <svg aria-hidden="true" @@ -541,30 +498,28 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` /> </svg> <div - class="partners-issue-title text-20-bold" + class="partner-issue-title text-20-bold" > - consumption.partners_issue_modal.title + consumption.partner_issue_modal.title </div> <div - class="partners-issue-content text-16-normal" + class="partner-issue-content text-16-normal" > - consumption.partners_issue_modal.text_1 + consumption.partner_issue_modal.error_connect_elec </div> - <ul /> - <div - class="partners-issue-content text-16-normal" - > - consumption.partners_issue_modal.text_2 + <br /> + <div> + consumption.partner_issue_modal.additional_text </div> <button - class="MuiButtonBase-root MuiButton-root btn-highlight partnermodalclose MuiButton-text" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" tabindex="0" type="button" > <span class="MuiButton-label text-16-bold" > - consumption.partners_issue_modal.button_validate + consumption.partner_issue_modal.ok </span> <span class="MuiTouchRipple-root" @@ -786,7 +741,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` <WithStyles(ForwardRef(IconButton)) aria-label="feedback.accessibility.button_close" className="modal-paper-close-button" - onClick={[MockFunction]} + onClick={[Function]} > <ForwardRef(IconButton) aria-label="feedback.accessibility.button_close" @@ -804,7 +759,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "sizeSmall": "MuiIconButton-sizeSmall", } } - onClick={[MockFunction]} + onClick={[Function]} > <WithStyles(ForwardRef(ButtonBase)) aria-label="feedback.accessibility.button_close" @@ -812,7 +767,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` className="MuiIconButton-root modal-paper-close-button" disabled={false} focusRipple={true} - onClick={[MockFunction]} + onClick={[Function]} > <ForwardRef(ButtonBase) aria-label="feedback.accessibility.button_close" @@ -827,14 +782,14 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` } disabled={false} focusRipple={true} - onClick={[MockFunction]} + onClick={[Function]} > <button aria-label="feedback.accessibility.button_close" className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" disabled={false} onBlur={[Function]} - onClick={[MockFunction]} + onClick={[Function]} onDragLeave={[Function]} onFocus={[Function]} onKeyDown={[Function]} @@ -909,7 +864,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` </ForwardRef(IconButton)> </WithStyles(ForwardRef(IconButton))> <div - className="partnersIssueModal" + className="partnerIssueModal" > <StyledIcon className="warn-icon" @@ -945,29 +900,34 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` </Icon> </StyledIcon> <div - className="partners-issue-title text-20-bold" + className="partner-issue-title text-20-bold" > - consumption.partners_issue_modal.title + consumption.partner_issue_modal.title </div> <div - className="partners-issue-content text-16-normal" - > - consumption.partners_issue_modal.text_1 - </div> - <ul /> + className="partner-issue-content text-16-normal" + dangerouslySetInnerHTML={ + Object { + "__html": "consumption.partner_issue_modal.error_connect_elec", + } + } + /> + <br /> <div - className="partners-issue-content text-16-normal" - > - consumption.partners_issue_modal.text_2 - </div> + dangerouslySetInnerHTML={ + Object { + "__html": "consumption.partner_issue_modal.additional_text", + } + } + /> <WithStyles(ForwardRef(Button)) classes={ Object { "label": "text-16-bold", - "root": "btn-highlight partnermodalclose", + "root": "btn-highlight", } } - onClick={[MockFunction]} + onClick={[Function]} > <ForwardRef(Button) classes={ @@ -992,7 +952,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "outlinedSecondary": "MuiButton-outlinedSecondary", "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-highlight partnermodalclose", + "root": "MuiButton-root btn-highlight", "sizeLarge": "MuiButton-sizeLarge", "sizeSmall": "MuiButton-sizeSmall", "startIcon": "MuiButton-startIcon", @@ -1003,19 +963,19 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "textSizeSmall": "MuiButton-textSizeSmall", } } - onClick={[MockFunction]} + onClick={[Function]} > <WithStyles(ForwardRef(ButtonBase)) - className="MuiButton-root btn-highlight partnermodalclose MuiButton-text" + className="MuiButton-root btn-highlight MuiButton-text" component="button" disabled={false} focusRipple={true} focusVisibleClassName="Mui-focusVisible" - onClick={[MockFunction]} + onClick={[Function]} type="button" > <ForwardRef(ButtonBase) - className="MuiButton-root btn-highlight partnermodalclose MuiButton-text" + className="MuiButton-root btn-highlight MuiButton-text" classes={ Object { "disabled": "Mui-disabled", @@ -1027,14 +987,14 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` disabled={false} focusRipple={true} focusVisibleClassName="Mui-focusVisible" - onClick={[MockFunction]} + onClick={[Function]} type="button" > <button - className="MuiButtonBase-root MuiButton-root btn-highlight partnermodalclose MuiButton-text" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" disabled={false} onBlur={[Function]} - onClick={[MockFunction]} + onClick={[Function]} onDragLeave={[Function]} onFocus={[Function]} onKeyDown={[Function]} @@ -1051,7 +1011,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` <span className="MuiButton-label text-16-bold" > - consumption.partners_issue_modal.button_validate + consumption.partner_issue_modal.ok </span> <WithStyles(memo) center={false} @@ -1104,6 +1064,6 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` </ForwardRef(Modal)> </ForwardRef(Dialog)> </WithStyles(ForwardRef(Dialog))> - </PartnersIssueModal> + </PartnerIssueModal> </Provider> `; diff --git a/src/components/PartnersIssue/partnersIssueModal.scss b/src/components/PartnerIssue/partnerIssueModal.scss similarity index 58% rename from src/components/PartnersIssue/partnersIssueModal.scss rename to src/components/PartnerIssue/partnerIssueModal.scss index ffb8ff0beb1ad2a96b8681467440c33b3646224b..5ffa04a87f5eaae4394bdc6494905d9474423426 100644 --- a/src/components/PartnersIssue/partnersIssueModal.scss +++ b/src/components/PartnerIssue/partnerIssueModal.scss @@ -1,27 +1,41 @@ @import '../../styles/base/typo-variables'; @import '../../styles/base/color'; -.partnersIssueModal { +.partnerIssueModal { padding: 1rem; max-width: 20rem; + text-align: center; .warn-icon { margin: 1rem auto; display: block; } - .partners-issue-title { + .partner-issue-title { color: #ec9d41; margin: 1rem auto; text-align: center; } - .partners-issue-content { + .partner-issue-content { color: $grey-bright; + font-weight: bold; + + span { + &.gaz { + color: $gas-color; + } + &.elec { + color: $elec-color; + } + &.water { + color: $water-color; + } + } } button.btn-highlight { padding: 0.65rem; } } -.partners-issue-portal { +.partner-issue-portal { .modal-overlay { .modal-box { max-width: 21rem; diff --git a/src/components/PartnersIssue/PartnersIssueModal.tsx b/src/components/PartnersIssue/PartnersIssueModal.tsx deleted file mode 100644 index d79afb180370335afd8d90884454f3377203edd9..0000000000000000000000000000000000000000 --- a/src/components/PartnersIssue/PartnersIssueModal.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import Button from '@material-ui/core/Button' -import Dialog from '@material-ui/core/Dialog' -import IconButton from '@material-ui/core/IconButton' -import CloseIcon from 'assets/icons/ico/close.svg' -import OrangeWarn from 'assets/icons/ico/warn-orange.svg' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import Icon from 'cozy-ui/transpiled/react/Icon' -import { FluidState } from 'enum/fluid.enum' -import { FluidStatus } from 'models' -import React, { useEffect, useState } from 'react' -import './partnersIssueModal.scss' - -interface PartnersIssueModalProps { - open: boolean - fluidStatus: FluidStatus[] - handleCloseClick: () => void -} - -const PartnersIssueModal: React.FC<PartnersIssueModalProps> = ({ - open, - fluidStatus, - handleCloseClick, -}: PartnersIssueModalProps) => { - const { t } = useI18n() - const [fluids, setFluids] = useState<FluidStatus[]>([]) - - useEffect(() => { - const issuedFluids = fluidStatus.filter(fluid => { - return fluid.status === FluidState.PARTNER_ISSUE - }) - setFluids(issuedFluids) - }, [fluidStatus]) - return ( - <Dialog - open={open} - disableEscapeKeyDown - onClose={(event, reason): void => { - event && reason !== 'backdropClick' && handleCloseClick() - }} - aria-labelledby={'accessibility-title'} - classes={{ - root: 'modal-root', - paper: 'modal-paper', - }} - style={{ zIndex: 1500 }} - > - <div id={'accessibility-title'}> - {t('feedback.accessibility.window_title')} - </div> - <IconButton - aria-label={t('feedback.accessibility.button_close')} - className="modal-paper-close-button" - onClick={handleCloseClick} - > - <Icon icon={CloseIcon} size={16} /> - </IconButton> - <div className="partnersIssueModal"> - <StyledIcon icon={OrangeWarn} size={40} className={'warn-icon'} /> - - <div className="partners-issue-title text-20-bold"> - {t('consumption.partners_issue_modal.title')} - </div> - <div className="partners-issue-content text-16-normal"> - {t('consumption.partners_issue_modal.text_1')} - </div> - <ul> - {fluids.map((fluid: FluidStatus, key) => { - return ( - <li key={key} className="text-16-bold"> - {fluid.connection.konnectorConfig.name} - </li> - ) - })} - </ul> - <div className="partners-issue-content text-16-normal"> - {t('consumption.partners_issue_modal.text_2')} - </div> - - <Button - onClick={handleCloseClick} - classes={{ - root: 'btn-highlight partnermodalclose', - label: 'text-16-bold', - }} - > - {t('consumption.partners_issue_modal.button_validate')} - </Button> - </div> - </Dialog> - ) -} - -export default PartnersIssueModal diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index 849967efedf6c84eb54c2adcf6bc48a99e99727d..28abfb02836537154edfc4cae16917a580311987 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -1,17 +1,17 @@ -import React, { Suspense, lazy } from 'react' -import { Route, Switch, Redirect } from 'react-router-dom' -import { FluidType } from 'enum/fluid.enum' +import ActionView from 'components/Action/ActionView' import ChallengeView from 'components/Challenge/ChallengeView' +import SgeConnectView from 'components/Connection/SGEConnect/SgeConnectView' import DuelView from 'components/Duel/DuelView' -import QuizView from 'components/Quiz/QuizView' +import EcogestureFormView from 'components/EcogestureForm/EcogestureFormView' +import EcogestureSelection from 'components/EcogestureSelection/EcogestureSelection' import ExplorationView from 'components/Exploration/ExplorationView' -import ActionView from 'components/Action/ActionView' import UnSubscribe from 'components/Options/Unsubscribe/UnSubscribe' +import QuizView from 'components/Quiz/QuizView' import TermsView from 'components/Terms/TermsView' +import { FluidType } from 'enum/fluid.enum' import { TermsStatus } from 'models' -import EcogestureFormView from 'components/EcogestureForm/EcogestureFormView' -import EcogestureSelection from 'components/EcogestureSelection/EcogestureSelection' -import SgeConnectView from 'components/Connection/SGEConnect/SgeConnectView' +import React, { lazy, Suspense } from 'react' +import { Redirect, Route, Switch } from 'react-router-dom' const ConsumptionView = lazy(() => import('components/Home/ConsumptionView')) diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx index 46fbf339072415e059c44261e56031b6fc776cc8..ea6cffa0c8b08d8a6ae93b8c42c74bca27d66bf9 100644 --- a/src/components/Splash/SplashRoot.tsx +++ b/src/components/Splash/SplashRoot.tsx @@ -2,7 +2,6 @@ import * as Sentry from '@sentry/react' import classNames from 'classnames' import useExploration from 'components/Hooks/useExploration' import { useClient } from 'cozy-client' -import { FluidState } from 'enum/fluid.enum' import { UsageEventType } from 'enum/usageEvent.enum' import { UserActionState } from 'enum/userAction.enum' import { UserChallengeState } from 'enum/userChallenge.enum' @@ -14,11 +13,18 @@ import { import { DateTime } from 'luxon' import { migrations } from 'migrations/migration.data' import { MigrationService } from 'migrations/migration.service' -import { FluidStatus, TermsStatus, UserChallenge } from 'models' +import { Profile, TermsStatus, UserChallenge } from 'models' +import { CustomPopup } from 'models/customPopup.model' import { InitSteps, InitStepsErrors } from 'models/initialisationSteps.model' import { PartnersInfo } from 'models/partnersInfo.model' import { ReleaseNotes } from 'models/releaseNotes.model' -import React, { Dispatch, ReactNode, useEffect, useState } from 'react' +import React, { + Dispatch, + ReactNode, + useCallback, + useEffect, + useState, +} from 'react' import { useDispatch } from 'react-redux' import ActionService from 'services/action.service' import ChallengeService from 'services/challenge.service' @@ -75,6 +81,7 @@ interface SplashRootProps { */ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { const client = useClient() + const today = getTodayDate().toISO() const [{ splashEnd, splashStart }, setState] = useState({ splashEnd: false, splashStart: false, @@ -93,6 +100,84 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { | ProfileTypeActionTypes > = useDispatch() + /** Return current status of partner if modal has not been seen today */ + const getPartnerStatus = useCallback( + (currentStatus: boolean, lastSeenDate: DateTime) => { + if (today !== lastSeenDate.toISO()) { + return currentStatus + } + return false + }, + [today] + ) + + /** For each fluid, if notification is activated, set FluidStatus.maintenance to true */ + const processFluidsStatus = useCallback( + async (profile: Profile, partnersInfo: PartnersInfo) => { + if (partnersInfo.notification_activated && !profile?.isFirstConnection) { + const fluidService = new FluidService(client) + const _updatedFluidStatus = await fluidService.getFluidStatus( + partnersInfo + ) + dispatch(setFluidStatus(_updatedFluidStatus)) + } + }, + [client, dispatch] + ) + + /** Process customPopup and enable it if activated */ + const processCustomPopup = useCallback( + async (profile: Profile, customPopup: CustomPopup) => { + try { + if ( + today !== profile?.customPopupDate.toISO() && + !profile?.isFirstConnection + ) { + dispatch(setCustomPopup(customPopup)) + } + } catch (error) { + console.error('Error while checking customPopup informations') + } + }, + [dispatch, today] + ) + + /** + * For each fluid, set partnersIssue to true if notification is activated and seenDate < today + */ + const processPartnersStatus = useCallback( + async (profile: Profile, partnersInfo: PartnersInfo) => { + try { + if ( + partnersInfo.notification_activated && + !profile?.isFirstConnection + ) { + const partnersIssue = { + enedis: getPartnerStatus( + partnersInfo.enedis_failure, + profile.partnersIssueSeenDate.enedis + ), + egl: getPartnerStatus( + partnersInfo.egl_failure, + profile.partnersIssueSeenDate.egl + ), + grdf: getPartnerStatus( + partnersInfo.grdf_failure, + profile.partnersIssueSeenDate.grdf + ), + } + + if (Object.values(partnersIssue).some(issue => issue)) { + dispatch(setPartnersIssue(partnersIssue)) + } + } + } catch (error) { + console.error('Error while fetching partners informations') + } + }, + [dispatch, getPartnerStatus] + ) + useEffect(() => { let timeoutSplash: NodeJS.Timeout if (splashStart) { @@ -113,7 +198,6 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { setInitStep, setInitStepErrors ) - const partnersInfoService = new PartnersInfoService(client) const customPopupService = new CustomPupopService(client) const ms = new MigrationService(client, setInitStepErrors) try { @@ -263,55 +347,16 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { }) } - const today = getTodayDate().toISO() - - try { - // Check customPopup from backoffice - const customModalInfo = await customPopupService.getCustomPopup() - if ( - customModalInfo && - today !== profile?.customPopupDate.toISO() && - !profile?.isFirstConnection - ) { - dispatch(setCustomPopup(customModalInfo)) - } - } catch (error) { - console.error('Error while checking customPopup informations') + const customPopup = await customPopupService.getCustomPopup() + if (profile && customPopup) { + await processCustomPopup(profile, customPopup) } - try { - // Check partnersInfo from backoffice - const partnersInfo: PartnersInfo | undefined = - await partnersInfoService.getPartnersInfo() - - // If notification is activated and konnector is connected, set FluidStatus to PARTNER_ISSUE - if ( - partnersInfo?.notification_activated && - !profile?.isFirstConnection - ) { - const fluidService = new FluidService(client) - const _updatedFluidStatus: FluidStatus[] = - await fluidService.getFluidStatus(partnersInfo) - let isConcernedByPartnerIssue = false - for (const fluid of _updatedFluidStatus) { - if (fluid.status === FluidState.PARTNER_ISSUE) - isConcernedByPartnerIssue = true - } - dispatch(setFluidStatus(_updatedFluidStatus)) - /* - * If the partnersIssueModal has not been seen today - * and the user is concerned by any one of the partners' issue - * enable the modal - */ - if ( - today !== profile?.partnersIssueDate.toISO() && - isConcernedByPartnerIssue - ) { - dispatch(setPartnersIssue(true)) - } - } - } catch (error) { - console.error('Error while fetching partners informations') + const partnersInfoService = new PartnersInfoService(client) + const partnersInfo = await partnersInfoService.getPartnersInfo() + if (profile && partnersInfo) { + await processFluidsStatus(profile, partnersInfo) + await processPartnersStatus(profile, partnersInfo) } if (subscribed) { @@ -333,7 +378,15 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { return () => { subscribed = false } - }, [client, dispatch, initStepErrors, setValidExploration]) + }, [ + client, + dispatch, + initStepErrors, + processCustomPopup, + processFluidsStatus, + processPartnersStatus, + setValidExploration, + ]) return ( <> diff --git a/src/constants/config.json b/src/constants/config.json index fd957b43a5bcfa518884bd656152eeac2496b932..6bd1c0ecb49d8f440ddee816a08aaa216226b636 100644 --- a/src/constants/config.json +++ b/src/constants/config.json @@ -21,7 +21,7 @@ "startDate": "2021-01-01T00:00:00.000", "dataDelayOffset": 5, "konnectorConfig": { - "name": "Eau du Grand Lyon", + "name": "Eau Publique du Grand Lyon", "oauth": false, "slug": "eglgrandlyon", "siteLink": "https://www.eaudugrandlyon.com/inscription.aspx#subc-now", diff --git a/src/doctypes/remote/org.ecolyo.agent.partners.info.ts b/src/doctypes/remote/org.ecolyo.agent.partners.info.ts index b3b3be25a55d4bbfacd278ac0a44be25f561a13b..56ae4a166e793f18b2b93bfc78ac7a65e4a9f008 100644 --- a/src/doctypes/remote/org.ecolyo.agent.partners.info.ts +++ b/src/doctypes/remote/org.ecolyo.agent.partners.info.ts @@ -1,4 +1,4 @@ -export const REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO = +export const REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO = '/remote/org.ecolyo.agent.partners.info' -export const REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC = +export const REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC = '/remote/org.ecolyo.agent.partners.info.rec' diff --git a/src/enum/fluid.enum.ts b/src/enum/fluid.enum.ts index cd67a004d54e7b3c9b1e7a3216b917731ecb3edc..e62cd529ed496bf0b6c157c4d59c82b5ac04f3d4 100644 --- a/src/enum/fluid.enum.ts +++ b/src/enum/fluid.enum.ts @@ -11,5 +11,4 @@ export enum FluidState { DONE = 200, ERROR = 300, ERROR_LOGIN_FAILED = 301, - PARTNER_ISSUE = 500, } diff --git a/src/locales/fr.json b/src/locales/fr.json index 55c1acf179684751c2c212106ddfb0741df88a08..7fcb26e7684f858217442697bdb6b96e3d95db81 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -34,7 +34,7 @@ "ADD": "Ajouter l'eau", "UNIT": "L", "MEGAUNIT": "m³", - "provider": "Eau du Grand Lyon" + "provider": "Eau Publique du Grand Lyon" }, "GAS": { "NAME": "Gaz", @@ -57,9 +57,9 @@ "details": "Détail de l'astuce", "apply": "J'applique cette action", "other": "Je choisis une autre action", - "resultText1": "Cela n'a pas été trop difficile ?", + "resultText1": "Cela n'a pas été trop difficile\u00a0?", "resultText2": "Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.", - "resultText3": "Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.", + "resultText3": "Pas de baisse de significative\u00a0? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.", "resultText4": "Dans tous les cas, bravo, vous remportez...", "ok": "Ok" }, @@ -107,7 +107,7 @@ "total": "Conso totale", "month": "Au mois de ", "estimation": "Comment sont estimés", - "estimation2": "les prix ?" + "estimation2": "les prix\u00a0?" }, "special_elec": { "title": "Spécial Électricité", @@ -126,8 +126,8 @@ "window_title": "electricity-info-modal", "button_close": "close-modal" }, - "title1": "Qu’est-ce que la consommation minimum ?", - "title2": "Qu’est-ce que la puissance maximum ?", + "title1": "Qu’est-ce que la consommation minimum\u00a0?", + "title2": "Qu’est-ce que la puissance maximum\u00a0?", "text1": "Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.", "text2": "Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).", "text3": "C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.", @@ -149,7 +149,7 @@ "pdlLabel": "N° (14 chiffres)", "pdlHint": "Où trouver le n° de PDL\u00a0?", "pdlModal": { - "txt1": "Où trouver le n° de PDL ou PRM ?", + "txt1": "Où trouver le n° de PDL ou PRM\u00a0?", "txt2": "Le numéro de PDL ou PRM se compose de 14 chiffres.", "txt3": "Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.", "txt4": "Si vous avez un compteur Linky, appuyez sur le bouton “+†et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :" @@ -187,7 +187,7 @@ "info": "GRDF est responsable de votre compteur Gazpar et en charge de relever vos consommations." }, "with_account": { - "title": "Votre compte GRDF a bien été créé ?", + "title": "Votre compte GRDF a bien été créé\u00a0?", "subtitle1": "Plus qu’à donner votre accord pour connecter GRDF et Ecolyo !", "subtitle1_info": "Une période de consentement minimale d'un an est recommandée", "subtitle2": "Si vous n’avez pas de compte GRDF", @@ -198,22 +198,22 @@ }, "eglgrandlyon": { "connect": { - "login": "Identifiant Eau du Grand Lyon (7 chiffres)", + "login": "Identifiant Eau Publique du Grand Lyon (7 chiffres)", "password": "Mot de passe", "label1": "Je me connecte à mon", - "label2": "compte Eau du Grand Lyon" + "label2": "compte Eau Publique du Grand Lyon" }, "no_account": { - "title": "Ecolyo doit se connecter à votre compte Eau du Grand Lyon", - "subtitle1": "Si vous n’avez pas de compte EGL", - "button_create_account": "Je crée mon compte EGL", - "subtitle2": "Si vous avez déjà un compte EGL,", - "subtitle2_info": "renseignez votre identifiant Eau Du Grand Lyon." + "title": "Ecolyo doit se connecter à votre compte Eau Publique du Grand Lyon", + "subtitle1": "Si vous n’avez pas de compte EPGL", + "button_create_account": "Je crée mon compte EPGL", + "subtitle2": "Si vous avez déjà un compte EPGL,", + "subtitle2_info": "renseignez votre identifiant Eau Publique du Grand Lyon." }, "with_account": { - "title": "Votre compte Eau du Grand Lyon a bien été créé ?", - "subtitle1": "Plus qu’à donner votre accord pour connecter EGL et Ecolyo !", - "subtitle2": "Si vous n’avez pas de compte EGL", + "title": "Votre compte Eau Publique du Grand Lyon a bien été créé\u00a0?", + "subtitle1": "Plus qu’à donner votre accord pour connecter EPGL et Ecolyo !", + "subtitle2": "Si vous n’avez pas de compte EPGL", "button_create_account": "Je crée mon compte", "subtitle2_info": "En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à -pas est disponible pour vous y aider.", "button_goto_guide": "Voir le guide" @@ -281,11 +281,12 @@ "button_next_value": "Sélectionner la valeur suivante", "checkbox_compare": "Afficher ou cacher la comparaison" }, - "partners_issue_modal": { - "title": "Un problème dans la récupération de vos données", - "text_1": "Ces partenaires nous indiquent qu’ils subissent en ce moment un soucis technique\u00a0:", - "text_2": "La visualisation de vos consommations peut s’en trouver affectée.", - "button_validate": "J'ai compris", + "partner_issue_modal": { + "title": "Attention\u00a0!", + "error_connect_gaz": "La connexion à vos données de <span class='gaz'>gaz</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='gaz'>GRDF</span> ou dans notre service)", + "error_connect_elec": "La connexion à vos données d'<span class='elec'>électricité</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='elec'>Enedis</span> ou dans notre service)", + "error_connect_water": "La connexion à vos données d'<span class='water'>eau</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='water'>Eau Publique du Grand Lyon</span> ou dans notre service)", + "additional_text": "La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>", "ok": "Ok" } }, @@ -297,7 +298,7 @@ "consumption_visualizer": { "missing_data": "Données manquantes", "no_data": "Pas de données", - "why_no_data": "Pourquoi n'ai-je pas de données ?", + "why_no_data": "Pourquoi n'ai-je pas de données\u00a0?", "last_data": "Dernières données", "last_valid_data": "Dernières données disponibles", "last_valid_data_multi": "Dernières données complètes", @@ -313,7 +314,7 @@ }, "modal": { "window_title": "info estimation des prix", - "title": "Comment sont estimés les prix ?", + "title": "Comment sont estimés les prix\u00a0?", "close": "Fermer la fenêtre", "part1": "Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. ", "part2": "Tarifs moyens retenus :", @@ -335,7 +336,7 @@ "duel": { "global_error": "Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis", "button_go_back": "Retour", - "average_info": "%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?", + "average_info": "%{average} euros étant votre moyenne actuelle, relevez-vous le défi\u00a0?", "button_start": "Allons-y !", "goal1": "Faites moins que votre moyenne actuelle sur %{durationInDays} jours", "goal2": "pour gagner le badge %{title}", @@ -476,7 +477,7 @@ "ecogesture_form": { "heating_type": { "title": "Chauffage", - "question": "Quel est votre type de chauffage ?", + "question": "Quel est votre type de chauffage\u00a0?", "individual": "Individuel", "collective": "Collectif" }, @@ -573,7 +574,7 @@ }, "help": { - "title_help": "Besoin d'aide ?", + "title_help": "Besoin d'aide\u00a0?", "read_help": "Accéder au Service d'Assistance Utilisateur" }, "feedback": { @@ -618,14 +619,14 @@ }, "gcu": { "title": "Conditions générales d’utilisation du service", - "subtitle": "Envie de prendre le temps de relire ces CGU ces Conditions Générales d’Utilisation plus tard ? Vous pourrez les retrouver dans la page Options du service.", + "subtitle": "Envie de prendre le temps de relire ces CGU ces Conditions Générales d’Utilisation plus tard\u00a0? Vous pourrez les retrouver dans la page Options du service.", "version": "Version du 12.12.2022", "content": { - "title1": "Ecolyo, késako ?", + "title1": "Ecolyo, késako\u00a0?", "part1_1": "Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.", "part1_2": "C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à -dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.", "part1_3": "Tous les termes « techniques » sont définis en bas de page.", - "title2": "Quelles fonctionnalités le service propose-t-il ?", + "title2": "Quelles fonctionnalités le service propose-t-il\u00a0?", "part2_1": "La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).", "part2_2": "Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages\u00a0: ", "part2_2_list1": "Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.", @@ -633,23 +634,23 @@ "part2_2_list3": "Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.", "part2_3": "Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.", "part2_4": "Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.", - "title3": "Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?", + "title3": "Comment ai-je accès à mes données d’électricité, de gaz et d’eau\u00a0?", "part3_1": "Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).", - "part3_2": "Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau du Grand Lyon.", + "part3_2": "Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.", "part3_3": "Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.", - "part3_4": "Il vous faudra donc avoir un compte chez GRDF et Eau du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.", - "title4": "Ecolyo se trouve dans un cloud personnel Grand Lyon, qu’est-ce que cela signifie ?", + "part3_4": "Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.", + "title4": "Ecolyo se trouve dans un cloud personnel Grand Lyon, qu’est-ce que cela signifie\u00a0?", "part4_1": "Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cloud Personnel Grand Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maitrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.", "part4_2": "Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">ici</a>.", - "title5": "Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?", + "title5": "Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès\u00a0?", "part5_1": "Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là , pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement\u00a0? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.", "part5_2": "Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.", "part5_3": "Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : ", "part5_3_list1": "Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).", "part5_3_list2": "Pour supprimer l’ensemble de vos données ainsi que votre espace personnel Grand Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.", "part5_4": "Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.", - "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.", - "title6": "Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?", + "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.", + "title6": "Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment\u00a0?", "part6_1": "Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Grand Lyon.", "part6_2": "Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.", "part6_3": "La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon. Elle utilise cet email afin de vous tenir informé·e :", @@ -658,14 +659,14 @@ "part6_3_list3": "De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.", "part6_4": "Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.", "part6_5": "Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.", - "title8": "Encore des questions ?", + "title8": "Encore des questions\u00a0?", "part8_1": "N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.", "part8_2": "Dernière option, contactez-nous directement à <a href=\"mailto:ecolyo@grandlyon.com\">ecolyo(at)grandlyon.com</a>.", "title9": "LEXIQUE", "part9_1_title": "Cloud personnel Grand Lyon : ", "part9_1_content": "Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.", "part9_2_title": "Connecteur : ", - "part9_2_content": "Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau du Grand Lyon.", + "part9_2_content": "Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau Publique du Grand Lyon.", "part9_3_title": "Compteur communicant : ", "part9_3_content": "Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).", "part9_4_title": "Fournisseur : ", @@ -745,7 +746,7 @@ "mismatch": { "title": "Vos données n'ont pas pu être récupérées.", "text1": "Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.", - "text2": "Reconfigurer mon connecteur ?", + "text2": "Reconfigurer mon connecteur\u00a0?", "text3": "La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées." }, "error_data_electricity": "Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.", @@ -765,7 +766,7 @@ "button_understood": "J'ai compris", "button_come_back_later": "Revenir plus tard", "show_common_error": "Voir les erreurs récurrentes", - "show_common_error_list": "<span style=\"text-align:left; font-weight:700;\">Le problème peut provenir des cas suivants :</span> <ul style=\"text-align:left;\"><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span style=\"color:#E3B82A; font-weight:700;\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li> Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li> Avez-vous bien entré le <span style=\"color:#E3B82A; font-weight:700;\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p style=\"text-align:center; font-style: italic; font-weight:400; font-size: 0.9rem;\">Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div style=\"text-align:center; font-weight:700;\">Avez-vous pensez à vérifier ces informations ?</div>", + "show_common_error_list": "<span style=\"text-align:left; font-weight:700;\">Le problème peut provenir des cas suivants :</span> <ul style=\"text-align:left;\"><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span style=\"color:#E3B82A; font-weight:700;\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret\u00a0? Tentez sans le tiret.</li><li> Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li> Avez-vous bien entré le <span style=\"color:#E3B82A; font-weight:700;\">numéro de votre compteur</span> (PDL)\u00a0? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p style=\"text-align:center; font-style: italic; font-weight:400; font-size: 0.9rem;\">Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div style=\"text-align:center; font-weight:700;\">Avez-vous pensez à vérifier ces informations\u00a0?</div>", "accessibility": { "window_title": "Fenêtre d'attente de connexion", "button_close": "Fermer la fenêtre" @@ -781,8 +782,8 @@ "2": "Veuillez re-donner votre accord pour que GRDF nous transmette vos données de consommation." }, "text2": { - "0": "Souhaitez-vous renouveler votre accord dès maintenant pour un an ?", - "2": "Voulez-vous donner votre accord sur votre compte GRDF maintenant ?" + "0": "Souhaitez-vous renouveler votre accord dès maintenant pour un an\u00a0?", + "2": "Voulez-vous donner votre accord sur votre compte GRDF maintenant\u00a0?" }, "later": "Plus tard", "go": "J'y vais", @@ -792,7 +793,7 @@ "delete_grdf_modal": { "text1": "La suppression de la connexion avec GRDF s’accompagne de la suppression de votre consentement à partager vos données gaz avec Ecolyo.", "text2": "Si vous souhaitez vous reconnecter, il vous faudra re-donner votre accord pour que GRDF nous transmette vos données de consommation.", - "text3": "Voulez-vous supprimer votre connexion et votre consentement à GRDF ?", + "text3": "Voulez-vous supprimer votre connexion et votre consentement à GRDF\u00a0?", "cancel": "Plus tard", "go": "Oui" }, @@ -820,7 +821,7 @@ "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, eslint-config-cozy-app, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.", "title2": "Traitement des données personnelles et droit d’accès, de modification et de suppression", "part2": "Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : ", - "part2-1": "Les partenaires du service GRDF et Eau du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.", + "part2-1": "Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.", "part2-2": "Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.", "part2-3": "La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : ", "part2-3-1": "Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;", @@ -829,7 +830,7 @@ "part2-3-4": "Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.", "part2-3-5": "Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\"https://ecolyo.com/cloud_statistiques.html\">ici</a>).", "part2-4": "La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.", - "part2-5": "L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.", + "part2-5": "L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.", "part2-6": "L’utilisateur est donc le seul à accéder :", "part2-6-1": "À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.", "part2-6-2": "À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.", @@ -915,7 +916,7 @@ "info1": "Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.", "info2": "" }, - "button_validate": "Aller sur EGL" + "button_validate": "Aller sur EPGL" }, "gas": { "step1": { @@ -976,13 +977,13 @@ "multi_choices": "Plusieurs réponses possibles", "housing_type": { "title": "Logement", - "question": "De quel type de logement disposez-vous ?", + "question": "De quel type de logement disposez-vous\u00a0?", "individual_house": "Maison individuelle", "appartment": "Appartement" }, "construction_year": { "title": "Construction", - "question": "Quelle est son année de construction ?", + "question": "Quelle est son année de construction\u00a0?", "text_before_1948": "Construit avant 1948", "text_between_1948_and_1974": "Construit entre 1948 et 1974", "text_between_1975_and_1989": "Construit entre 1975 et 1989", @@ -1002,16 +1003,16 @@ }, "area": { "title": "Surface", - "question": "Quelle est sa surface en m² ?", + "question": "Quelle est sa surface en m²\u00a0?", "name": " m²" }, "occupants_number": { "title": "Nombre d'occupants", - "question": "Combien il y a-t-il d'occupants ?" + "question": "Combien il y a-t-il d'occupants\u00a0?" }, "outside_facing_walls": { "title": "Murs extérieurs", - "question": "Combien de façades donnent sur l'extérieur ?", + "question": "Combien de façades donnent sur l'extérieur\u00a0?", "text": { "single": " façade donne sur l'extérieur", "multi": " façades donnent sur l'extérieur" @@ -1023,7 +1024,7 @@ }, "floor": { "title": "Étage", - "question": "À quel étage est votre appartement ?", + "question": "À quel étage est votre appartement\u00a0?", "ground_floor": "Au rez-de-chaussée", "intermediate_floor": "Étage intermédiaire", "last_floor": "Dernier étage", @@ -1031,13 +1032,13 @@ }, "heating": { "title": "Chauffage", - "question": "Quel est votre type de chauffage ?", + "question": "Quel est votre type de chauffage\u00a0?", "individual": "Individuel", "collective": "Collectif" }, "individual_insulation_work": { "title": "Travaux de rénovation", - "question": "Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?", + "question": "Quels travaux de rénovation avez-vous réalisés ces 10 dernières années\u00a0?", "none": "Aucun", "roof_insulation": "Isolation toiture", "window_replacement": "Remplacement fenêtres", @@ -1053,7 +1054,7 @@ }, "ventilation": { "title": "Ventilation double flux", - "question": "Êtes-vous équipé d'une ventilation double flux ?", + "question": "Êtes-vous équipé d'une ventilation double flux\u00a0?", "yes": "Oui", "no": "Non", "unknown": "Je ne sais pas", @@ -1069,7 +1070,7 @@ }, "cold_water": { "title": "Eau", - "question": "Votre eau est-elle comprise dans vos charges collectives ?", + "question": "Votre eau est-elle comprise dans vos charges collectives\u00a0?", "individual": "Non", "collective": "Oui", "individual_text": "Individuelle", @@ -1077,20 +1078,20 @@ }, "hot_water": { "title": "Eau chaude", - "question": "Quel est votre type de production d’eau chaude ?", + "question": "Quel est votre type de production d’eau chaude\u00a0?", "individual": "Individuelle", "collective": "Collective" }, "hot_water_equipment": { "title": "Eau chaude", - "question": "Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?", + "question": "Utilisez-vous l’un de ces équipements pour produire votre eau chaude\u00a0?", "solar": "Chauffe-eau solaire", "thermodynamic": "Chauffe-eau thermodynamique", "other": "Aucun des deux" }, "warming_fluid": { "title": "Source chauffage", - "question": "Quelle source d’énergie principale utilisez-vous pour vous chauffer ?", + "question": "Quelle source d’énergie principale utilisez-vous pour vous chauffer\u00a0?", "0": "Électricité", "2": "Gaz", "3": "Bois", @@ -1103,7 +1104,7 @@ }, "hot_water_fluid": { "title": "Source eau chaude", - "question": "Avec quelle source d’énergie votre eau chaude est-elle produite ?", + "question": "Avec quelle source d’énergie votre eau chaude est-elle produite\u00a0?", "0": "Électricité", "2": "Gaz", "no_fluid_text": "Produite ni par de l'électricité, ni par du gaz", @@ -1112,13 +1113,13 @@ }, "cooking_fluid": { "title": "Source cuisson", - "question": "Quel mode de cuisson principal utilisez-vous ?", + "question": "Quel mode de cuisson principal utilisez-vous\u00a0?", "0": "Électricité", "2": "Gaz" }, "update_date": { "title": "Date de prise d'effet", - "question": "A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?" + "question": "A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données\u00a0?" }, "fluidType": { "0": "Électricité", @@ -1128,7 +1129,8 @@ "form": { "button_previous": "Précédent", "button_next": "Suivant", - "button_end": "Terminer" + "button_end": "Terminer", + "button_loading": "Chargement..." }, "finished": { "title": "Terminé !", @@ -1150,7 +1152,7 @@ "export": { "title_export": "Télécharger mes données", "text1": "Vous allez télécharger l'historique mensuel de vos fluides sélectionnés", - "fluid_select": "Pour quel(s) fluide(s) souhaitez vous exporter vos données ?", + "fluid_select": "Pour quel(s) fluide(s) souhaitez vous exporter vos données\u00a0?", "no_data": "Vous n'avez aucune donnée de fluide...", "button_download": "Télécharger", "month": "Mois", @@ -1262,7 +1264,7 @@ } }, "unsubscribe": { - "title": "Êtes-vous sûr de ne plus vouloir recevoir notre email mensuel ?", + "title": "Êtes-vous sûr de ne plus vouloir recevoir notre email mensuel\u00a0?", "content": "Dans ce cas, vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.", "button_text": "Oui, je me désabonne", "button_accessibility": "Bouton de désinscription" diff --git a/src/migrations/migration.data.ts b/src/migrations/migration.data.ts index 62fa67e93d9445a8cf05988f2079321975815433..06a3a1b5b2bf46746da60bd6f64199b75904b90c 100644 --- a/src/migrations/migration.data.ts +++ b/src/migrations/migration.data.ts @@ -294,7 +294,7 @@ export const migrations: Migration[] = [ releaseNotes: null, docTypes: PROFILE_DOCTYPE, run: async (_client: Client, docs: any[]): Promise<Profile[]> => { - return docs.map((doc: Profile) => { + return docs.map(doc => { doc.partnersIssueDate = DateTime.local() .minus({ day: 1 }) .startOf('day') @@ -547,4 +547,27 @@ export const migrations: Migration[] = [ run: async (): Promise<any> => {}, isEmpty: true, }, + { + baseSchemaVersion: 21, + targetSchemaVersion: 22, + appVersion: '2.0.3', + description: + 'Profil now contains partnersIssueSeenDates in order to handle each partners issue date. Also removes previous partnersIssueDate', + releaseNotes: null, + docTypes: PROFILE_DOCTYPE, + run: async (_client: Client, docs: any[]): Promise<Profile[]> => { + return docs.map(doc => { + doc.partnersIssueSeenDate = { + enedis: DateTime.local().minus({ day: 1 }).startOf('day'), + egl: DateTime.local().minus({ day: 1 }).startOf('day'), + grdf: DateTime.local().minus({ day: 1 }).startOf('day'), + } + if (doc.partnersIssueDate) { + delete doc.partnersIssueDate + } + // TODO remove this ? + return doc + }) + }, + }, ] diff --git a/src/models/fluid.model.ts b/src/models/fluid.model.ts index 812d6e59e61e2852b3f74c5d564fc32bcbbe87e5..2994de62dc4b3ada6fcc0f347872a937964bba18 100644 --- a/src/models/fluid.model.ts +++ b/src/models/fluid.model.ts @@ -1,6 +1,6 @@ -import { DateTime } from 'luxon' import { FluidState, FluidType } from 'enum/fluid.enum' -import { Konnector, Trigger, Account, KonnectorConfig } from 'models' +import { DateTime } from 'luxon' +import { Account, Konnector, KonnectorConfig, Trigger } from 'models' import { TriggerState } from './trigger.model' export interface FluidConnection { @@ -15,6 +15,7 @@ export interface FluidConnection { export interface FluidStatus { fluidType: FluidType status: FluidState + maintenance: boolean firstDataDate: DateTime | null lastDataDate: DateTime | null connection: FluidConnection diff --git a/src/models/global.model.ts b/src/models/global.model.ts index 4fef5e1e9e6743aa2650c297b0da25ce1d6e47ca..0af069136897307a2aa5830d33d6334e1d2b95d1 100644 --- a/src/models/global.model.ts +++ b/src/models/global.model.ts @@ -17,7 +17,11 @@ export interface GlobalState { fluidStatus: FluidStatus[] fluidTypes: FluidType[] customPopupModal: CustomPopup - openPartnersIssueModal: boolean + openPartnersIssueModal: { + enedis: boolean + egl: boolean + grdf: boolean + } shouldRefreshConsent: boolean sgeConnect: SgeStore } diff --git a/src/models/profile.model.ts b/src/models/profile.model.ts index 8478e1b66d91beaa0375949e09b4deb3e277445a..8950b1d2292130b18ae1a21ed4d42b31524a0c50 100644 --- a/src/models/profile.model.ts +++ b/src/models/profile.model.ts @@ -22,7 +22,11 @@ export interface ProfileEntity { isProfileEcogestureCompleted: boolean onboarding: Onboarding mailToken: string - partnersIssueDate: string + partnersIssueSeenDate: { + enedis: string + egl: string + grdf: string + } haveSeenEcogestureModal: boolean activateHalfHourDate: string customPopupDate: string @@ -35,13 +39,17 @@ export interface Profile ProfileEntity, | 'lastConnectionDate' | 'monthlyAnalysisDate' - | 'partnersIssueDate' + | 'partnersIssueSeenDate' | 'activateHalfHourDate' | 'customPopupDate' > { lastConnectionDate: DateTime monthlyAnalysisDate: DateTime - partnersIssueDate: DateTime + partnersIssueSeenDate: { + enedis: DateTime + egl: DateTime + grdf: DateTime + } customPopupDate: DateTime activateHalfHourDate: DateTime } diff --git a/src/services/environement.service.spec.ts b/src/services/environement.service.spec.ts index 02799398bd98156abbeeaa72b1c30edffc3345a0..4b747400619f7c59534ccfaf0cb749a3a3610ea8 100644 --- a/src/services/environement.service.spec.ts +++ b/src/services/environement.service.spec.ts @@ -22,7 +22,7 @@ describe('Environement service', () => { const result = environmentService.isProduction() expect(result).toEqual(false) const url = environmentService.getPublicURL() - expect(url).toEqual('https://ecolyo-agent-rec.grandlyon.com') + expect(url).toEqual('https://ecolyo-agent-rec.apps.grandlyon.com') }) }) diff --git a/src/services/environment.service.ts b/src/services/environment.service.ts index ab969e750bb0058e5db0e7ed7852414d2b84e3bb..624143e847baf9c78daf0e6cd031d22a054cfa0e 100644 --- a/src/services/environment.service.ts +++ b/src/services/environment.service.ts @@ -28,7 +28,7 @@ export default class EnvironmentService { if (!this.isAlpha()) { return 'https://ecolyo-agent.apps.grandlyon.com' } else { - return 'https://ecolyo-agent-rec.grandlyon.com' + return 'https://ecolyo-agent-rec.apps.grandlyon.com' } } } diff --git a/src/services/fluid.service.spec.ts b/src/services/fluid.service.spec.ts index 3386a9e185d6e3a7a0cfcccb9d015aa4e4f676bd..aa83611fc7c499675af2b691084f923e6d2b647d 100644 --- a/src/services/fluid.service.spec.ts +++ b/src/services/fluid.service.spec.ts @@ -1,16 +1,13 @@ -import FluidService from './fluid.service' -import mockClient from '../../tests/__mocks__/client' +/* eslint-disable camelcase */ +import { FluidState, FluidType } from 'enum/fluid.enum' +import { DateTime } from 'luxon' +import { FluidStatus } from 'models' import { accountsData } from '../../tests/__mocks__/accountsData.mock' +import mockClient from '../../tests/__mocks__/client' import { konnectorsData } from '../../tests/__mocks__/konnectorsData.mock' import { triggersData } from '../../tests/__mocks__/triggersData.mock' import { triggerStateData } from '../../tests/__mocks__/triggerStateData.mock' -import { DateTime } from 'luxon' -import { FluidState, FluidType } from 'enum/fluid.enum' -import { FluidStatus } from 'models' -import { - mockPartnersInfoActivated, - mockPartnersInfoDisabled, -} from '../../tests/__mocks__/fluidStatusData.mock' +import FluidService from './fluid.service' const mockGetAccountByType = jest.fn() jest.mock('./account.service', () => { @@ -64,7 +61,7 @@ const mockDataDates: (DateTime | null)[] = [ }), ] -describe('FLuid service', () => { +describe('Fluid service', () => { const fluidService = new FluidService(mockClient) beforeEach(() => { @@ -82,6 +79,7 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.ERROR, + maintenance: false, firstDataDate: mockDataDates[FluidType.ELECTRICITY], lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { @@ -103,6 +101,7 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.ERROR, + maintenance: false, firstDataDate: mockDataDates[FluidType.WATER], lastDataDate: mockDataDates[FluidType.WATER], connection: { @@ -113,7 +112,7 @@ describe('FLuid service', () => { shouldLaunchKonnector: false, isUpdating: false, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, slug: 'eglgrandlyon', siteLink: @@ -125,6 +124,7 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.ERROR, + maintenance: false, firstDataDate: mockDataDates[FluidType.GAS], lastDataDate: mockDataDates[FluidType.GAS], connection: { @@ -168,6 +168,7 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: mockDataDates[FluidType.ELECTRICITY], lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { @@ -189,6 +190,7 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: mockDataDates[FluidType.WATER], lastDataDate: mockDataDates[FluidType.WATER], connection: { @@ -199,7 +201,7 @@ describe('FLuid service', () => { shouldLaunchKonnector: false, isUpdating: false, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, slug: 'eglgrandlyon', siteLink: @@ -211,6 +213,7 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: mockDataDates[FluidType.GAS], lastDataDate: mockDataDates[FluidType.GAS], connection: { @@ -254,6 +257,7 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: mockDataDates[FluidType.ELECTRICITY], lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { @@ -275,6 +279,7 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: mockDataDates[FluidType.WATER], lastDataDate: mockDataDates[FluidType.WATER], connection: { @@ -285,7 +290,7 @@ describe('FLuid service', () => { shouldLaunchKonnector: false, isUpdating: false, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, slug: 'eglgrandlyon', siteLink: @@ -297,6 +302,7 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: mockDataDates[FluidType.GAS], lastDataDate: mockDataDates[FluidType.GAS], connection: { @@ -340,6 +346,7 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: mockDataDates[FluidType.ELECTRICITY], lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { @@ -361,6 +368,7 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: mockDataDates[FluidType.WATER], lastDataDate: mockDataDates[FluidType.WATER], connection: { @@ -371,7 +379,7 @@ describe('FLuid service', () => { shouldLaunchKonnector: false, isUpdating: false, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, slug: 'eglgrandlyon', siteLink: @@ -383,6 +391,7 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: mockDataDates[FluidType.GAS], lastDataDate: mockDataDates[FluidType.GAS], connection: { @@ -427,6 +436,7 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.ERROR, + maintenance: false, firstDataDate: _mockDataDates[FluidType.ELECTRICITY], lastDataDate: _mockDataDates[FluidType.ELECTRICITY], connection: { @@ -448,6 +458,7 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -458,7 +469,7 @@ describe('FLuid service', () => { shouldLaunchKonnector: false, isUpdating: false, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, slug: 'eglgrandlyon', siteLink: @@ -470,6 +481,7 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.NOT_CONNECTED, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -510,6 +522,20 @@ describe('FLuid service', () => { const result: FluidStatus[] = await fluidService.getFluidStatus() expect(result).toEqual(mockResult) }) + + it('should return fluids in maintenance', async () => { + mockFetchAllFirstDateData.mockResolvedValue(mockDataDates) + mockFetchAllLastDateData.mockResolvedValue(mockDataDates) + const fluidStatus = await fluidService.getFluidStatus({ + egl_failure: true, + enedis_failure: true, + grdf_failure: true, + notification_activated: true, + }) + expect(fluidStatus[0].maintenance).toBeTruthy() + expect(fluidStatus[1].maintenance).toBeTruthy() + expect(fluidStatus[2].maintenance).toBeTruthy() + }) }) describe('getOldFluidData method', () => { @@ -653,165 +679,5 @@ describe('FLuid service', () => { const result: FluidType[] = await FluidService.getOldFluidData([]) expect(result).toEqual([]) }) - it('should return the fluids concerned by partnerIssue', async () => { - const mockFluidStatus: FluidStatus[] = [ - { - fluidType: FluidType.ELECTRICITY, - status: FluidState.PARTNER_ISSUE, - firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { - keepLocalTime: true, - }), - lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { - keepLocalTime: true, - }), - connection: { - konnector: konnectorsData[0], - account: accountsData[0], - trigger: triggersData[0], - triggerState: triggerStateData, - shouldLaunchKonnector: false, - isUpdating: false, - konnectorConfig: { - name: 'Enedis', - oauth: false, - slug: 'enedissgegrandlyon', - siteLink: 'https://mon-compte-client.enedis.fr/', - activation: 'https://mon-compte-particulier.enedis.fr/donnees/', - }, - }, - }, - { - fluidType: FluidType.WATER, - status: FluidState.ERROR_LOGIN_FAILED, - firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { - keepLocalTime: true, - }), - lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { - keepLocalTime: true, - }), - connection: { - konnector: konnectorsData[0], - account: accountsData[0], - trigger: triggersData[0], - triggerState: triggerStateData, - shouldLaunchKonnector: false, - isUpdating: false, - konnectorConfig: { - name: 'Eau du Grand Lyon', - oauth: true, - slug: 'eglgrandlyon', - siteLink: '', - activation: '', - }, - }, - }, - ] - const result: FluidType[] = - await fluidService.getFluidsConcernedByPartnerIssue(mockFluidStatus) - expect(result).toEqual([FluidType.ELECTRICITY]) - }) - it('should return the fluids concerned by partnerIssue', async () => { - const mockFluidStatus: FluidStatus[] = [ - { - fluidType: FluidType.ELECTRICITY, - status: FluidState.PARTNER_ISSUE, - firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { - keepLocalTime: true, - }), - lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { - keepLocalTime: true, - }), - connection: { - konnector: konnectorsData[0], - account: accountsData[0], - trigger: triggersData[0], - triggerState: triggerStateData, - shouldLaunchKonnector: false, - isUpdating: false, - konnectorConfig: { - name: 'Enedis', - oauth: false, - slug: 'enedissgegrandlyon', - siteLink: 'https://mon-compte-client.enedis.fr/', - activation: 'https://mon-compte-particulier.enedis.fr/donnees/', - }, - }, - }, - { - fluidType: FluidType.WATER, - status: FluidState.ERROR_LOGIN_FAILED, - firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { - keepLocalTime: true, - }), - lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { - keepLocalTime: true, - }), - connection: { - konnector: konnectorsData[0], - account: accountsData[0], - trigger: triggersData[0], - triggerState: triggerStateData, - shouldLaunchKonnector: false, - isUpdating: false, - konnectorConfig: { - name: 'Eau du Grand Lyon', - oauth: true, - slug: 'eglgrandlyon', - siteLink: '', - activation: '', - }, - }, - }, - { - fluidType: FluidType.GAS, - status: FluidState.ERROR_LOGIN_FAILED, - firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { - keepLocalTime: true, - }), - lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { - keepLocalTime: true, - }), - connection: { - konnector: konnectorsData[0], - account: accountsData[0], - trigger: triggersData[0], - triggerState: triggerStateData, - shouldLaunchKonnector: false, - isUpdating: false, - konnectorConfig: { - name: 'GRDF', - oauth: true, - slug: 'grdfgrandlyon', - siteLink: '', - activation: '', - }, - }, - }, - ] - const result: boolean = fluidService.isFluidInPartnerIssue( - FluidType.ELECTRICITY, - mockFluidStatus[FluidType.ELECTRICITY].status, - mockPartnersInfoActivated - ) - expect(result).toEqual(true) - const result2: boolean = fluidService.isFluidInPartnerIssue( - FluidType.WATER, - FluidState.PARTNER_ISSUE, - mockPartnersInfoActivated - ) - expect(result2).toEqual(true) - const result3: boolean = fluidService.isFluidInPartnerIssue( - FluidType.GAS, - FluidState.PARTNER_ISSUE, - mockPartnersInfoActivated - ) - expect(result3).toEqual(true) - const result4: boolean = fluidService.isFluidInPartnerIssue( - FluidType.GAS, - FluidState.PARTNER_ISSUE, - mockPartnersInfoDisabled - ) - expect(result4).toEqual(false) - }) }) }) diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts index 36d865381cf38a3d9897295b67b38217c476c85a..8376c496b1a48efa960b4f62241560c9c3b0a320 100644 --- a/src/services/fluid.service.ts +++ b/src/services/fluid.service.ts @@ -1,14 +1,13 @@ -import { FluidState, FluidType } from 'enum/fluid.enum' import { Client } from 'cozy-client' - +import { FluidState, FluidType } from 'enum/fluid.enum' +import { DateTime } from 'luxon' import { Account, FluidStatus, Konnector, Trigger, TriggerState } from 'models' +import { PartnersInfo } from 'models/partnersInfo.model' +import AccountService from 'services/account.service' +import ConsumptionService from 'services/consumption.service' import ConfigService from 'services/fluidConfig.service' import KonnectorService from 'services/konnector.service' -import ConsumptionService from 'services/consumption.service' -import AccountService from 'services/account.service' import TriggerService from 'services/triggers.service' -import { DateTime } from 'luxon' -import { PartnersInfo } from 'models/partnersInfo.model' export default class FluidService { private _client: Client @@ -21,68 +20,34 @@ export default class FluidService { konnector: Konnector | null, state: TriggerState | null ): FluidState => { - if (konnector) { - if (state) { - switch (state.status) { - case 'done': - return FluidState.DONE - case 'errored': - if (state?.last_error === 'LOGIN_FAILED') - return FluidState.ERROR_LOGIN_FAILED - else return FluidState.ERROR - default: - return FluidState.NOT_CONNECTED - } - } else { - return FluidState.NOT_CONNECTED - } + if (!konnector) return FluidState.KONNECTOR_NOT_FOUND + if (!state) { + return FluidState.NOT_CONNECTED } else { - return FluidState.KONNECTOR_NOT_FOUND + switch (state.status) { + case 'done': + return FluidState.DONE + case 'errored': + if (state?.last_error === 'LOGIN_FAILED') + return FluidState.ERROR_LOGIN_FAILED + else return FluidState.ERROR + default: + return FluidState.NOT_CONNECTED + } } } - public isFluidInPartnerIssue = ( + public parseFluidMaintenance( fluidType: FluidType, - fluidState: FluidState, - partnersInfo: PartnersInfo - ) => { - if ( - fluidType === FluidType.GAS && - partnersInfo.grdf_failure && - fluidState !== FluidState.NOT_CONNECTED && - fluidState !== FluidState.KONNECTOR_NOT_FOUND - ) { - return true - } - if ( - fluidType === FluidType.ELECTRICITY && - partnersInfo.enedis_failure && - fluidState !== FluidState.NOT_CONNECTED && - fluidState !== FluidState.KONNECTOR_NOT_FOUND - ) { - return true - } - if ( - fluidType === FluidType.WATER && - partnersInfo.egl_failure && - fluidState !== FluidState.NOT_CONNECTED && - fluidState !== FluidState.KONNECTOR_NOT_FOUND - ) { - return true - } - return false - } - - public getFluidsConcernedByPartnerIssue = async ( - statusArray: FluidStatus[] - ): Promise<FluidType[]> => { - const concernedFluids: FluidType[] = [] - statusArray.forEach(fluid => { - if (fluid.status === FluidState.PARTNER_ISSUE) { - concernedFluids.push(fluid.fluidType) - } - }) - return concernedFluids + partnersInfo?: PartnersInfo + ) { + return Boolean( + partnersInfo?.notification_activated && + ((fluidType === FluidType.GAS && partnersInfo.grdf_failure) || + (fluidType === FluidType.ELECTRICITY && + partnersInfo.enedis_failure) || + (fluidType === FluidType.WATER && partnersInfo.egl_failure)) + ) } public getFluidStatus = async ( @@ -150,15 +115,11 @@ export default class FluidService { const result: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, - status: - partnersInfo?.notification_activated && - this.isFluidInPartnerIssue( - FluidType.ELECTRICITY, - this.parseFluidStatus(elecKonnector, elecStatus), - partnersInfo - ) - ? FluidState.PARTNER_ISSUE - : this.parseFluidStatus(elecKonnector, elecStatus), + status: this.parseFluidStatus(elecKonnector, elecStatus), + maintenance: this.parseFluidMaintenance( + FluidType.ELECTRICITY, + partnersInfo + ), firstDataDate: firstDataDates[FluidType.ELECTRICITY], lastDataDate: lastDataDates[FluidType.ELECTRICITY], connection: { @@ -173,15 +134,8 @@ export default class FluidService { }, { fluidType: FluidType.WATER, - status: - partnersInfo?.notification_activated && - this.isFluidInPartnerIssue( - FluidType.WATER, - this.parseFluidStatus(waterKonnector, waterStatus), - partnersInfo - ) - ? FluidState.PARTNER_ISSUE - : this.parseFluidStatus(waterKonnector, waterStatus), + status: this.parseFluidStatus(waterKonnector, waterStatus), + maintenance: this.parseFluidMaintenance(FluidType.WATER, partnersInfo), firstDataDate: firstDataDates[FluidType.WATER], lastDataDate: lastDataDates[FluidType.WATER], connection: { @@ -196,15 +150,8 @@ export default class FluidService { }, { fluidType: FluidType.GAS, - status: - partnersInfo?.notification_activated && - this.isFluidInPartnerIssue( - FluidType.GAS, - this.parseFluidStatus(gasKonnector, gasStatus), - partnersInfo - ) - ? FluidState.PARTNER_ISSUE - : this.parseFluidStatus(gasKonnector, gasStatus), + status: this.parseFluidStatus(gasKonnector, gasStatus), + maintenance: this.parseFluidMaintenance(FluidType.GAS, partnersInfo), firstDataDate: firstDataDates[FluidType.GAS], lastDataDate: lastDataDates[FluidType.GAS], connection: { diff --git a/src/services/partnersInfo.service.ts b/src/services/partnersInfo.service.ts index 867f42f41710c64ccd0cca0d2f536a790da0dd9d..26d814d8f82a0ecab9df128624bb846c6a5e5b3d 100644 --- a/src/services/partnersInfo.service.ts +++ b/src/services/partnersInfo.service.ts @@ -2,8 +2,8 @@ import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' import logger from 'cozy-logger' import { - REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO, - REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC, + REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO, + REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC, } from 'doctypes/remote/org.ecolyo.agent.partners.info' import { PartnersInfo } from 'models/partnersInfo.model' import logApp from 'utils/logger' @@ -25,8 +25,8 @@ export default class PartnersInfoService { public async getPartnersInfo(): Promise<PartnersInfo | undefined> { const env = new EnvironmentService() const remoteUrl = env.isProduction() - ? REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO - : REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC + ? REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO + : REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC try { logApp.info('[Initialization] Getting PartnersInfo') const result = await this._client diff --git a/src/services/profile.service.spec.ts b/src/services/profile.service.spec.ts index e5b97cc26c71c7ea3c098b85ec0ab83e8d596838..8b63298aac546600d365c10b3d0a165c11cdda65 100644 --- a/src/services/profile.service.spec.ts +++ b/src/services/profile.service.spec.ts @@ -1,9 +1,9 @@ -import ProfileService from './profile.service' import { QueryResult } from 'cozy-client' import { DateTime } from 'luxon' import { Profile } from 'models' -import { profileData } from '../../tests/__mocks__/profile.mock' import mockClient from '../../tests/__mocks__/client' +import { profileData } from '../../tests/__mocks__/profile.mock' +import ProfileService from './profile.service' describe('UserProfile service', () => { const profileService = new ProfileService(mockClient) @@ -62,7 +62,6 @@ describe('UserProfile service', () => { const userProfile = { ...profileData, monthlyAnalysisDate: '2020-11-03T00:00:00.000Z', - partnersIssueDate: '2020-11-03T00:00:00.000Z', customPopupDate: '2020-11-03T00:00:00.000Z', } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -90,9 +89,6 @@ describe('UserProfile service', () => { monthlyAnalysisDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { zone: 'utc', }), - partnersIssueDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { - zone: 'utc', - }), customPopupDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { zone: 'utc', }), diff --git a/src/services/profile.service.ts b/src/services/profile.service.ts index 5bd07d1d7969ed05694177b5fe06fa3da8778366..06f7d644e8277baba9382c98aeb1508902187241 100644 --- a/src/services/profile.service.ts +++ b/src/services/profile.service.ts @@ -1,7 +1,7 @@ import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' -import { Profile, ProfileEntity } from 'models' import { PROFILE_DOCTYPE } from 'doctypes' import { DateTime } from 'luxon' +import { Profile, ProfileEntity } from 'models' export default class ProfileService { private readonly _client: Client @@ -29,7 +29,11 @@ export default class ProfileService { ? this.getDate(profileEntity.monthlyAnalysisDate) : profileEntity.monthlyAnalysisDate, lastConnectionDate: this.getDate(profileEntity.lastConnectionDate), - partnersIssueDate: this.getDate(profileEntity.partnersIssueDate), + partnersIssueSeenDate: { + enedis: this.getDate(profileEntity.partnersIssueSeenDate.enedis), + egl: this.getDate(profileEntity.partnersIssueSeenDate.egl), + grdf: this.getDate(profileEntity.partnersIssueSeenDate.grdf), + }, activateHalfHourDate: this.getDate(profileEntity.activateHalfHourDate), customPopupDate: this.getDate(profileEntity.customPopupDate), } diff --git a/src/services/profileType.service.spec.ts b/src/services/profileType.service.spec.ts index d13bb7b4ab16cbbedbb6096b582ee6cf8a204d94..01fbdce16b87e606f2121a3ca7d500b7b650f8b7 100644 --- a/src/services/profileType.service.spec.ts +++ b/src/services/profileType.service.spec.ts @@ -8,7 +8,9 @@ import { ThreeChoicesAnswer, WarmingType, } from 'enum/profileType.enum' +import { DateTime } from 'luxon' import { ProfileType } from 'models/profileType.model' +import mockClient from '../../tests/__mocks__/client' import { mockCorrectedConsumption, mockEstimatedConsumption, @@ -17,27 +19,25 @@ import { mockMonthConsumption1, mockMonthConsumption2, mockMonthCookingConsumption, - mockMonthElectricSpecificConsumption, mockMonthEcsConsumption1Solar, mockMonthEcsConsumptionOther, mockMonthEcsConsumptionThermo, + mockMonthElectricSpecificConsumption, + mockMonthlyForecastJanuaryTest1WithFullArrays, + mockMonthlyForecastJanuaryTestProfile1, + mockMonthlyForecastJanuaryTestProfile2, + mockMonthlyForecastJanuaryTestProfile3, mockProfileType, mockProfileType1, mockProfileType2, + mockProfileTypeAnswers, mockTestProfile1, mockTestProfile2, mockTestProfile3, - mockwaterRawNeeds, + mockWaterRawNeeds, mockWaterSpreadNeeds, - mockMonthlyForecastJanuaryTestProfile1, - mockMonthlyForecastJanuaryTestProfile2, - mockMonthlyForecastJanuaryTestProfile3, - mockProfileTypeAnswers, - mockMonthlyForecastJanuaryTest1WithFullArrays, } from '../../tests/__mocks__/profileType.mock' import ProfileTypeService from './profileType.service' -import mockClient from '../../tests/__mocks__/client' -import { DateTime } from 'luxon' import ProfileTypeFormService from './profileTypeForm.service' const wrongNumber = 99999 @@ -105,7 +105,7 @@ describe('ProfileType service', () => { mockProfileType, 1 ) - expect(waterRawNeeds).toEqual(mockwaterRawNeeds) + expect(waterRawNeeds).toEqual(mockWaterRawNeeds) }) it('should calculate the water spread needs Consumption', () => { diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts index 044708f409d169f07a339ea2774a9e17ec241121..b9fffafffcfac6cdffe77a633b6b1baaa9a87991 100644 --- a/src/services/queryRunner.service.ts +++ b/src/services/queryRunner.service.ts @@ -111,25 +111,29 @@ export default class QueryRunner { timePeriod: TimePeriod, timeStep: TimeStep ) { - // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 if (timeStep === TimeStep.HALF_AN_HOUR) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 timePeriod.startDate = timePeriod.startDate.plus({ minutes: 30 }) timePeriod.endDate = timePeriod.endDate.plus({ minutes: 30 }) } - const filteredResult = data.data.filter((entry: any) => - this.withinDateBoundaries( + + const filteredResult = data.data.filter((entry: any) => { + // added ternary expression to not send to withinDateBoundaries an hour different than zero when not in half-hour mode + const hour = timeStep === TimeStep.HALF_AN_HOUR ? entry.hour : 0 + const min = timeStep === TimeStep.HALF_AN_HOUR ? entry.minute : 0 + return this.withinDateBoundaries( DateTime.local( entry.year, entry.month || 1, entry.day || 1, - entry.hour, - entry.minute + hour, + min ).setZone('utc', { keepLocalTime: true, }), timePeriod ) - ) + }) return filteredResult } diff --git a/src/store/global/global.actions.ts b/src/store/global/global.actions.ts index 49af36746e21f37acb0e68a5bd6bea35dd9a0b95..c8e6204f68d7a420afeddcd6a6fe31401163ad00 100644 --- a/src/store/global/global.actions.ts +++ b/src/store/global/global.actions.ts @@ -68,7 +68,11 @@ interface ShowReleaseNotes { interface SetPartnersIssue { type: typeof SET_PARTNERS_ISSUE - payload?: boolean + payload?: { + enedis: boolean + egl: boolean + grdf: boolean + } } interface SetCustomPopup { @@ -80,7 +84,7 @@ interface SetShouldRefreshConsent { type: typeof SET_SHOULD_REFRESH_CONSENT payload?: boolean } -interface UpdateSGEConnect { +export interface UpdateSGEConnect { type: typeof UPDATE_SGE_CONNECT payload?: SgeStore } @@ -177,9 +181,11 @@ export function updateTermValidation( } } -export function setPartnersIssue( - openPartnersIssueModal: boolean -): GlobalActionTypes { +export function setPartnersIssue(openPartnersIssueModal: { + enedis: boolean + egl: boolean + grdf: boolean +}): GlobalActionTypes { return { type: SET_PARTNERS_ISSUE, payload: openPartnersIssueModal, diff --git a/src/store/global/global.reducer.spec.ts b/src/store/global/global.reducer.spec.ts index b2fcbc29422955ce7a94b48902f5422d87921056..a0bb8f62f41b1275c9c295c0b69a2889bf8672a7 100644 --- a/src/store/global/global.reducer.spec.ts +++ b/src/store/global/global.reducer.spec.ts @@ -1,22 +1,23 @@ -import { globalReducer } from './global.reducer' +import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' +import { ScreenType } from 'enum/screen.enum' +import { DateTime } from 'luxon' +import { FluidStatus } from 'models' +import { accountsData } from '../../../tests/__mocks__/accountsData.mock' +import { mockCustomPopup } from '../../../tests/__mocks__/customPopup.mock' +import { konnectorsData } from '../../../tests/__mocks__/konnectorsData.mock' +import { mockInitialGlobalState } from '../../../tests/__mocks__/store' +import { triggersData } from '../../../tests/__mocks__/triggersData.mock' import { CHANGE_SCREEN_TYPE, - TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION, + SET_CUSTOM_POPUP, + SET_FLUID_STATUS, + TOGGLE_ANALYSIS_NOTIFICATION, TOGGLE_CHALLENGE_ACTION_NOTIFICATION, TOGGLE_CHALLENGE_DUEL_NOTIFICATION, - TOGGLE_ANALYSIS_NOTIFICATION, - SET_FLUID_STATUS, - SET_CUSTOM_POPUP, + TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION, } from './global.actions' -import { ScreenType } from 'enum/screen.enum' -import { FluidStatus } from 'models' -import { FluidState, FluidType } from 'enum/fluid.enum' -import { DateTime } from 'luxon' -import { konnectorsData } from '../../../tests/__mocks__/konnectorsData.mock' -import { accountsData } from '../../../tests/__mocks__/accountsData.mock' -import { triggersData } from '../../../tests/__mocks__/triggersData.mock' -import { mockInitialGlobalState } from '../../../tests/__mocks__/store' -import { mockCustomPopup } from '../../../tests/__mocks__/customPopup.mock' +import { globalReducer } from './global.reducer' const mockDataDates: (DateTime | null)[] = [ DateTime.local().setZone('utc', { @@ -131,6 +132,7 @@ describe('global reducer', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.ERROR, + maintenance: false, firstDataDate: mockDataDates[FluidType.ELECTRICITY], lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { @@ -143,7 +145,7 @@ describe('global reducer', () => { konnectorConfig: { name: 'Enedis', oauth: true, - slug: 'enedissgegrandlyon', + slug: FluidSlugType.ELECTRICITY, siteLink: 'https://mon-compte-particulier.enedis.fr/donnees/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -152,6 +154,7 @@ describe('global reducer', () => { { fluidType: FluidType.WATER, status: FluidState.ERROR, + maintenance: false, firstDataDate: mockDataDates[FluidType.WATER], lastDataDate: mockDataDates[FluidType.WATER], connection: { @@ -162,9 +165,9 @@ describe('global reducer', () => { shouldLaunchKonnector: false, isUpdating: false, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, - slug: 'eglgrandlyon', + slug: FluidSlugType.WATER, siteLink: 'https://agence.eaudugrandlyon.com/inscription.aspx#subc-now', activation: '', @@ -174,6 +177,7 @@ describe('global reducer', () => { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: mockDataDates[FluidType.GAS], lastDataDate: mockDataDates[FluidType.GAS], connection: { @@ -186,7 +190,7 @@ describe('global reducer', () => { konnectorConfig: { name: 'GRDF', oauth: true, - slug: 'grdfgrandlyon', + slug: FluidSlugType.GAS, siteLink: 'https://monespace.grdf.fr/monespace/connexion', activation: '', }, diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts index 855bf9ac131cefac73ba9650fd104a5fbd06a727..848faf512645af8b0dc5798479555daf8672fd2a 100644 --- a/src/store/global/global.reducer.ts +++ b/src/store/global/global.reducer.ts @@ -43,6 +43,7 @@ const initialState: GlobalState = { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -64,6 +65,7 @@ const initialState: GlobalState = { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -85,6 +87,7 @@ const initialState: GlobalState = { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -109,8 +112,13 @@ const initialState: GlobalState = { popupEnabled: false, title: '', description: '', + endDate: '', + }, + openPartnersIssueModal: { + enedis: false, + egl: false, + grdf: false, }, - openPartnersIssueModal: false, shouldRefreshConsent: false, sgeConnect: { currentStep: 0, diff --git a/src/store/index.ts b/src/store/index.ts index c7e28758b3055e2cb11a7fe17c3a8a3784788f71..103f7e398aa28c36dcc79da2260c3faae486c129 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,30 +1,30 @@ +import * as Sentry from '@sentry/react' +import { Client } from 'cozy-client' +import { + ChallengeState, + GlobalState, + ModalState, + Profile, + ProfileType, +} from 'models' +import { ChartState } from 'models/chart.model' +import { ProfileEcogesture } from 'models/profileEcogesture.model' import { - createStore, - combineReducers, applyMiddleware, + combineReducers, compose, + createStore, Store, } from 'redux' -import thunkMiddleware from 'redux-thunk' import { composeWithDevTools } from 'redux-devtools-extension' +import thunkMiddleware from 'redux-thunk' import { globalReducer } from 'store/global/global.reducer' -import { profileReducer } from './profile/profile.reducer' -import { profileTypeReducer } from './profileType/profileType.reducer' -import { chartReducer } from './chart/chart.reducer' import { modalReducer } from 'store/modal/modal.reducer' import { challengeReducer } from './challenge/challenge.reducer' -import { - GlobalState, - ModalState, - Profile, - ChallengeState, - ProfileType, -} from 'models' -import { ChartState } from 'models/chart.model' -import { Client } from 'cozy-client' -import { ProfileEcogesture } from 'models/profileEcogesture.model' +import { chartReducer } from './chart/chart.reducer' +import { profileReducer } from './profile/profile.reducer' import { profileEcogestureReducer } from './profileEcogesture/profileEcogesture.reducer' -import * as Sentry from '@sentry/react' +import { profileTypeReducer } from './profileType/profileType.reducer' export interface EcolyoState { global: GlobalState @@ -58,7 +58,7 @@ const configureStore = ( persistedState: any ): Store<AppStore> => { const middlewares = [thunkMiddleware.withExtraArgument({ client })] - const composeEnhancers = composeWithDevTools || compose + const composeEnhancers = composeWithDevTools({ trace: true }) || compose const store: Store<AppStore> = createStore( combineReducers({ diff --git a/src/store/profile/profile.reducer.ts b/src/store/profile/profile.reducer.ts index d0c26e31f1d335be1e9326fb50fefe6c16593a2b..5c3d9433d75c9b740904fe7f2b972d421b497386 100644 --- a/src/store/profile/profile.reducer.ts +++ b/src/store/profile/profile.reducer.ts @@ -1,10 +1,10 @@ +import { DateTime } from 'luxon' +import { Profile } from 'models' import { Reducer } from 'redux' import { - UPDATE_PROFILE, ProfileActionTypes, + UPDATE_PROFILE, } from 'store/profile/profile.actions' -import { Profile } from 'models' -import { DateTime } from 'luxon' const initialState: Profile = { id: '', @@ -14,7 +14,11 @@ const initialState: Profile = { quizHash: '', explorationHash: '', isFirstConnection: false, - partnersIssueDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + partnersIssueSeenDate: { + enedis: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + egl: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + grdf: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + }, lastConnectionDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), customPopupDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), haveSeenLastAnalysis: true, diff --git a/src/styles/base/_layout.scss b/src/styles/base/_layout.scss index ec8ecb32b158d73e194171773c8b290dfa7134cf..977aa5666dd3e1b703ae9ea0b95e787f1fdb0988 100644 --- a/src/styles/base/_layout.scss +++ b/src/styles/base/_layout.scss @@ -41,9 +41,6 @@ body { box-shadow: unset !important; background: unset !important; } -.cv-button { - width: 4.25rem; -} .coz-label { color: #32363f; } diff --git a/src/targets/browser/index.ejs b/src/targets/browser/index.ejs index 3e33cbc8b7c8394f7e2733f647e0bfe7bae03b36..fe3890f3794dda70253d561ca539d84f4e32388e 100644 --- a/src/targets/browser/index.ejs +++ b/src/targets/browser/index.ejs @@ -8,7 +8,7 @@ <!-- PWA Manifest --> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"> - <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, viewport-fit=cover"> <!-- PWA Chrome --> <link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"> <link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"> diff --git a/tests/__mocks__/accountsData.mock.ts b/tests/__mocks__/accountsData.mock.ts index 7b0a6ea948ef619c4360e29ea7525413433db07e..7775e8b618daa1705c820cedd3c6ce13ca193a9b 100644 --- a/tests/__mocks__/accountsData.mock.ts +++ b/tests/__mocks__/accountsData.mock.ts @@ -8,7 +8,7 @@ export const accountsData: Account[] = [ account_type: 'enedissgegrandlyon', name: '', oauth: { - access_token: 'MY_ACCESS_TOCKEN', + access_token: 'MY_ACCESS_TOKEN', expires_at: '2020-10-09T08:00:00.285910671+02:00', refresh_token: '', token_type: 'Bearer', @@ -16,7 +16,7 @@ export const accountsData: Account[] = [ oauth_callback_results: { issued_at: '1592232569642', refresh_token_issued_at: '1592232569642', - scope: '/my_eneids_scope', + scope: '/my_enedis_scope', usage_points_id: '', }, cozyMetadata: { @@ -52,13 +52,13 @@ export const accountsData: Account[] = [ account_type: 'grdfgrandlyon', name: '', oauth: { - access_token: 'MY_ACCESS_TOCKEN', + access_token: 'MY_ACCESS_TOKEN', expires_at: '2020-10-09T08:00:00.285910671+02:00', refresh_token: '', token_type: 'Bearer', }, oauth_callback_results: { - id_token: 'MY_ID_TOCKEN', + id_token: 'MY_ID_TOKEN', pce: '12345678987654', scope: '/my_grdf_scope', }, diff --git a/tests/__mocks__/explorationData.mock.ts b/tests/__mocks__/explorationData.mock.ts index dbc5c702d614817a7284f879841a0df6991b7d40..75e71ac1a5bccf66d8915c80f3003ff2ebfe1867 100644 --- a/tests/__mocks__/explorationData.mock.ts +++ b/tests/__mocks__/explorationData.mock.ts @@ -21,7 +21,7 @@ export const explorationEntity: ExplorationEntity = { export const explorationEntity4: ExplorationEntity = { id: 'EXPLORATION004', state: UserExplorationState.UNLOCKED, - description: 'Dévérouiller les données électricité à la demi-heure', + description: 'Déverrouiller les données électricité à la demi-heure', complementary_description: 'Consulter les données à la demi-heure si déjà fait', target: 1, @@ -30,7 +30,7 @@ export const explorationEntity4: ExplorationEntity = { ecogesture_id: '', fluid_condition: [0], message_success: - 'Vous avez dévérrouillé les données électricité à la demi-heure', + 'Vous avez déverrouillé les données électricité à la demi-heure', } export const explorationEntity4_0: ExplorationEntity = { id: 'EXPLORATION004_0', @@ -89,7 +89,7 @@ export const userExploration1: UserExploration = { export const userExploration4: UserExploration = { id: 'EXPLORATION004', state: 0, - description: 'Dévérrouillez les données électricité à la demi-heure', + description: 'Déverrouillez les données électricité à la demi-heure', complementary_description: 'Consulter les données à la demi-heure si déjà fait', target: 1, @@ -99,7 +99,7 @@ export const userExploration4: UserExploration = { fluid_condition: [0], progress: 0, message_success: - 'Vous avez dévérrouillé les données électricité à la demi-heure', + 'Vous avez déverrouillé les données électricité à la demi-heure', } export const userExploration4_0: UserExploration = { id: 'EXPLORATION004_0', @@ -155,7 +155,7 @@ export const allExplorationEntities: ExplorationEntity[] = [ { id: 'EXPLORATION004', state: 0, - description: 'Dévérrouillez les données électricité à la demi-heure', + description: 'Déverrouillez les données électricité à la demi-heure', complementary_description: 'Consulter les données à la demi-heure si déjà fait', target: 1, @@ -164,7 +164,7 @@ export const allExplorationEntities: ExplorationEntity[] = [ ecogesture_id: '', fluid_condition: [0], message_success: - 'Vous avez consulté ou déverouillé les données électricité à la demi-heure', + 'Vous avez consulté ou déverrouillé les données électricité à la demi-heure', }, { id: 'EXPLORATION005', diff --git a/tests/__mocks__/fluidStatusData.mock.ts b/tests/__mocks__/fluidStatusData.mock.ts index e9c340eba480380d237fdcc29665989eeab09d5b..b86ae51b88dc694cabb41b74bc34fe2426c17f26 100644 --- a/tests/__mocks__/fluidStatusData.mock.ts +++ b/tests/__mocks__/fluidStatusData.mock.ts @@ -183,7 +183,7 @@ export const fluidStatusConnectedData: FluidStatus[] = [ }, }, ] -export const SgeStatusWithAccout: FluidStatus = { +export const SgeStatusWithAccount: FluidStatus = { fluidType: 0, status: FluidState.KONNECTOR_NOT_FOUND, firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { @@ -202,7 +202,7 @@ export const SgeStatusWithAccout: FluidStatus = { account_type: 'enedissgegrandlyon', name: '', oauth: { - access_token: 'MY_ACCESS_TOCKEN', + access_token: 'MY_ACCESS_TOKEN', expires_at: '2020-10-09T08:00:00.285910671+02:00', refresh_token: '', token_type: 'Bearer', @@ -210,7 +210,7 @@ export const SgeStatusWithAccout: FluidStatus = { oauth_callback_results: { issued_at: '1592232569642', refresh_token_issued_at: '1592232569642', - scope: '/my_eneids_scope', + scope: '/my_enedis_scope', usage_points_id: '', }, cozyMetadata: { diff --git a/tests/__mocks__/globalStateData.mock.ts b/tests/__mocks__/globalStateData.mock.ts index 7f57f724b5cd20c78232b43538a5eff0c8dcd535..44350809d4a0d10537ffbc30412287c74c2a2270 100644 --- a/tests/__mocks__/globalStateData.mock.ts +++ b/tests/__mocks__/globalStateData.mock.ts @@ -17,11 +17,16 @@ export const globalStateData: GlobalState = { accepted: false, versionType: 'major', }, - openPartnersIssueModal: false, + openPartnersIssueModal: { + enedis: false, + egl: false, + grdf: false, + }, fluidStatus: [ { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -43,6 +48,7 @@ export const globalStateData: GlobalState = { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -64,6 +70,7 @@ export const globalStateData: GlobalState = { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -96,5 +103,12 @@ export const globalStateData: GlobalState = { dataConsent: false, pdlConfirm: false, shouldLaunchAccount: false, + openSGEForm: false, + }, + customPopupModal: { + title: '', + description: '', + popupEnabled: false, + endDate: '', }, } diff --git a/tests/__mocks__/mockConfig.mock.ts b/tests/__mocks__/mockConfig.mock.ts index a972bca615479316b7db30ca771cab53f5ddd25f..562849cc20b94d6d6fe2b583e27b7b2b3966ace2 100644 --- a/tests/__mocks__/mockConfig.mock.ts +++ b/tests/__mocks__/mockConfig.mock.ts @@ -22,7 +22,7 @@ const mockConfig = { startDate: '2021-01-01T00:00:00.000', dataDelayOffset: 5, konnectorConfig: { - name: 'Eau du Grand Lyon', + name: 'Eau Publique du Grand Lyon', oauth: false, slug: 'eglgrandlyon', siteLink: 'https://www.eaudugrandlyon.com/inscription.aspx#subc-now', diff --git a/tests/__mocks__/profile.mock.ts b/tests/__mocks__/profile.mock.ts index 27df89d8f7ed281b3d3ec8b029e5626f4e41af79..5aa144b8624de319827fed50f712142574a2423c 100644 --- a/tests/__mocks__/profile.mock.ts +++ b/tests/__mocks__/profile.mock.ts @@ -13,9 +13,6 @@ export const profileData: Profile = { isFirstConnection: true, sendConsumptionAlert: false, waterDailyConsumptionLimit: 0, - partnersIssueDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { - zone: 'utc', - }), mailToken: '', lastConnectionDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { zone: 'utc', @@ -37,4 +34,15 @@ export const profileData: Profile = { customPopupDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { zone: 'utc', }), + partnersIssueSeenDate: { + enedis: DateTime.fromISO('2020-11-03T00:00:00.000Z', { + zone: 'utc', + }), + egl: DateTime.fromISO('2020-11-03T00:00:00.000Z', { + zone: 'utc', + }), + grdf: DateTime.fromISO('2020-11-03T00:00:00.000Z', { + zone: 'utc', + }), + }, } diff --git a/tests/__mocks__/profileType.mock.ts b/tests/__mocks__/profileType.mock.ts index 7262c68221dc88bd38669be611993480d7f97eb0..053abe45a2c98527349079023bf15af26b70a2a3 100644 --- a/tests/__mocks__/profileType.mock.ts +++ b/tests/__mocks__/profileType.mock.ts @@ -77,7 +77,7 @@ export const mockMonthCookingConsumption = 17 export const mockMonthElectricSpecificConsumption = 175 export const mockMonthColdWaterConsumption = 4247 -export const mockwaterRawNeeds = 2480 +export const mockWaterRawNeeds = 2480 export const mockWaterSpreadNeeds = 2701 export const mockMonthEcsConsumptionOther = 166 export const mockMonthEcsConsumptionThermo = 110 @@ -106,7 +106,7 @@ export const mockProfileType1: ProfileType = { } export const mockEstimatedConsumption1 = 6450 export const mockCorrectedConsumption1 = 6450 -//For the month of february +//For the month of February export const mockMonthConsumption1 = 1174 export const mockMonthEcsConsumption1Solar = 134 @@ -135,7 +135,7 @@ export const mockProfileType2: ProfileType = { } export const mockEstimatedConsumption2 = 16560 export const mockCorrectedConsumption2 = 15411 -//For the month of january +//For the month of January export const mockMonthConsumption2 = 3000 export const mockTestProfile1: ProfileType = { diff --git a/tests/__mocks__/store.ts b/tests/__mocks__/store.ts index f6b9cea2d9ceb8eb592d85cd37c00310c98d3931..a15e2e8033492356d231641805c5d913a0aa1fe2 100644 --- a/tests/__mocks__/store.ts +++ b/tests/__mocks__/store.ts @@ -43,8 +43,13 @@ export const mockInitialGlobalState: GlobalState = { popupEnabled: false, title: '', description: '', + endDate: '', + }, + openPartnersIssueModal: { + enedis: false, + egl: false, + grdf: false, }, - openPartnersIssueModal: false, releaseNotes: { show: false, notes: [{ description: '', title: '' }], @@ -53,6 +58,7 @@ export const mockInitialGlobalState: GlobalState = { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -74,6 +80,7 @@ export const mockInitialGlobalState: GlobalState = { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -95,6 +102,7 @@ export const mockInitialGlobalState: GlobalState = { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -132,6 +140,7 @@ export const mockInitialGlobalState: GlobalState = { export const mockExpiredElec: FluidStatus = { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + maintenance: true, firstDataDate: null, lastDataDate: null, connection: { @@ -165,9 +174,11 @@ export const mockExpiredElec: FluidStatus = { }, }, } + export const mockExpiredGas: FluidStatus = { fluidType: FluidType.GAS, status: FluidState.ERROR_LOGIN_FAILED, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -194,6 +205,10 @@ export const mockExpiredGas: FluidStatus = { }, }, } +export const mockMaintenanceGas: FluidStatus = { + ...mockExpiredGas, + maintenance: true, +} export const mockInitialProfileState: Profile = { id: '', @@ -203,7 +218,11 @@ export const mockInitialProfileState: Profile = { quizHash: '', explorationHash: '', isFirstConnection: false, - partnersIssueDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + partnersIssueSeenDate: { + enedis: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + egl: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + grdf: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + }, lastConnectionDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), haveSeenLastAnalysis: true, sendConsumptionAlert: false, @@ -277,8 +296,10 @@ export const mockInitialEcolyoState = { } const middlewares = [thunkMiddleware.withExtraArgument({ mockClient })] -const mockStore = configureStore(middlewares) -const mockedStore: any = mockStore({ +const mockStore = configureStore<{ ecolyo: { global: GlobalState } }>( + middlewares +) +const mockedStore = mockStore({ ecolyo: mockInitialEcolyoState, }) diff --git a/tests/__mocks__/triggerStateData.mock.ts b/tests/__mocks__/triggerStateData.mock.ts index cb7db8fd0f7ef966313941d513a694a2a141d51c..b07bc01e16e60be62e70d63317504d38b9c6eb75 100644 --- a/tests/__mocks__/triggerStateData.mock.ts +++ b/tests/__mocks__/triggerStateData.mock.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/camelcase */ +/* eslint-disable camelcase */ import { TriggerState } from 'models' export const triggerStateData: TriggerState = { diff --git a/tests/__mocks__/userChallengeData.mock.ts b/tests/__mocks__/userChallengeData.mock.ts index b250eca1efeb87dba5bf98744ba0a02e3ad1fa00..ba363b126a758d8362d9fc85a19427da31a3a84a 100644 --- a/tests/__mocks__/userChallengeData.mock.ts +++ b/tests/__mocks__/userChallengeData.mock.ts @@ -349,7 +349,7 @@ export const userChallengeExplo4: UserChallenge = { exploration: { id: 'EXPLORATION004', state: 0, - description: 'Dévérrouillez les données électricité à la demi-heure', + description: 'Déverrouillez les données électricité à la demi-heure', complementary_description: 'Consulter les données à la demi-heure si déjà fait', target: 1, diff --git a/yarn.lock b/yarn.lock index c74079f909bcba14d7a9348598a33066a829cedf..e07a972c0fe49eb6f104502af7cfe10885a873ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5659,16 +5659,17 @@ cozy-client@29.1.2: sift "^6.0.0" url-search-params-polyfill "^8.0.0" -cozy-client@33.2.0: - version "33.2.0" - resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-33.2.0.tgz#276835cce8b230c56631b3cfa98611ea900079d8" - integrity sha512-z+oA0Ri+m4vsAE1Gznab+vSP8j/uEa0zv9+qzB5ORIJvQ0QNHuLBWDoy+0FT4Rz4z+qLqDXxYyVVDBuwps4atQ== +cozy-client@34.7.1: + version "34.7.1" + resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-34.7.1.tgz#d0641b43dbf67ca33a4ccae2a9a62b24784c2e1f" + integrity sha512-3KDrVOCMVnsxLcuCggM/rL13cIh+jY2MKZmHDZVM0cF8HeGMDHOJSH7cGwyL6vEoEzo6K2bxqPafJaIRqgw9Mw== dependencies: "@cozy/minilog" "1.0.0" "@types/jest" "^26.0.20" "@types/lodash" "^4.14.170" btoa "^1.2.1" - cozy-stack-client "^33.2.0" + cozy-stack-client "^34.7.1" + date-fns "2.29.3" json-stable-stringify "^1.0.1" lodash "^4.17.13" microee "^0.0.6" @@ -5971,19 +5972,19 @@ cozy-stack-client@^29.1.0, cozy-stack-client@^29.2.0: mime "^2.4.0" qs "^6.7.0" -cozy-stack-client@^33.2.0: - version "33.2.0" - resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-33.2.0.tgz#97b80514d68da2b6392f74d280f9867165b7d606" - integrity sha512-50vTnZvjCEYGx5nN+2rLhf63JZICNq9bXKY0QUFmfuMBfOTdD4EGw+EVA0YGxQYaz3E3FLrmMuIw5TtLzCDgcA== +cozy-stack-client@^34.7.1: + version "34.7.1" + resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-34.7.1.tgz#f1b81cce2c88ba558a1b5995a91674462f3e629c" + integrity sha512-iarCc6y79HCcQKM7ITQX+y3Tvhi1SjtMGonKAkA98MOtB7qBBolU0CJd9CTLyRfzJAVT/VpXHpwBwTLQ5tyo4g== dependencies: detect-node "^2.0.4" mime "^2.4.0" qs "^6.7.0" -cozy-ui@75.4.1: - version "75.4.1" - resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-75.4.1.tgz#7185d6994ed96e84ab6651eb982dc8b28990898e" - integrity sha512-WfpLTA6pHP1AeM6W1YPyWkWCVjWMr+B1gNOF6Y996OAyNU1rS1hv5kIXBUPqkgf9XD0ixvCuDGIz9eNRh8K8CQ== +cozy-ui@79.3.0: + version "79.3.0" + resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-79.3.0.tgz#9915a3f1aab474b00dc4033d907a31fabb2d1c08" + integrity sha512-OR9KZF9i+alc2sWC7gG2lNuBqiIjJnxkctwt44mK1jWHpQWrQ/4d4HhOcwAcDoAkIWiQyLvmiZivfZVZ3fL/QQ== dependencies: "@babel/runtime" "^7.3.4" "@material-ui/core" "4.12.3" @@ -6525,6 +6526,11 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +date-fns@2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + date-fns@^1.28.5, date-fns@^1.30.1: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" @@ -13711,6 +13717,14 @@ raw-body@2.5.1, raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-loader@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + react-autosuggest@9.4.3: version "9.4.3" resolved "https://registry.yarnpkg.com/react-autosuggest/-/react-autosuggest-9.4.3.tgz#eb46852422a48144ab9f39fb5470319222f26c7c"