diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 55e28db4b..575533e5c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -106,82 +106,6 @@ jobs: name: docker-database-production_up path: /tmp/database_up.tar - ############################################################################## - # JOB: DOCKER BUILD PRODUCTION LOGIN SERVER ################################## - ############################################################################## - build_production_login_server: - name: Docker Build Production - Login Server - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: recursive - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # LOGIN SERVER ########################################################### - ########################################################################## - - name: Login Server | Build `production` image - run: | - docker build -t "gradido/login_server:latest" -t "gradido/login_server:production" -t "gradido/login_server:${VERSION}" -t "gradido/login_server:${BUILD_VERSION}" login_server/ - docker save "gradido/login_server" > /tmp/login_server.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-login-server-production - path: /tmp/login_server.tar - - ############################################################################## - # JOB: DOCKER BUILD PRODUCTION COMMUNITY SERVER ############################## - ############################################################################## - build_production_community_server: - name: Docker Build Production - Community Server - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # COMMUNITY SERVER ####################################################### - ########################################################################## - - name: Community Server | Build `production` image - run: | - docker build -t "gradido/community_server:latest" -t "gradido/community_server:production" -t "gradido/community_server:${VERSION}" -t "gradido/community_server:${BUILD_VERSION}" -f ./community_server/Dockerfile ./ - docker save "gradido/community_server" > /tmp/community_server.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-community-server-production - path: /tmp/community_server.tar - ############################################################################## # JOB: DOCKER BUILD PRODUCTION MARIADB ####################################### ############################################################################## @@ -248,7 +172,7 @@ jobs: ########################################################################## - name: Nginx | Build `production` image run: | - docker build -t "gradido/nginx:latest" -t "gradido/nginx:production" -t "gradido/nginx:${VERSION}" -t "gradido/nginx:${BUILD_VERSION}" -f ./nginx/Dockerfile ./ + docker build -t "gradido/nginx:latest" -t "gradido/nginx:production" -t "gradido/nginx:${VERSION}" -t "gradido/nginx:${BUILD_VERSION}" nginx/ docker save "gradido/nginx" > /tmp/nginx.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -262,7 +186,7 @@ jobs: upload_to_dockerhub: name: Upload to Dockerhub runs-on: ubuntu-latest - needs: [build_production_frontend, build_production_backend, build_production_database_up, build_production_login_server, build_production_community_server, build_production_mariadb, build_production_nginx] + needs: [build_production_frontend, build_production_backend, build_production_database_up, build_production_mariadb, build_production_nginx] env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} @@ -296,20 +220,6 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/database_up.tar - - name: Download Docker Image (Login Server) - uses: actions/download-artifact@v2 - with: - name: docker-login-server-production - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/login_server.tar - - name: Download Docker Image (Community Server) - uses: actions/download-artifact@v2 - with: - name: docker-community-server-production - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/community_server.tar - name: Download Docker Image (MariaDB) uses: actions/download-artifact@v2 with: @@ -335,10 +245,6 @@ jobs: run: docker push --all-tags gradido/backend - name: Push database run: docker push --all-tags gradido/database - - name: Push login_server - run: docker push --all-tags gradido/login_server - - name: Push community_server - run: docker push --all-tags gradido/community_server - name: Push MariaDB run: docker push --all-tags gradido/mariadb - name: Push Nginx @@ -399,7 +305,7 @@ jobs: - name: yarn install run: yarn install - name: generate changelog - run: yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only + run: yarn auto-changelog --commit-limit 0 --latest-version ${{ env.VERSION }} --unreleased-only - name: package-version-to-git-release continue-on-error: true # Will fail if tag exists id: create_release diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 15a736630..18d1143db 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -107,54 +107,6 @@ jobs: name: docker-database-test_up path: /tmp/database_up.tar - ############################################################################## - # JOB: DOCKER BUILD TEST LOGIN SERVER ######################################## - ############################################################################## - build_test_login_server: - name: Docker Build Test - Login Server - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: true - ########################################################################## - # BUILD LOGIN SERVER DOCKER IMAGE ######################################## - ########################################################################## - - name: login server | Build `release` image - run: | - docker build -t "gradido/login_server:release" -f ./login_server/Dockerfile login_server/ - - ############################################################################## - # JOB: DOCKER BUILD TEST COMMUNITY SERVER #################################### - ############################################################################## - build_test_community_server: - name: Docker Build Test - Community Server - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # BUILD COMMUNITY SERVER DOCKER IMAGE #################################### - ########################################################################## - - name: community server | Build `test` image - run: | - docker build -t "gradido/community_server:test" -f ./community_server/Dockerfile ./ - docker save "gradido/community_server:test" > /tmp/community_server.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-community-server-test - path: /tmp/community_server.tar - ############################################################################## # JOB: DOCKER BUILD TEST MARIADB ############################################# ############################################################################## @@ -199,7 +151,7 @@ jobs: ########################################################################## - name: nginx | Build `test` image run: | - docker build -t "gradido/nginx:test" -f ./nginx/Dockerfile ./ + docker build -t "gradido/nginx:test" nginx/ docker save "gradido/nginx:test" > /tmp/nginx.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -233,7 +185,7 @@ jobs: ########################################################################## # LOCALES FRONTEND ####################################################### ########################################################################## - - name: frontend | Locales + - name: Frontend | Locales run: docker run --rm gradido/frontend:test yarn run locales ############################################################################## @@ -262,9 +214,38 @@ jobs: ########################################################################## # LINT FRONTEND ########################################################## ########################################################################## - - name: frontend | Lint + - name: Frontend | Lint run: docker run --rm gradido/frontend:test yarn run lint + ############################################################################## + # JOB: STYLELINT FRONTEND #################################################### + ############################################################################## + stylelint_frontend: + name: Stylelint - Frontend + runs-on: ubuntu-latest + needs: [build_test_frontend] + steps: + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + ########################################################################## + # DOWNLOAD DOCKER IMAGE ################################################## + ########################################################################## + - name: Download Docker Image (Frontend) + uses: actions/download-artifact@v2 + with: + name: docker-frontend-test + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/frontend.tar + ########################################################################## + # STYLELINT FRONTEND ##################################################### + ########################################################################## + - name: Frontend | Stylelint + run: docker run --rm gradido/frontend:test yarn run stylelint + ############################################################################## # JOB: LINT ADMIN INTERFACE ################################################## ############################################################################## @@ -295,7 +276,36 @@ jobs: run: docker run --rm gradido/admin:test yarn run lint ############################################################################## - # JOB: LOCALES ADMIN ###################################################### + # JOB: STYLELINT ADMIN INTERFACE ############################################## + ############################################################################## + stylelint_admin: + name: Stylelint - Admin Interface + runs-on: ubuntu-latest + needs: [build_test_admin] + steps: + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + ########################################################################## + # DOWNLOAD DOCKER IMAGE ################################################## + ########################################################################## + - name: Download Docker Image (Admin Interface) + uses: actions/download-artifact@v2 + with: + name: docker-admin-test + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/admin.tar + ########################################################################## + # STYLELINT ADMIN INTERFACE ############################################## + ########################################################################## + - name: Admin Interface | Stylelint + run: docker run --rm gradido/admin:test yarn run stylelint + + ############################################################################## + # JOB: LOCALES ADMIN ######################################################### ############################################################################## locales_admin: name: Locales - Admin @@ -428,7 +438,7 @@ jobs: report_name: Coverage Frontend type: lcov result_path: ./coverage/lcov.info - min_coverage: 94 + min_coverage: 95 token: ${{ github.token }} ############################################################################## @@ -470,7 +480,7 @@ jobs: report_name: Coverage Admin Interface type: lcov result_path: ./coverage/lcov.info - min_coverage: 76 + min_coverage: 95 token: ${{ github.token }} ############################################################################## @@ -479,7 +489,7 @@ jobs: unit_test_backend: name: Unit tests - Backend runs-on: ubuntu-latest - needs: [build_test_backend,build_test_mariadb] + needs: [build_test_mariadb] steps: ########################################################################## # CHECKOUT CODE ########################################################## @@ -496,20 +506,18 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/mariadb.tar - - name: Download Docker Image (Backend) - uses: actions/download-artifact@v2 - with: - name: docker-backend-test - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/backend.tar ########################################################################## # UNIT TESTS BACKEND ##################################################### ########################################################################## - - name: backend | docker-compose - run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mariadb database + - name: backend | docker-compose mariadb + run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mariadb + - name: Sleep for 30 seconds + run: sleep 30s + shell: bash + - name: backend | docker-compose database + run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database - name: backend Unit tests | test - run: cd database && yarn && yarn build && cd ../backend && yarn && yarn CI_worklfow_test + run: cd database && yarn && yarn build && cd ../backend && yarn && yarn test # run: docker-compose -f docker-compose.yml -f docker-compose.test.yml exec -T backend yarn test ########################################################################## # COVERAGE CHECK BACKEND ################################################# @@ -520,149 +528,7 @@ jobs: report_name: Coverage Backend type: lcov result_path: ./backend/coverage/lcov.info - min_coverage: 40 - token: ${{ github.token }} - - ############################################################################## - # JOB: UNIT TEST LOGIN-SERVER ############################################### - ############################################################################## - unit_test_login_server: - name: Unit tests - Login-Server - runs-on: ubuntu-latest - needs: [] - services: - mariadb: - image: gradido/mariadb:test - env: - MARIADB_ALLOW_EMPTY_PASSWORD: 1 - MARIADB_USER: root - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" - --health-interval=6s - --health-timeout=3s - --health-retries=4 - steps: - # - name: Debug service - # run: echo "$(docker ps)" - #- name: Debug container choosing script - # run: echo "$(docker container ls | grep mariadb | awk '{ print $1 }')" - - name: get mariadb container id - run: echo "::set-output name=id::$(docker container ls | grep mariadb | awk '{ print $1 }')" - id: mariadb_container - - name: get automatic created network - run: echo "::set-output name=id::$(docker network ls | grep github_network | awk '{ print $1 }')" - id: network - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: true - # Database migration - - name: Start database migration - run: | - docker build --target production_up -t "gradido/database:production_up" database/ - docker run --network ${{ steps.network.outputs.id }} --name=database --env NODE_ENV=production --env DB_HOST=mariadb --env DB_DATABASE=gradido_community_test -d gradido/database:production_up - ########################################################################## - # Build Login-Server Test Docker image ################################### - ########################################################################## - - name: login server | Build `test` image - run: | - docker build -t "gradido/login_server:test" -f ./login_server/Dockerfiles/ubuntu/Dockerfile.test login_server/ - ########################################################################## - # UNIT TESTS BACKEND LOGIN-SERVER ####################################### - ########################################################################## - - name: Login-Server | Unit tests - run: | - docker run --network container:$(docker container ls | grep mariadb | awk '{ print $1 }') -v ~/coverage:/code/build_cov/coverage -v $(pwd)/configs/login_server:/etc/grd_login gradido/login_server:test - cp -r ~/coverage ./coverage - ########################################################################## - # COVERAGE CHECK BACKEND LOGIN-SERVER #################################### - ########################################################################## - - name: backend login | Coverage check - uses: webcraftmedia/coverage-check-action@master - with: - report_name: Coverage Backend Login - type: lcov - result_path: ./coverage/coverage.info - min_coverage: 34 - token: ${{ github.token }} - - ############################################################################## - # JOB: UNIT TEST COMMUNITY-SERVER ########################################### - ############################################################################## - unit_test_community_server: - name: Unit tests - Community Server - runs-on: ubuntu-latest - needs: [build_test_community_server] - services: - mariadb: - image: gradido/mariadb:test - env: - MARIADB_ALLOW_EMPTY_PASSWORD: 1 - MARIADB_USER: root - options: --health-cmd="mysqladmin ping" - --health-interval=5s - --health-timeout=5s - --health-retries=3 - steps: - - name: get mariadb container id - run: echo "::set-output name=id::$(docker container ls | grep mariadb | awk '{ print $1 }')" - id: mariadb_container - - name: get automatic created network - run: echo "::set-output name=id::$(docker network ls | grep github_network | awk '{ print $1 }')" - id: network - - name: Start database migration - run: docker run --network ${{ steps.network.outputs.id }} --name=database --env NODE_ENV=production --env DB_HOST=mariadb --env DB_DATABASE=gradido_community_test -d gradido/database:production_up - - name: get database migration container id - run: echo "::set-output name=id::$(docker container ls | grep database | awk '{ print $1 }')" - id: database_container - - name: Start Login-Server - run: docker run --network ${{ steps.network.outputs.id }} --name=login-server -d gradido/login_server:with-config - - name: get login-server container id - run: echo "::set-output name=id::$(docker container ls | grep login_server | awk '{ print $1 }')" - id: login_server_container - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - ########################################################################## - # DOWNLOAD DOCKER IMAGE ################################################## - ########################################################################## - - name: Download Docker Image (Community-Server) - uses: actions/download-artifact@v2 - with: - name: docker-community-server-test - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/community_server.tar - # for debugging login-server - - name: check login-server - run: docker logs ${{ steps.login_server_container.outputs.id }} - - name: check mariadb - run: docker logs ${{ steps.mariadb_container.outputs.id }} - - name: check migration - run: docker logs ${{ steps.database_container.outputs.id }} - ########################################################################## - # UNIT TESTS BACKEND COMMUNITY-SERVER ####################################### - ########################################################################## - - name: community server | Unit tests - run: | - docker run --network ${{ steps.network.outputs.id }} -v ~/coverage:/var/www/cakephp/webroot/coverage gradido/community_server:test - cp -r ~/coverage ./coverage - ######################################################################### - # COVERAGE CHECK BACKEND COMMUNITY-SERVER #################################### - ########################################################################## - - name: backend community | Coverage check - uses: einhornimmond/coverage-check-action@master - with: - report_name: Coverage Backend Community - type: phpunit - result_path: ./coverage/coverage.info - min_coverage: 10 + min_coverage: 54 token: ${{ github.token }} ########################################################################## diff --git a/.gitignore b/.gitignore index 5682953d4..b02b9d6ec 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,9 @@ nbproject .metadata /.env package-lock.json +/deployment/bare_metal/.env +/deployment/bare_metal/nginx/sites-available/gradido.conf +/deployment/bare_metal/nginx/sites-available/update-page.conf +/deployment/bare_metal/nginx/update-page/updating.html +/deployment/bare_metal/log +/deployment/bare_metal/backup diff --git a/.gitmodules b/.gitmodules index 22790ccc7..8b1378917 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,36 +1 @@ -[submodule "gn"] - path = gn - url = https://github.com/gradido/gn.git - branch = master -[submodule "login_server/dependencies/tinf"] - path = login_server/dependencies/tinf - url = https://github.com/jibsen/tinf.git -[submodule "login_server/dependencies/mariadb-connector-c"] - path = login_server/dependencies/mariadb-connector-c - url = https://github.com/MariaDB/mariadb-connector-c.git -[submodule "login_server/src/proto"] - path = login_server/src/proto - url = https://github.com/gradido/gradido_protocol.git -[submodule "login_server/dependencies/spirit-po"] - path = login_server/dependencies/spirit-po - url = https://github.com/cbeck88/spirit-po.git -[submodule "login_server/dependencies/poco"] - path = login_server/dependencies/poco - url = https://github.com/pocoproject/poco.git -[submodule "login_server/dependencies/cmake-modules"] - path = login_server/dependencies/cmake-modules - url = https://github.com/viaduck/cmake-modules.git - -[submodule "community_server/src/protobuf"] - path = community_server/src/protobuf - url = https://github.com/gradido/gradido_protocol.git -[submodule "login_server/dependencies/libsodium"] - path = login_server/dependencies/libsodium - url = https://github.com/jedisct1/libsodium.git -[submodule "login_server/src/proto"] - path = login_server/src/proto - url = https://github.com/gradido/gradido_protocol.git -[submodule "login_server/dependencies/protobuf"] - path = login_server/dependencies/protobuf - url = https://github.com/protocolbuffers/protobuf.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d207d309..6c64df990 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,274 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [1.6.6](https://github.com/gradido/gradido/compare/1.6.5...1.6.6) + +- Fix: Upper case email on register breaks account [`#1542`](https://github.com/gradido/gradido/pull/1542) +- 1106 first transaction cannot be expanded [`#1432`](https://github.com/gradido/gradido/pull/1432) +- added missing bootstrap scss. bootstrap/scss/bootstrap, plus more mis… [`#1540`](https://github.com/gradido/gradido/pull/1540) +- feat: Seed Deleted User [`#1533`](https://github.com/gradido/gradido/pull/1533) +- fix: No Creations for Deleted Users [`#1534`](https://github.com/gradido/gradido/pull/1534) +- fix: Wrong Key Name for Recover User [`#1535`](https://github.com/gradido/gradido/pull/1535) +- [Feature] : user deleted and undeleted functions for adminarea [`#1520`](https://github.com/gradido/gradido/pull/1520) +- fix: Possible SQL Exception in User Search [`#1530`](https://github.com/gradido/gradido/pull/1530) +- Feature: Make lint warnings unwanted [`#1529`](https://github.com/gradido/gradido/pull/1529) +- 1459 list data again on confirm creation [`#1467`](https://github.com/gradido/gradido/pull/1467) +- fix: Return Empty Array When No Pending Creations Are Present [`#1526`](https://github.com/gradido/gradido/pull/1526) +- Fix: Correct path of index.js in production [`#1525`](https://github.com/gradido/gradido/pull/1525) +- refactor: Get Open Creations by One Query [`#1524`](https://github.com/gradido/gradido/pull/1524) +- Admin: Langsame Benutzer-Suche [`#1472`](https://github.com/gradido/gradido/pull/1472) +- fix: Backend Unit Tests Running Again [`#1513`](https://github.com/gradido/gradido/pull/1513) +- Refactor: Combine transaction tables [`#1523`](https://github.com/gradido/gradido/pull/1523) +- Refactor: User resolver [`#1522`](https://github.com/gradido/gradido/pull/1522) +- feature: Soft-Delete for users (backend) [`#1521`](https://github.com/gradido/gradido/pull/1521) +- feature: Soft-Delete for users (database only) [`#1516`](https://github.com/gradido/gradido/pull/1516) +- refactor: Improve Decay Display [`#1517`](https://github.com/gradido/gradido/pull/1517) +- 404 page needs back to login button [`#1515`](https://github.com/gradido/gradido/pull/1515) +- feature: show current version in admin footer [`#1514`](https://github.com/gradido/gradido/pull/1514) +- fix: Never Sent Email Text [`#1512`](https://github.com/gradido/gradido/pull/1512) +- refactor: static decay block [`#1405`](https://github.com/gradido/gradido/pull/1405) +- refactor: Use Bootstrap Vue Toast [`#1499`](https://github.com/gradido/gradido/pull/1499) +- fix: Catch GDT Server Errors [`#1479`](https://github.com/gradido/gradido/pull/1479) +- Fix: Autochangelog - no commits [`#1498`](https://github.com/gradido/gradido/pull/1498) + +#### [1.6.5](https://github.com/gradido/gradido/compare/1.6.4...1.6.5) + +> 15 February 2022 + +- v1.6.5 [`#1497`](https://github.com/gradido/gradido/pull/1497) +- Fix: Elopage Hook Crash 2 [`#1481`](https://github.com/gradido/gradido/pull/1481) + +#### [1.6.4](https://github.com/gradido/gradido/compare/1.6.3...1.6.4) + +> 14 February 2022 + +- v1.6.4 [`#1478`](https://github.com/gradido/gradido/pull/1478) +- fix: Admin Email Confirmation Date and Time [`#1448`](https://github.com/gradido/gradido/pull/1448) +- Fix: Do not log password or token to the console [`#1477`](https://github.com/gradido/gradido/pull/1477) +- Fix: Elopage Hook Crash [`#1474`](https://github.com/gradido/gradido/pull/1474) +- 538 unify all buttons [`#1455`](https://github.com/gradido/gradido/pull/1455) +- 833 old error is shown for a second even if transaction is successful [`#1460`](https://github.com/gradido/gradido/pull/1460) +- fix: Wrong Email Spelling in German [`#1446`](https://github.com/gradido/gradido/pull/1446) +- fix: Redirect to Login after Register [`#1445`](https://github.com/gradido/gradido/pull/1445) +- refactor: Split User Table Component in Admin Interface [`#1443`](https://github.com/gradido/gradido/pull/1443) + +#### [1.6.3](https://github.com/gradido/gradido/compare/1.6.2...1.6.3) + +> 9 February 2022 + +- v1.6.3 [`#1447`](https://github.com/gradido/gradido/pull/1447) +- add .btn-outline-secondary in scss [`#1442`](https://github.com/gradido/gradido/pull/1442) +- Profil settings and footer refactor [`#1440`](https://github.com/gradido/gradido/pull/1440) + +#### [1.6.2](https://github.com/gradido/gradido/compare/1.6.1...1.6.2) + +> 8 February 2022 + +- v1.6.2 [`#1438`](https://github.com/gradido/gradido/pull/1438) +- updated_changelog_library [`#1437`](https://github.com/gradido/gradido/pull/1437) +- admin interface does user have member area [`#1416`](https://github.com/gradido/gradido/pull/1416) +- Refactor - Remove community_server [`#1408`](https://github.com/gradido/gradido/pull/1408) +- 1389 transactions tabs are not well designed [`#1425`](https://github.com/gradido/gradido/pull/1425) +- fix_community_name_description [`#1429`](https://github.com/gradido/gradido/pull/1429) +- remove_unnecessary_repositories [`#1406`](https://github.com/gradido/gradido/pull/1406) +- clean_database_users [`#1427`](https://github.com/gradido/gradido/pull/1427) +- remove_gradido_node [`#1431`](https://github.com/gradido/gradido/pull/1431) +- add updateTransactions function for GDD balance if reload page [`#1423`](https://github.com/gradido/gradido/pull/1423) +- 1390 display error when navigating to send form without any gdd [`#1424`](https://github.com/gradido/gradido/pull/1424) +- have an delete button for the search input [`#1413`](https://github.com/gradido/gradido/pull/1413) +- reset all selected users in mass creation [`#1422`](https://github.com/gradido/gradido/pull/1422) +- combine_user_tables [`#1411`](https://github.com/gradido/gradido/pull/1411) +- feat: Test Table Row Details Toggling [`#1420`](https://github.com/gradido/gradido/pull/1420) +- feat: Improved Tests for Mass Creation [`#1419`](https://github.com/gradido/gradido/pull/1419) +- refactor: Mixin for Creation Labels [`#1409`](https://github.com/gradido/gradido/pull/1409) +- Marque community_server as to be removed. [`#1407`](https://github.com/gradido/gradido/pull/1407) +- database_transaction_signatures [`#1368`](https://github.com/gradido/gradido/pull/1368) +- database_pending_creations [`#1367`](https://github.com/gradido/gradido/pull/1367) +- fix_seed [`#1410`](https://github.com/gradido/gradido/pull/1410) +- clean_database [`#1362`](https://github.com/gradido/gradido/pull/1362) +- multiple creation already selected users remain saved [`#1376`](https://github.com/gradido/gradido/pull/1376) +- fix: Localize Datetime in Admin Interface [`#1327`](https://github.com/gradido/gradido/pull/1327) +- feat: Remove Login Server [`#1383`](https://github.com/gradido/gradido/pull/1383) +- refactor: Tag Last Version with Login Server [`#1391`](https://github.com/gradido/gradido/pull/1391) +- if an email is not confirmed, a user cannot be added to any multiple … [`#1374`](https://github.com/gradido/gradido/pull/1374) +- cleanups_refactors [`#1404`](https://github.com/gradido/gradido/pull/1404) +- 1365 clear bootstrap version for vue2, preparation for new template [`#1366`](https://github.com/gradido/gradido/pull/1366) +- upgrade vue version from ^2.6.11 to 2.6.12 [`#1382`](https://github.com/gradido/gradido/pull/1382) +- remove vue-qrcode from dashboard-plugin [`#1364`](https://github.com/gradido/gradido/pull/1364) +- remove unused package from frontend [`#1360`](https://github.com/gradido/gradido/pull/1360) + +#### [1.6.1](https://github.com/gradido/gradido/compare/1.6.0...1.6.1) + +> 28 January 2022 + +- Hotfix elopage [`#1358`](https://github.com/gradido/gradido/pull/1358) +- change standard text für creation [`#1343`](https://github.com/gradido/gradido/pull/1343) +- Check if user email is activated to make a creation. [`#1356`](https://github.com/gradido/gradido/pull/1356) +- fix: Creation Confirmation User Ids [`#1345`](https://github.com/gradido/gradido/pull/1345) + +#### [1.6.0](https://github.com/gradido/gradido/compare/1.5.1...1.6.0) + +> 27 January 2022 + +- v1.6.0 [`#1357`](https://github.com/gradido/gradido/pull/1357) +- fix updatePendingCreation method [`#1346`](https://github.com/gradido/gradido/pull/1346) +- klicktipp_config [`#1348`](https://github.com/gradido/gradido/pull/1348) +- 1351 form to create incorrect due to change of bootstrap version [`#1352`](https://github.com/gradido/gradido/pull/1352) +- first draft of releaseplan [`#1349`](https://github.com/gradido/gradido/pull/1349) +- Rechtschreibfehler behoben, entgültig zu endgültig [`#1354`](https://github.com/gradido/gradido/pull/1354) +- production_deployment [`#1341`](https://github.com/gradido/gradido/pull/1341) +- import_production_data [`#1324`](https://github.com/gradido/gradido/pull/1324) +- remove division / 100 for GDT [`#1339`](https://github.com/gradido/gradido/pull/1339) +- fix: Language Set Correctly after Page Reload in Admin Interface [`#1334`](https://github.com/gradido/gradido/pull/1334) +- fix: Set Locale after Login [`#1328`](https://github.com/gradido/gradido/pull/1328) +- deployment_community_parameters [`#1331`](https://github.com/gradido/gradido/pull/1331) +- bold text if acive page [`#1337`](https://github.com/gradido/gradido/pull/1337) +- 1303 thanks page after set password [`#1335`](https://github.com/gradido/gradido/pull/1335) +- Changed the toasted message for successful creating a creation. [`#1332`](https://github.com/gradido/gradido/pull/1332) +- Added a required to the password repeat field, errors are shown immed… [`#1333`](https://github.com/gradido/gradido/pull/1333) +- fix_rejected_login [`#1329`](https://github.com/gradido/gradido/pull/1329) +- defined fields for Transactionlist in UserSearch in Adminarea, add Lo… [`#1322`](https://github.com/gradido/gradido/pull/1322) +- fix: Render Localized Balance in NavBar [`#1321`](https://github.com/gradido/gradido/pull/1321) +- 1227 vergaenglichkeit besser darstellen [`#1312`](https://github.com/gradido/gradido/pull/1312) +- 1300 gray out register button further when disabled [`#1316`](https://github.com/gradido/gradido/pull/1316) +- change Admin Gradido-Logo font color to white [`#1315`](https://github.com/gradido/gradido/pull/1315) +- 1299 remove text from register publisher [`#1317`](https://github.com/gradido/gradido/pull/1317) +- 1249 gdd gdt values look displaced or cut off [`#1318`](https://github.com/gradido/gradido/pull/1318) +- 1307 admin rename wallet to my account [`#1314`](https://github.com/gradido/gradido/pull/1314) +- 1011 visualize and refine the register process [`#1136`](https://github.com/gradido/gradido/pull/1136) +- New roadmap [`#1219`](https://github.com/gradido/gradido/pull/1219) +- fix: Redirect after Email Confirmation [`#1308`](https://github.com/gradido/gradido/pull/1308) +- fix_docker_logging [`#1309`](https://github.com/gradido/gradido/pull/1309) +- feat: Paginate User Table [`#1293`](https://github.com/gradido/gradido/pull/1293) +- Adding button, to link back to the login page from the error not activated page. [`#1297`](https://github.com/gradido/gradido/pull/1297) +- [WIP] new_deployment_stage2 [`#1290`](https://github.com/gradido/gradido/pull/1290) +- add icons in menu and navbarmenu [`#1298`](https://github.com/gradido/gradido/pull/1298) +- Withdrew horrizontal scrollbar [`#1295`](https://github.com/gradido/gradido/pull/1295) +- transactionCount false or transactionCount error text hide [`#1259`](https://github.com/gradido/gradido/pull/1259) +- 1265 mouse hovering over pencil in settings [`#1270`](https://github.com/gradido/gradido/pull/1270) +- Fix redirect to /logout, now redirects to the wallet login. [`#1285`](https://github.com/gradido/gradido/pull/1285) +- feat: Test and Refactor Send Email [`#1224`](https://github.com/gradido/gradido/pull/1224) +- new_deployment [`#1220`](https://github.com/gradido/gradido/pull/1220) +- Withdrew space at the end of an locale definition. [`#1283`](https://github.com/gradido/gradido/pull/1283) +- Fix removing from masscreationlist now gives right item to the left l… [`#1284`](https://github.com/gradido/gradido/pull/1284) +- onboarding process document [`#1148`](https://github.com/gradido/gradido/pull/1148) +- Don't show the language-switch on the /register page. [`#1282`](https://github.com/gradido/gradido/pull/1282) +- language_updates_bernd [`#1260`](https://github.com/gradido/gradido/pull/1260) +- Admin Logout redirectes to the wallet login page. [`#1271`](https://github.com/gradido/gradido/pull/1271) +- fix: Admin Creation List [`#1276`](https://github.com/gradido/gradido/pull/1276) +- fix: Override Existing Token in Response Header [`#1278`](https://github.com/gradido/gradido/pull/1278) +- fix: Pass Language to Admin Interface [`#1280`](https://github.com/gradido/gradido/pull/1280) +- feat: Seed Garrick Ollivander [`#1277`](https://github.com/gradido/gradido/pull/1277) +- fix: Fix Update of Open Creations [`#1273`](https://github.com/gradido/gradido/pull/1273) +- fix: Change Password in User Profile [`#1266`](https://github.com/gradido/gradido/pull/1266) +- Wallet shows the wrong gdt sum (gdtSum * 100) [`#1269`](https://github.com/gradido/gradido/pull/1269) +- 1240 account not activated needs a button to login page [`#1261`](https://github.com/gradido/gradido/pull/1261) +- reverse filter for unregistered emails [`#1256`](https://github.com/gradido/gradido/pull/1256) +- close row-details automatically when switching to multiple creation page [`#1245`](https://github.com/gradido/gradido/pull/1245) +- change creationdatas if change pending creation [`#1244`](https://github.com/gradido/gradido/pull/1244) +- 1230 details für wiederholte email bestaetigen versenden [`#1255`](https://github.com/gradido/gradido/pull/1255) +- 1221 month names of the open creation in multiple creation [`#1222`](https://github.com/gradido/gradido/pull/1222) +- Documentation Template-Overview-2021 PDF [`#1194`](https://github.com/gradido/gradido/pull/1194) +- Admin create multiple pending creations [`#1203`](https://github.com/gradido/gradido/pull/1203) +- feat: Catch No Cookies Allowed [`#1187`](https://github.com/gradido/gradido/pull/1187) +- Remove confirmation of own pending creation [`#1215`](https://github.com/gradido/gradido/pull/1215) +- feat: Test Create User Mutation [`#1217`](https://github.com/gradido/gradido/pull/1217) +- #751 Änderungen auf Federation und Community-Erstellprozess [`#969`](https://github.com/gradido/gradido/pull/969) +- 1055 concept of operations requirements [`#1129`](https://github.com/gradido/gradido/pull/1129) +- Admin Translations German English [`#1218`](https://github.com/gradido/gradido/pull/1218) +- Roadmap [`#1213`](https://github.com/gradido/gradido/pull/1213) +- pr_admin_refactor [`#1214`](https://github.com/gradido/gradido/pull/1214) +- 1197 admin interface created transactions list [`#1202`](https://github.com/gradido/gradido/pull/1202) +- migration_0006_login_users_collation [`#1207`](https://github.com/gradido/gradido/pull/1207) +- wrong_login_is_not_password_reset [`#1179`](https://github.com/gradido/gradido/pull/1179) +- Moved reverse of the getPendingCreations to the AdminResolver instead… [`#1185`](https://github.com/gradido/gradido/pull/1185) +- Withdrew password argument of createUser. [`#1206`](https://github.com/gradido/gradido/pull/1206) +- fix_optin_code_regeneration [`#1195`](https://github.com/gradido/gradido/pull/1195) +- 1057 display gdd balance when sending [`#1149`](https://github.com/gradido/gradido/pull/1149) +- 1145 refactor admin resolver from master [`#1164`](https://github.com/gradido/gradido/pull/1164) +- Error handling in GddTransactionList.vue [`#1183`](https://github.com/gradido/gradido/pull/1183) +- state-balance balanceDate can't get the date of the last transaction [`#1182`](https://github.com/gradido/gradido/pull/1182) +- feat: Frontend Refactor and Tests [`#1186`](https://github.com/gradido/gradido/pull/1186) +- fix: No Nodemon in Database Scripts [`#1167`](https://github.com/gradido/gradido/pull/1167) +- feat: Test Creation in Admin Interface [`#1172`](https://github.com/gradido/gradido/pull/1172) +- 533 refactor menu remove tim [`#1162`](https://github.com/gradido/gradido/pull/1162) +- database_docker_fixes [`#1176`](https://github.com/gradido/gradido/pull/1176) +- naming_conventions_pending_tasks [`#1184`](https://github.com/gradido/gradido/pull/1184) +- fix_i18n [`#1180`](https://github.com/gradido/gradido/pull/1180) +- fix_corrupted_sender_balance [`#1178`](https://github.com/gradido/gradido/pull/1178) +- Withdrew * 10000 and / 10000 since we need to store the full value. [`#1181`](https://github.com/gradido/gradido/pull/1181) +- catch error Client certificate revoked and pass error.session-expired… [`#1152`](https://github.com/gradido/gradido/pull/1152) +- feat: Test Apollo Provider in Frontend [`#1161`](https://github.com/gradido/gradido/pull/1161) +- fix: Pending Creations are Updated Without Page Reload [`#1160`](https://github.com/gradido/gradido/pull/1160) +- Error on upgrade database after downgrade [`#1119`](https://github.com/gradido/gradido/pull/1119) +- Login fix creation validation [`#1159`](https://github.com/gradido/gradido/pull/1159) +- login_call_resetPassword [`#1130`](https://github.com/gradido/gradido/pull/1130) +- register add tabindex-1 on password show [`#1158`](https://github.com/gradido/gradido/pull/1158) +- feat: Seed Transaction Creations [`#1146`](https://github.com/gradido/gradido/pull/1146) +- Admin confirm pending creation [`#1153`](https://github.com/gradido/gradido/pull/1153) +- Admin delete pending creation query [`#1141`](https://github.com/gradido/gradido/pull/1141) +- fix: Catch Expired Session when Coming from Admin Interface [`#1151`](https://github.com/gradido/gradido/pull/1151) +- docu_release [`#1138`](https://github.com/gradido/gradido/pull/1138) +- feat: Verify Login in Admin Interface [`#1150`](https://github.com/gradido/gradido/pull/1150) +- Admin pending creation queries [`#1140`](https://github.com/gradido/gradido/pull/1140) +- 1137 publisher id as input field on register [`#1147`](https://github.com/gradido/gradido/pull/1147) +- Admin pending creation [`#1135`](https://github.com/gradido/gradido/pull/1135) +- feat: Setup Data Seeding [`#1121`](https://github.com/gradido/gradido/pull/1121) +- fix_admin_token_renewal [`#1139`](https://github.com/gradido/gradido/pull/1139) +- backend_rights [`#1126`](https://github.com/gradido/gradido/pull/1126) +- Login admin interface [`#1125`](https://github.com/gradido/gradido/pull/1125) +- Adminbereich first step [`#1116`](https://github.com/gradido/gradido/pull/1116) +- Login hook elopage [`#1112`](https://github.com/gradido/gradido/pull/1112) +- Since we don't make a request to the login_server we need to catch if… [`#1131`](https://github.com/gradido/gradido/pull/1131) +- feat: Add Server Users Entity [`#1127`](https://github.com/gradido/gradido/pull/1127) +- Stale: 1002-language-selection-register [`#1113`](https://github.com/gradido/gradido/pull/1113) +- Error for removing coin animation [`#1120`](https://github.com/gradido/gradido/pull/1120) +- Adding a check that the user is activated before letting them login. [`#1099`](https://github.com/gradido/gradido/pull/1099) +- Changed the Auto increment so that it is done after the rollback and … [`#1128`](https://github.com/gradido/gradido/pull/1128) +- Login call unsecure login [`#1095`](https://github.com/gradido/gradido/pull/1095) +- feat: Setup Admin Interface [`#1045`](https://github.com/gradido/gradido/pull/1045) +- login_call_updateUserInfos [`#1084`](https://github.com/gradido/gradido/pull/1084) +- fix: Await Resolved Promises in Backend Unit Tests [`#1079`](https://github.com/gradido/gradido/pull/1079) +- feat: Raise Test Coverage Frontend [`#1102`](https://github.com/gradido/gradido/pull/1102) +- login_call_logout [`#1096`](https://github.com/gradido/gradido/pull/1096) +- login_call_hasElopage [`#1083`](https://github.com/gradido/gradido/pull/1083) +- login_call_create_user [`#1070`](https://github.com/gradido/gradido/pull/1070) +- 1036 register page breaks without community [`#1043`](https://github.com/gradido/gradido/pull/1043) +- Apollo create transactions without signation [`#1044`](https://github.com/gradido/gradido/pull/1044) +- change getCustomRepository to createUser function [`#1046`](https://github.com/gradido/gradido/pull/1046) +- fresh_install_instructions [`#1065`](https://github.com/gradido/gradido/pull/1065) +- login_call_check_username [`#1037`](https://github.com/gradido/gradido/pull/1037) +- feat: Setup Unit Tests for Resolvers in Backend [`#951`](https://github.com/gradido/gradido/pull/951) +- Login hotfixes 1.5.1 [`#1075`](https://github.com/gradido/gradido/pull/1075) +- vscode_suggest_extensions [`#1073`](https://github.com/gradido/gradido/pull/1073) +- Documentation on the coin creation and the steps to have the accounts… [`#1052`](https://github.com/gradido/gradido/pull/1052) +- fix open community server user account creation [`#1072`](https://github.com/gradido/gradido/pull/1072) +- when creating the register page, everything in the form is set to blank [`#1025`](https://github.com/gradido/gradido/pull/1025) +- Spelling error fixed 'Berechnungsformel' [`#1048`](https://github.com/gradido/gradido/pull/1048) +- checkEmail.vue page text is displayed correctly now [`#1051`](https://github.com/gradido/gradido/pull/1051) +- Adminarea old [`#1058`](https://github.com/gradido/gradido/pull/1058) +- migrate_login_database [`#1031`](https://github.com/gradido/gradido/pull/1031) +- Text changes for german and english. [`#1041`](https://github.com/gradido/gradido/pull/1041) +- refactor: Transaction Component [`#1026`](https://github.com/gradido/gradido/pull/1026) +- 1017 fixe dashboard layout safari [`#1038`](https://github.com/gradido/gradido/pull/1038) +- 707 separate account overview and send [`#970`](https://github.com/gradido/gradido/pull/970) +- Link to the funding contributions of gradido.net memberships [`#984`](https://github.com/gradido/gradido/pull/984) +- fix: Decay Rounded to Ceil [`#1021`](https://github.com/gradido/gradido/pull/1021) +- fix: Flaky Dashboard Layout Test on Logout [`#1024`](https://github.com/gradido/gradido/pull/1024) +- Move Entity models into database [`#956`](https://github.com/gradido/gradido/pull/956) +- Text 'No decay' replaced by the number 0.00 [`#1023`](https://github.com/gradido/gradido/pull/1023) +- change text 'eingetraten' to 'eingetragen' [`#1022`](https://github.com/gradido/gradido/pull/1022) +- fix: Test Default Publisher ID in Sidebar Menu [`#987`](https://github.com/gradido/gradido/pull/987) +- increase_frontend_coverage [`#1020`](https://github.com/gradido/gradido/pull/1020) +- analyse_bundle [`#1019`](https://github.com/gradido/gradido/pull/1019) +- release_issue_template [`#1013`](https://github.com/gradido/gradido/pull/1013) +- fix_changelog [`#1014`](https://github.com/gradido/gradido/pull/1014) + #### [1.5.1](https://github.com/gradido/gradido/compare/1.5.0...1.5.1) > 15 October 2021 - fix isExitInDb [`#994`](https://github.com/gradido/gradido/pull/994) -- fix [`80228ef`](https://github.com/gradido/gradido/commit/80228ef842d4087ea4b80934b15b8112611e3e33) #### [1.5.0](https://github.com/gradido/gradido/compare/1.4.0...1.5.0) @@ -86,9 +348,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - update docker files [`#830`](https://github.com/gradido/gradido/pull/830) - added publisher_id field to user [`#245`](https://github.com/gradido/gradido/pull/245) - webpack update [`#811`](https://github.com/gradido/gradido/pull/811) -- resolvers [`562ad9a`](https://github.com/gradido/gradido/commit/562ad9ae31d97f90a371452bed1ffe10ebf2d3a5) -- deleted inputs (now args) [`8ab542a`](https://github.com/gradido/gradido/commit/8ab542a28acf6b78d7a9e7fe7757363d225f7b4f) -- fix UserCard_CoinAnimation to properly use the store, have 100% coverage and other minor fixes & simplifications [`ce826de`](https://github.com/gradido/gradido/commit/ce826deb1d6d92caba514713539dca2da3f74de7) #### [1.4.0](https://github.com/gradido/gradido/compare/1.3.1...1.4.0) @@ -130,9 +389,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - feat: Vue Apollo Client [`#701`](https://github.com/gradido/gradido/pull/701) - change text from Geld to Gradidos [`#711`](https://github.com/gradido/gradido/pull/711) - fix fix [`#728`](https://github.com/gradido/gradido/pull/728) -- sort locales [`ec12a28`](https://github.com/gradido/gradido/commit/ec12a28f81577d530f58b42b7f8c2c7d20dffd64) -- feat: Unify and Sort Locales [`aba4f4d`](https://github.com/gradido/gradido/commit/aba4f4d20e0a13016e3528a1c5c30c111eb3a9f1) -- feat: Increase Coverage [`3c061bc`](https://github.com/gradido/gradido/commit/3c061bcb8d1a3a47442ed6a351e1428e15b314aa) #### [1.3.1](https://github.com/gradido/gradido/compare/1.3.0...1.3.1) @@ -141,9 +397,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix: Translations and Formula Display [`#727`](https://github.com/gradido/gradido/pull/727) - 612 docu structure [`#688`](https://github.com/gradido/gradido/pull/688) - Community update for gdt list GDT transaction format [`#726`](https://github.com/gradido/gradido/pull/726) -- [#612] new directory structure in /docu/Concepts [`10bf3b0`](https://github.com/gradido/gradido/commit/10bf3b0cdfa6c44f879be0155e93f636601a051b) -- #612 additional documents [`ac0ed4f`](https://github.com/gradido/gradido/commit/ac0ed4fee81caff26d09b5de47dd130f12abdb45) -- #612 docu restructuring [`e67e1c4`](https://github.com/gradido/gradido/commit/e67e1c41e78264698e6fae4cf1d29751de7e7b29) #### [1.3.0](https://github.com/gradido/gradido/compare/1.2.1...1.3.0) @@ -165,9 +418,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Backend Setup [`#584`](https://github.com/gradido/gradido/pull/584) - text-size in textarea and font-variante if focus [`#677`](https://github.com/gradido/gradido/pull/677) - 680 app large maximum width [`#681`](https://github.com/gradido/gradido/pull/681) -- linting, server is working [`34b30b2`](https://github.com/gradido/gradido/commit/34b30b216b6fafcb5b686d4b023b05f2e9766bdf) -- server stack seems to work. Graphql does not load properly yet [`43f7cf8`](https://github.com/gradido/gradido/commit/43f7cf87679713d436a64d569d6af1594a12ee33) -- initial commit, base packages [`fdf0979`](https://github.com/gradido/gradido/commit/fdf0979830fece04208a6b3bb06bb5323a3c149b) #### [1.2.1](https://github.com/gradido/gradido/compare/1.2.0...1.2.1) @@ -178,9 +428,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix unneccessary migration run on fresh (docker) setup [`#654`](https://github.com/gradido/gradido/pull/654) - move back decay as standalone transaction in old frontend [`#656`](https://github.com/gradido/gradido/pull/656) - fix display error with creation [`#652`](https://github.com/gradido/gradido/pull/652) -- release [`a0b8056`](https://github.com/gradido/gradido/commit/a0b8056c17b22570a1b1dbb6fa6ce71e561b04af) -- update content for frontend [`d37ce09`](https://github.com/gradido/gradido/commit/d37ce0949ef97d2a6c6ffaf0be31db9f6d92e743) -- exchange positions [`bc000ef`](https://github.com/gradido/gradido/commit/bc000efd87c9701480c4aeaa7b819ab49bfe8f01) #### [1.2.0](https://github.com/gradido/gradido/compare/1.1.1...1.2.0) @@ -219,9 +466,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Update Password Reset E-Mail Subject Encoding [`#579`](https://github.com/gradido/gradido/pull/579) - move decay between transactions into the transactions [`#483`](https://github.com/gradido/gradido/pull/483) - fix #591 [`#591`](https://github.com/gradido/gradido/issues/591) -- fix style decay startblick [`cc7778b`](https://github.com/gradido/gradido/commit/cc7778b55d1baaa7be2d9440480e0fb27bb9a930) -- Remove dynamic cast because it lead to errors again and agin (Poco::AutoPtr don't work correct with that) [`0db5912`](https://github.com/gradido/gradido/commit/0db5912a67158be8f313c01f06350f8339cb0e28) -- Remove dynamic cast because it lead to errors again and agin (Poco::AutoPtr don't work correct with that) [`cee7d7a`](https://github.com/gradido/gradido/commit/cee7d7ac3c4c8c1f481cc3a87fb15422c858413b) #### [1.1.1](https://github.com/gradido/gradido/compare/1.1.0...1.1.1) @@ -232,9 +476,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - update transfer email text [`#574`](https://github.com/gradido/gradido/pull/574) - update mysql because tuple has changed [`#576`](https://github.com/gradido/gradido/pull/576) - Login fix pending transactions [`#578`](https://github.com/gradido/gradido/pull/578) -- add test to prevent bug in future [`630d667`](https://github.com/gradido/gradido/commit/630d667e996870a1bf9aa9586b0467d58419e525) -- use standard path. add nginx example [`ac249b4`](https://github.com/gradido/gradido/commit/ac249b46830a8039aec52d30b48084b50a264b6f) -- add autodeploy bash scripts [`f49cf4d`](https://github.com/gradido/gradido/commit/f49cf4d7f8054d87efa1e12055a7ef0c6d3b9872) #### [1.1.0](https://github.com/gradido/gradido/compare/1.0.2...1.1.0) @@ -276,9 +517,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - login without hedera [`#478`](https://github.com/gradido/gradido/pull/478) - fix: Show Correct Version Number in Footer [`#475`](https://github.com/gradido/gradido/pull/475) - refactor: Remove Element-UI [`#476`](https://github.com/gradido/gradido/pull/476) -- remove components Charts, Notification, SearchUser, ButtonCheckbox, Button RadioGroup, Breadcrumb [`159bff7`](https://github.com/gradido/gradido/commit/159bff71df20a5c48f93389b2f990f7fe54e53b9) -- fix bug, update dockerfiles to use dependencies without grpc [`dedcebd`](https://github.com/gradido/gradido/commit/dedcebdb95ee0f3dfd2ad62074d4181af38476a2) -- add warning to able to forward warnings from community server to client [`2fc3fe9`](https://github.com/gradido/gradido/commit/2fc3fe94a09bae199bf2f34f9df90e8fc3879c2b) #### [1.0.2](https://github.com/gradido/gradido/compare/1.0.1...1.0.2) @@ -305,17 +543,12 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - add dynamic error email if transaction failed [`#452`](https://github.com/gradido/gradido/pull/452) - ceil the last decay [`#449`](https://github.com/gradido/gradido/pull/449) - feat: Raise Coverage of Frontend Unit Tets to 18% [`#447`](https://github.com/gradido/gradido/pull/447) -- parse cpsp files automatic in build [`a4a12bb`](https://github.com/gradido/gradido/commit/a4a12bb62b4000e035ff15e17c5a5f5861653ff6) -- translate german html encoded error messages to english and use gettext for automatic translation [`d339627`](https://github.com/gradido/gradido/commit/d33962736d94c1cb7a12ff775bc2c8d7505d646e) -- 100% coverage of GddTransactionList [`96fb245`](https://github.com/gradido/gradido/commit/96fb245821c69f4d321204a663247d5eee60d92f) #### [1.0.1](https://github.com/gradido/gradido/compare/1.0.0...1.0.1) > 14 May 2021 - Login crash fix [`#444`](https://github.com/gradido/gradido/pull/444) -- add try catch blocks to prevent login-server from crashing [`22ff220`](https://github.com/gradido/gradido/commit/22ff22072956f8b843037c75c5b16b7ff5d6a2a3) -- fix [`14a4243`](https://github.com/gradido/gradido/commit/14a424347817b1fe6912a113bffd70e55d688112) ### [1.0.0](https://github.com/gradido/gradido/compare/0.9.4...1.0.0) @@ -435,9 +668,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Background color change [`#117`](https://github.com/gradido/gradido/pull/117) - Delete unused files [`#116`](https://github.com/gradido/gradido/pull/116) - store aufräumen teil 1 [`#115`](https://github.com/gradido/gradido/pull/115) -- add migrations table for automatic table data migration [`40a9a8c`](https://github.com/gradido/gradido/commit/40a9a8c2b587f5bef0fcc54136ed7bd13dd91b2b) -- update yarn.lock after running yarn install [`7f38c80`](https://github.com/gradido/gradido/commit/7f38c801213ad886e9d34a8d43b00ae423f5f2a0) -- use new function for balance overview in old frontend, update balance in session on every php-request [`97c570c`](https://github.com/gradido/gradido/commit/97c570c08cc51ed17a69eb8be8d987f95f3c2ce0) #### [0.9.4](https://github.com/gradido/gradido/compare/0.9.3...0.9.4) @@ -445,9 +675,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Vue with nginx [`#84`](https://github.com/gradido/gradido/pull/84) - Build on run [`#103`](https://github.com/gradido/gradido/pull/103) -- update debug docker to use dependencies container pushed to docker hub [`1f002f4`](https://github.com/gradido/gradido/commit/1f002f4ed0b12d4b2bf63efceabe546d0c5b58ea) -- removed email tasks complete [`8a143be`](https://github.com/gradido/gradido/commit/8a143be8423d7bd894d4f512848895df8b9694b0) -- build login-server on docker-compose up in a docker volume so it rebuild only neccessary parts if some c++ files have changed [`0da5279`](https://github.com/gradido/gradido/commit/0da527917523530186e6effe63dc001fc99bd3e3) #### [0.9.3](https://github.com/gradido/gradido/compare/0.9.2...0.9.3) @@ -476,9 +703,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Add Feature in user search old frontend because Support has requested the feature long ago [`#56`](https://github.com/gradido/gradido/pull/56) - sprache angepasst, for login, pwd, sigin [`#54`](https://github.com/gradido/gradido/pull/54) - Improve workflows [`#53`](https://github.com/gradido/gradido/pull/53) -- setup eslint with tougher rules [`1f13507`](https://github.com/gradido/gradido/commit/1f13507eacfd93c2248fb841de5f481c9eb1e6bd) -- semicolon rule implemented [`6762a02`](https://github.com/gradido/gradido/commit/6762a028f2a3e4f2713b26bed81029defe686ad7) -- dev meeting, bernd [`a99de7f`](https://github.com/gradido/gradido/commit/a99de7f5d1f7557c0877eae565aa4263d65aaaf3) #### [0.9.2](https://github.com/gradido/gradido/compare/0.9.1...0.9.2) @@ -488,9 +712,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Reload after login fixed [`#50`](https://github.com/gradido/gradido/pull/50) - Monorepo login server [`#48`](https://github.com/gradido/gradido/pull/48) - Stage0 [`#3`](https://github.com/gradido/gradido/pull/3) -- Add auto-sign Transaction functionality [`5592275`](https://github.com/gradido/gradido/commit/55922753a7ffd9552be132501d744da491c409b5) -- read in login the real client ip X-Real-IP from nginx forwarded not from community server [`512d307`](https://github.com/gradido/gradido/commit/512d307a19b955bb6e26ae8b274def354829b50f) -- move check if all passwords allow direct into pwdValidation so it will work with every code which ask for password [`e2c38c1`](https://github.com/gradido/gradido/commit/e2c38c1a0fc25a4a2bc922c4bbc44d86b6d00d8b) #### 0.9.1 @@ -502,6 +723,3 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - [WIP] 2 create a dockerfile for the frontend application [`#6`](https://github.com/gradido/gradido/pull/6) - Master - first step [`#1`](https://github.com/gradido/gradido/pull/1) - Add docker compose [`#7`](https://github.com/gradido/gradido/pull/7) -- style 404 side :) [`c7bdf89`](https://github.com/gradido/gradido/commit/c7bdf8978594b932615e48f9bb1c19d3c3bf3fcf) -- publish workflow test [`df6f66f`](https://github.com/gradido/gradido/commit/df6f66ffe70baa9ed3f70b460a6c0c14011bb944) -- many translations. translation structure [`bf68547`](https://github.com/gradido/gradido/commit/bf685479767d19c246c4d6abe3577dc3cb666346) diff --git a/README.md b/README.md index ce8e84df0..e97055a78 100644 --- a/README.md +++ b/README.md @@ -60,14 +60,12 @@ docker-compose -f docker-compose.yml up - [frontend](./frontend) Wallet frontend - [backend](./backend) GraphQL & Business logic backend - [mariadb](./mariadb) Database backend -- [login_server](./login_server) User credential storage & business logic backend -- [community_server](./community_server/) Business logic backend We are currently restructuring the service to reduce dependencies and unify business logic into one place. Furthermore the databases defined for each service will be unified into one. ### Open the wallet -Once you have `docker-compose` up and running, you can open [http://localhost/vue](http://localhost/vue) and create yourself a new wallet account. +Once you have `docker-compose` up and running, you can open [http://localhost/](http://localhost/) and create yourself a new wallet account. ## How to release @@ -90,7 +88,7 @@ Note: The Changelog will be regenerated with all tags on release on the external | Problem | Issue | Solution | Description | | ------- | ----- | -------- | ----------- | | docker-compose raises database connection errors | [#1062](https://github.com/gradido/gradido/issues/1062) | End `ctrl+c` and restart the `docker-compose up` after a successful build | Several Database connection related errors occur in the docker-compose log. | -| Wallet page is empty | [#1063](https://github.com/gradido/gradido/issues/1063) | Accept Cookies and Local Storage in your Browser | The page stays empty when navigating to [http://localhost/vue](http://localhost/vue) | +| Wallet page is empty | [#1063](https://github.com/gradido/gradido/issues/1063) | Accept Cookies and Local Storage in your Browser | The page stays empty when navigating to [http://localhost/](http://localhost/) | ## Useful Links diff --git a/admin/.dockerignore b/admin/.dockerignore index 88249539f..1ddda051a 100644 --- a/admin/.dockerignore +++ b/admin/.dockerignore @@ -1,3 +1,4 @@ node_modules .git -.gitignore \ No newline at end of file +.gitignore +!.eslintignore \ No newline at end of file diff --git a/admin/.env.dist b/admin/.env.dist index 6d78e6782..d7044669a 100644 --- a/admin/.env.dist +++ b/admin/.env.dist @@ -1,3 +1,6 @@ +CONFIG_VERSION=v1.2022-03-18 + GRAPHQL_URI=http://localhost:4000/graphql -WALLET_AUTH_URL=http://localhost/vue/authenticate?token=$1 +WALLET_AUTH_URL=http://localhost/authenticate?token={token} +WALLET_URL=http://localhost/login DEBUG_DISABLE_AUTH=false \ No newline at end of file diff --git a/admin/.env.template b/admin/.env.template new file mode 100644 index 000000000..488c9aba4 --- /dev/null +++ b/admin/.env.template @@ -0,0 +1,6 @@ +CONFIG_VERSION=$ADMIN_CONFIG_VERSION + +GRAPHQL_URI=$GRAPHQL_URI +WALLET_AUTH_URL=$WALLET_AUTH_URL +WALLET_URL=$WALLET_URL +DEBUG_DISABLE_AUTH=false \ No newline at end of file diff --git a/admin/.eslintignore b/admin/.eslintignore index 433390392..94934f9e7 100644 --- a/admin/.eslintignore +++ b/admin/.eslintignore @@ -1,4 +1,3 @@ -node_modules -coverage -**/*.min.js -dist \ No newline at end of file +node_modules/ +dist/ +coverage/ \ No newline at end of file diff --git a/admin/.eslintrc.js b/admin/.eslintrc.js index 8c410feba..73dce291f 100644 --- a/admin/.eslintrc.js +++ b/admin/.eslintrc.js @@ -8,14 +8,42 @@ module.exports = { parserOptions: { parser: 'babel-eslint', }, - extends: ['standard', 'plugin:vue/essential', 'plugin:prettier/recommended'], + extends: [ + 'standard', + 'plugin:vue/essential', + 'plugin:prettier/recommended', + 'plugin:@intlify/vue-i18n/recommended', + ], // required to lint *.vue files plugins: ['vue', 'prettier', 'jest'], + overrides: [ + { + files: ['*.json'], + extends: ['plugin:@intlify/vue-i18n/recommended'], + }, + ], // add your custom rules here rules: { 'no-console': ['error'], 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'vue/component-name-in-template-casing': ['error', 'kebab-case'], + 'vue/no-static-inline-styles': [ + 'error', + { + allowBinding: false, + }, + ], + '@intlify/vue-i18n/no-dynamic-keys': 'error', + '@intlify/vue-i18n/no-unused-keys': [ + 'error', + { + src: './src', + extensions: ['.js', '.vue'], + ignores: [], + enableFix: false, + }, + ], + '@intlify/vue-i18n/no-missing-keys-in-other-locales': 'error', 'prettier/prettier': [ 'error', { @@ -23,4 +51,12 @@ module.exports = { }, ], }, + settings: { + 'vue-i18n': { + localeDir: './src/locales/*.json', + // Specify the version of `vue-i18n` you are using. + // If not specified, the message will be parsed twice. + messageSyntaxVersion: '^8.26.5', + }, + }, } diff --git a/admin/.gitignore b/admin/.gitignore index a2d05ce19..6bb62f667 100644 --- a/admin/.gitignore +++ b/admin/.gitignore @@ -2,7 +2,8 @@ node_modules/ dist/ .cache/ -.env +/.env +/.env.bak # coverage folder coverage/ diff --git a/admin/.stylelintrc.js b/admin/.stylelintrc.js new file mode 100644 index 000000000..061b87a79 --- /dev/null +++ b/admin/.stylelintrc.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = { + extends: ["stylelint-config-standard-scss", "stylelint-config-recommended-vue"], + overrides: [ + { + files: "**/*.{scss}", + customSyntax: "postcss-scss", + extends: ["stylelint-config-standard-scss"], + }, + { + files: "**/*.vue", + customSyntax: "postcss-html", + extends: ["stylelint-config-recommended-vue"], + } + ] + +}; \ No newline at end of file diff --git a/admin/package.json b/admin/package.json index c94d0a2b0..2b4be2851 100644 --- a/admin/package.json +++ b/admin/package.json @@ -3,17 +3,19 @@ "description": "Administraion Interface for Gradido", "main": "index.js", "author": "Moriz Wahl", - "version": "0.1.0", + "version": "1.6.6", "license": "MIT", "private": false, "scripts": { "start": "node run/server.js", "serve": "vue-cli-service serve --open", - "dev": "yarn run serve", "build": "vue-cli-service build", - "lint": "eslint --ext .js,.vue .", - "test": "jest --coverage", - "locales": "scripts/missing-keys.sh && scripts/sort.sh" + "dev": "yarn run serve", + "analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json", + "lint": "eslint --max-warnings=0 --ext .js,.vue,.json .", + "stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'", + "test": "TZ=UTC jest --coverage", + "locales": "scripts/sort.sh" }, "dependencies": { "@babel/core": "^7.15.8", @@ -28,28 +30,28 @@ "babel-plugin-component": "^1.1.1", "babel-preset-env": "^1.7.0", "babel-preset-vue": "^2.0.2", - "bootstrap": "^5.1.3", + "bootstrap": "4.3.1", "bootstrap-vue": "^2.21.2", "core-js": "^3.6.5", "dotenv-webpack": "^7.0.3", + "express": "^4.17.1", "graphql": "^15.6.1", "identity-obj-proxy": "^3.0.0", "jest": "26.6.3", - "moment": "^2.29.1", + "portal-vue": "^2.1.7", "regenerator-runtime": "^0.13.9", "stats-webpack-plugin": "^0.7.0", "vue": "^2.6.11", "vue-apollo": "^3.0.8", "vue-i18n": "^8.26.5", "vue-jest": "^3.0.7", - "vue-moment": "^4.1.0", "vue-router": "^3.5.3", - "vue-toasted": "^1.1.28", "vuex": "^3.6.2", "vuex-persistedstate": "^4.1.0" }, "devDependencies": { "@babel/eslint-parser": "^7.15.8", + "@intlify/eslint-plugin-vue-i18n": "^1.4.0", "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", "@vue/cli-service": "~4.5.0", @@ -66,6 +68,13 @@ "eslint-plugin-promise": "^5.1.1", "eslint-plugin-vue": "^7.20.0", "jest-environment-jsdom-sixteen": "^2.0.0", + "postcss": "^8.4.8", + "postcss-html": "^1.3.0", + "postcss-scss": "^4.0.3", + "stylelint": "^14.5.3", + "stylelint-config-recommended-vue": "^1.3.0", + "stylelint-config-standard-scss": "^3.0.0", + "vue-cli-plugin-i18n": "^2.3.1", "vue-template-compiler": "^2.6.11" }, "browserslist": [ diff --git a/admin/public/img/elopage_favicon.png b/admin/public/img/elopage_favicon.png new file mode 100644 index 000000000..2da7efbc0 Binary files /dev/null and b/admin/public/img/elopage_favicon.png differ diff --git a/admin/run/server.js b/admin/run/server.js index 97a525427..bccefc65c 100644 --- a/admin/run/server.js +++ b/admin/run/server.js @@ -1,15 +1,21 @@ // Imports const express = require('express') -const serveStatic = require('serve-static') +const path = require('path') -// Port +// Host & Port +const hostname = '127.0.0.1' const port = process.env.PORT || 8080 // Express Server const app = express() -// eslint-disable-next-line node/no-path-concat -app.use(serveStatic(__dirname + '/../dist')) -app.listen(port) +// Serve files +app.use(express.static(path.join(__dirname, '../dist'))) +// Default to index.html +app.get('*', (req, res) => { + res.sendFile(path.join(__dirname, '../dist/index.html')) +}) -// eslint-disable-next-line no-console -console.log(`http://admin:${port} server started.`) +app.listen(port, hostname, () => { + // eslint-disable-next-line no-console + console.log('Listening at http://%s:%s/', hostname, port) +}) diff --git a/admin/src/App.vue b/admin/src/App.vue index 40460eda4..bcaab2ef9 100644 --- a/admin/src/App.vue +++ b/admin/src/App.vue @@ -13,3 +13,11 @@ export default { components: { defaultLayout }, } + diff --git a/admin/src/components/ConfirmRegisterMailFormular.spec.js b/admin/src/components/ConfirmRegisterMailFormular.spec.js index 705a185a3..e9e21b31e 100644 --- a/admin/src/components/ConfirmRegisterMailFormular.spec.js +++ b/admin/src/components/ConfirmRegisterMailFormular.spec.js @@ -1,24 +1,21 @@ import { mount } from '@vue/test-utils' import ConfirmRegisterMailFormular from './ConfirmRegisterMailFormular.vue' +import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup' + const localVue = global.localVue const apolloMutateMock = jest.fn().mockResolvedValue() -const toastSuccessMock = jest.fn() -const toastErrorMock = jest.fn() const mocks = { $t: jest.fn((t) => t), $apollo: { mutate: apolloMutateMock, }, - $toasted: { - success: toastSuccessMock, - error: toastErrorMock, - }, } const propsData = { + checked: false, email: 'bob@baumeister.de', dateLastSend: '', } @@ -53,7 +50,7 @@ describe('ConfirmRegisterMailFormular', () => { }) it('toasts a success message', () => { - expect(toastSuccessMock).toBeCalledWith('unregister_mail.success') + expect(toastSuccessSpy).toBeCalledWith('unregister_mail.success') }) }) @@ -65,7 +62,7 @@ describe('ConfirmRegisterMailFormular', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('unregister_mail.error') + expect(toastErrorSpy).toBeCalledWith('unregister_mail.error') }) }) }) diff --git a/admin/src/components/ConfirmRegisterMailFormular.vue b/admin/src/components/ConfirmRegisterMailFormular.vue index 5052a8a3e..1b72f55d0 100644 --- a/admin/src/components/ConfirmRegisterMailFormular.vue +++ b/admin/src/components/ConfirmRegisterMailFormular.vue @@ -1,19 +1,24 @@ @@ -23,6 +28,9 @@ import { sendActivationEmail } from '../graphql/sendActivationEmail' export default { name: 'ConfirmRegisterMail', props: { + checked: { + type: Boolean, + }, email: { type: String, }, @@ -40,10 +48,10 @@ export default { }, }) .then(() => { - this.$toasted.success(this.$t('unregister_mail.success', { email: this.email })) + this.toastSuccess(this.$t('unregister_mail.success', { email: this.email })) }) .catch((error) => { - this.$toasted.error(this.$t('unregister_mail.error', { message: error.message })) + this.toastError(this.$t('unregister_mail.error', { message: error.message })) }) }, }, diff --git a/admin/src/components/ContentFooter.vue b/admin/src/components/ContentFooter.vue index 1e7e20f9e..c10e53596 100644 --- a/admin/src/components/ContentFooter.vue +++ b/admin/src/components/ContentFooter.vue @@ -1,15 +1,45 @@ diff --git a/admin/src/components/CreationFormular.spec.js b/admin/src/components/CreationFormular.spec.js index 5b0ac09f5..083b7ca67 100644 --- a/admin/src/components/CreationFormular.spec.js +++ b/admin/src/components/CreationFormular.spec.js @@ -1,39 +1,25 @@ import { mount } from '@vue/test-utils' import CreationFormular from './CreationFormular.vue' +import { createPendingCreation } from '../graphql/createPendingCreation' +import { createPendingCreations } from '../graphql/createPendingCreations' +import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup' const localVue = global.localVue -const apolloMock = jest.fn().mockResolvedValue({ - data: { - verifyLogin: { - name: 'success', - id: 0, - }, - }, -}) const apolloMutateMock = jest.fn().mockResolvedValue({ data: { createPendingCreation: [0, 0, 0], }, }) const stateCommitMock = jest.fn() -const toastedErrorMock = jest.fn() -const toastedSuccessMock = jest.fn() const mocks = { - $t: jest.fn((t) => t), - $moment: jest.fn(() => { - return { - format: jest.fn((m) => m), - subtract: jest.fn(() => { - return { - format: jest.fn((m) => m), - } - }), - } + $t: jest.fn((t, options) => (options ? [t, options] : t)), + $d: jest.fn((d) => { + const date = new Date(d) + return date.toISOString().split('T')[0] }), $apollo: { - query: apolloMock, mutate: apolloMutateMock, }, $store: { @@ -45,16 +31,17 @@ const mocks = { }, }, }, - $toasted: { - error: toastedErrorMock, - success: toastedSuccessMock, - }, } const propsData = { type: '', creation: [], - itemsMassCreation: {}, +} + +const now = new Date(Date.now()) +const getCreationDate = (sub) => { + const date = sub === 0 ? now : new Date(now.getFullYear(), now.getMonth() - sub, 1, 0) + return date.toISOString().split('T')[0] } describe('CreationFormular', () => { @@ -73,21 +60,24 @@ describe('CreationFormular', () => { expect(wrapper.find('.component-creation-formular').exists()).toBeTruthy() }) - describe('server sends back moderator data', () => { - it('called store commit with mocked data', () => { - expect(stateCommitMock).toBeCalledWith('moderator', { name: 'success', id: 0 }) - }) - }) - - describe('server throws error for moderator data call', () => { - beforeEach(() => { - jest.clearAllMocks() - apolloMock.mockRejectedValueOnce({ message: 'Ouch!' }) - wrapper = Wrapper() + describe('text and value form props', () => { + beforeEach(async () => { + wrapper = mount(CreationFormular, { + localVue, + mocks, + propsData: { + creationUserData: { memo: 'Memo from property', amount: 42 }, + ...propsData, + }, + }) }) - it('has called store commit with fake data', () => { - expect(stateCommitMock).toBeCalledWith('moderator', { id: 0, name: 'Test Moderator' }) + it('has text taken from props', () => { + expect(wrapper.vm.text).toBe('Memo from property') + }) + + it('has value taken from props', () => { + expect(wrapper.vm.value).toBe(42) }) }) @@ -96,68 +86,22 @@ describe('CreationFormular', () => { expect(wrapper.findAll('input[type="radio"]').length).toBe(3) }) - describe('with mass creation', () => { - beforeEach(async () => { - jest.clearAllMocks() - await wrapper.setProps({ type: 'massCreation', creation: [200, 400, 600] }) - await wrapper.setData({ rangeMin: 180 }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) - }) - - describe('first radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(0).setChecked() - }) - - it('emits update-radio-selected with index 0', () => { - expect(wrapper.emitted()['update-radio-selected']).toEqual([ - [expect.arrayContaining([0])], - ]) - }) - }) - - describe('second radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(1).setChecked() - }) - - it('emits update-radio-selected with index 1', () => { - expect(wrapper.emitted()['update-radio-selected']).toEqual([ - [expect.arrayContaining([1])], - ]) - }) - }) - - describe('third radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(2).setChecked() - }) - - it('emits update-radio-selected with index 2', () => { - expect(wrapper.emitted()['update-radio-selected']).toEqual([ - [expect.arrayContaining([2])], - ]) - }) - }) - }) - describe('with single creation', () => { beforeEach(async () => { jest.clearAllMocks() - await wrapper.setProps({ type: 'singleCreation', creation: [200, 400, 600] }) - await wrapper.setData({ rangeMin: 180 }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) + await wrapper.setProps({ + type: 'singleCreation', + creation: [200, 400, 600], + item: { email: 'benjamin@bluemchen.de' }, + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('input[type="number"]').setValue(90) }) describe('first radio button', () => { beforeEach(async () => { await wrapper.findAll('input[type="radio"]').at(0).setChecked() - }) - - it('sets rangeMin to 0', () => { - expect(wrapper.vm.rangeMin).toBe(0) + await wrapper.find('textarea').setValue('Test create coins') }) it('sets rangeMax to 200', () => { @@ -170,18 +114,50 @@ describe('CreationFormular', () => { }) it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalled() + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + mutation: createPendingCreation, + variables: { + email: 'benjamin@bluemchen.de', + creationDate: getCreationDate(2), + amount: 90, + memo: 'Test create coins', + moderator: 0, + }, + }), + ) + }) + + it('emits update-user-data', () => { + expect(wrapper.emitted('update-user-data')).toEqual([ + [{ email: 'benjamin@bluemchen.de' }, [0, 0, 0]], + ]) + }) + + it('toasts a success message', () => { + expect(toastSuccessSpy).toBeCalledWith([ + 'creation_form.toasted', + { email: 'benjamin@bluemchen.de', value: '90' }, + ]) + }) + + it('updates open creations in store', () => { + expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 1) + }) + + it('resets the form data', () => { + expect(wrapper.vm.value).toBe(0) }) }) - describe('sendForm', () => { + describe('sendForm with server error', () => { beforeEach(async () => { apolloMutateMock.mockRejectedValueOnce({ message: 'Ouch!' }) await wrapper.find('.test-submit').trigger('click') }) it('toasts an error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') + expect(toastErrorSpy).toBeCalledWith('Ouch!') }) }) @@ -311,7 +287,7 @@ describe('CreationFormular', () => { }) it('toast success message', () => { - expect(toastedSuccessMock).toBeCalled() + expect(toastSuccessSpy).toBeCalled() }) it('store commit openCreationPlus', () => { @@ -359,6 +335,124 @@ describe('CreationFormular', () => { }) }) }) + + describe('mass creation with success', () => { + beforeEach(async () => { + jest.clearAllMocks() + apolloMutateMock.mockResolvedValue({ + data: { + createPendingCreations: { + success: true, + successfulCreation: ['bob@baumeister.de', 'bibi@bloxberg.de'], + failedCreation: [], + }, + }, + }) + await wrapper.setProps({ + type: 'massCreation', + creation: [200, 400, 600], + items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }], + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test mass create coins') + await wrapper.find('input[type="number"]').setValue(200) + await wrapper.find('.test-submit').trigger('click') + }) + + it('calls the API', () => { + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + mutation: createPendingCreations, + variables: { + pendingCreations: [ + { + email: 'bob@baumeister.de', + creationDate: getCreationDate(1), + amount: 200, + memo: 'Test mass create coins', + moderator: 0, + }, + { + email: 'bibi@bloxberg.de', + creationDate: getCreationDate(1), + amount: 200, + memo: 'Test mass create coins', + moderator: 0, + }, + ], + }, + }), + ) + }) + + it('updates open creations in store', () => { + expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 2) + }) + + it('emits remove-all-bookmark', () => { + expect(wrapper.emitted('remove-all-bookmark')).toBeTruthy() + }) + }) + + describe('mass creation with success but all failed', () => { + beforeEach(async () => { + jest.clearAllMocks() + apolloMutateMock.mockResolvedValue({ + data: { + createPendingCreations: { + success: true, + successfulCreation: [], + failedCreation: ['bob@baumeister.de', 'bibi@bloxberg.de'], + }, + }, + }) + await wrapper.setProps({ + type: 'massCreation', + creation: [200, 400, 600], + items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }], + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test mass create coins') + await wrapper.find('input[type="number"]').setValue(200) + await wrapper.find('.test-submit').trigger('click') + }) + + it('updates open creations in store', () => { + expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 0) + }) + + it('emits remove all bookmarks', () => { + expect(wrapper.emitted('remove-all-bookmark')).toBeTruthy() + }) + + it('emits toast failed creations with two emails', () => { + expect(wrapper.emitted('toast-failed-creations')).toEqual([ + [['bob@baumeister.de', 'bibi@bloxberg.de']], + ]) + }) + }) + + describe('mass creation with error', () => { + beforeEach(async () => { + jest.clearAllMocks() + apolloMutateMock.mockRejectedValue({ + message: 'Oh no!', + }) + await wrapper.setProps({ + type: 'massCreation', + creation: [200, 400, 600], + items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }], + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test mass create coins') + await wrapper.find('input[type="number"]').setValue(200) + await wrapper.find('.test-submit').trigger('click') + }) + + it('toasts an error message', () => { + expect(toastErrorSpy).toBeCalledWith('Oh no!') + }) + }) }) }) }) diff --git a/admin/src/components/CreationFormular.vue b/admin/src/components/CreationFormular.vue index 49993d14a..cd4de5fd6 100644 --- a/admin/src/components/CreationFormular.vue +++ b/admin/src/components/CreationFormular.vue @@ -3,53 +3,19 @@ {{ $t('creation_form.form') }}
- +
- - - - - - - - - - - - - - - +
+ + - - +
@@ -60,7 +26,6 @@ :max="rangeMax" > -
- +
- +
- + {{ $t('creation_form.reset') }} @@ -98,18 +63,17 @@ variant="success" class="test-submit" @click="submitCreation" - :disabled="radioSelected === '' || value <= 0 || text.length < 10" + :disabled="selected === '' || value <= 0 || text.length < 10" > {{ $t('creation_form.update_creation') }} - {{ $t('creation_form.submit_creation') }} @@ -121,11 +85,12 @@
diff --git a/admin/src/components/CreationTransactionListFormular.spec.js b/admin/src/components/CreationTransactionListFormular.spec.js index 9817d6b8f..fb137e516 100644 --- a/admin/src/components/CreationTransactionListFormular.spec.js +++ b/admin/src/components/CreationTransactionListFormular.spec.js @@ -1,71 +1,49 @@ import { mount } from '@vue/test-utils' import CreationTransactionListFormular from './CreationTransactionListFormular.vue' +import { toastErrorSpy } from '../../test/testSetup' const localVue = global.localVue const apolloQueryMock = jest.fn().mockResolvedValue({ data: { - transactionList: { - transactions: [ - { - type: 'created', - balance: 100, - decayStart: 0, - decayEnd: 0, - decayDuration: 0, - memo: 'Testing', - transactionId: 1, - name: 'Bibi', - email: 'bibi@bloxberg.de', - date: new Date(), - decay: { - balance: 0.01, - decayStart: 0, - decayEnd: 0, - decayDuration: 0, - decayStartBlock: 0, - }, + creationTransactionList: [ + { + id: 1, + amount: 100, + balanceDate: 0, + creationDate: new Date(), + memo: 'Testing', + linkedUser: { + firstName: 'Gradido', + lastName: 'Akademie', }, - { - type: 'created', - balance: 200, - decayStart: 0, - decayEnd: 0, - decayDuration: 0, - memo: 'Testing 2', - transactionId: 2, - name: 'Bibi', - email: 'bibi@bloxberg.de', - date: new Date(), - decay: { - balance: 0.01, - decayStart: 0, - decayEnd: 0, - decayDuration: 0, - decayStartBlock: 0, - }, + }, + { + id: 2, + amount: 200, + balanceDate: 0, + creationDate: new Date(), + memo: 'Testing 2', + linkedUser: { + firstName: 'Gradido', + lastName: 'Akademie', }, - ], - }, + }, + ], }, }) -const toastedErrorMock = jest.fn() - const mocks = { + $d: jest.fn((t) => t), $t: jest.fn((t) => t), $apollo: { query: apolloQueryMock, }, - $toasted: { - global: { - error: toastedErrorMock, - }, - }, } const propsData = { userId: 1, + fields: ['date', 'balance', 'name', 'memo', 'decay'], } describe('CreationTransactionListFormular', () => { @@ -87,7 +65,6 @@ describe('CreationTransactionListFormular', () => { currentPage: 1, pageSize: 25, order: 'DESC', - onlyCreations: true, userId: 1, }, }), @@ -109,7 +86,7 @@ describe('CreationTransactionListFormular', () => { }) it('toast error', () => { - expect(toastedErrorMock).toBeCalledWith('OUCH!') + expect(toastErrorSpy).toBeCalledWith('OUCH!') }) }) }) diff --git a/admin/src/components/CreationTransactionListFormular.vue b/admin/src/components/CreationTransactionListFormular.vue index 09e1fa92a..ce2b136a4 100644 --- a/admin/src/components/CreationTransactionListFormular.vue +++ b/admin/src/components/CreationTransactionListFormular.vue @@ -1,11 +1,11 @@ + diff --git a/admin/src/components/EditCreationFormular.spec.js b/admin/src/components/EditCreationFormular.spec.js index ed0f412ba..f5c7fb0fe 100644 --- a/admin/src/components/EditCreationFormular.spec.js +++ b/admin/src/components/EditCreationFormular.spec.js @@ -1,5 +1,6 @@ import { mount } from '@vue/test-utils' import EditCreationFormular from './EditCreationFormular.vue' +import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup' const localVue = global.localVue @@ -7,28 +8,21 @@ const apolloMutateMock = jest.fn().mockResolvedValue({ data: { updatePendingCreation: { creation: [0, 0, 0], + amount: 500, date: new Date(), - memo: 'qwertzuiopasdfghjkl', + memo: 'Test Schöpfung 2', moderator: 0, }, }, }) const stateCommitMock = jest.fn() -const toastedErrorMock = jest.fn() -const toastedSuccessMock = jest.fn() const mocks = { $t: jest.fn((t) => t), - $moment: jest.fn(() => { - return { - format: jest.fn((m) => m), - subtract: jest.fn(() => { - return { - format: jest.fn((m) => m), - } - }), - } + $d: jest.fn((d) => { + const date = new Date(d) + return date.toISOString().split('T')[0] }), $apollo: { mutate: apolloMutateMock, @@ -42,10 +36,12 @@ const mocks = { }, commit: stateCommitMock, }, - $toasted: { - error: toastedErrorMock, - success: toastedSuccessMock, - }, +} + +const now = new Date(Date.now()) +const getCreationDate = (sub) => { + const date = sub === 0 ? now : new Date(now.getFullYear(), now.getMonth() - sub, 1, 0) + return date.toISOString().split('T')[0] } const propsData = { @@ -53,7 +49,7 @@ const propsData = { creationUserData: { memo: 'Test schöpfung 1', amount: 100, - date: '2021-12-01', + date: getCreationDate(0), }, item: { id: 0, @@ -82,196 +78,79 @@ describe('EditCreationFormular', () => { expect(wrapper.findAll('input[type="radio"]').length).toBe(3) }) - describe('with single creation', () => { + it('has the third radio button checked', () => { + expect(wrapper.findAll('input[type="radio"]').at(0).element.checked).toBeFalsy() + expect(wrapper.findAll('input[type="radio"]').at(1).element.checked).toBeFalsy() + expect(wrapper.findAll('input[type="radio"]').at(2).element.checked).toBeTruthy() + }) + + it('has rangeMax of 700', () => { + expect(wrapper.find('input[type="number"]').attributes('max')).toBe('700') + }) + + describe('change and save memo and value with success', () => { beforeEach(async () => { - jest.clearAllMocks() - await wrapper.setProps({ creation: [200, 400, 600] }) - await wrapper.setData({ rangeMin: 180 }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) + await wrapper.find('input[type="number"]').setValue(500) + await wrapper.find('textarea').setValue('Test Schöpfung 2') + await wrapper.find('.test-submit').trigger('click') }) - describe('first radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(0).setChecked() - }) - - it('sets rangeMin to 0', () => { - expect(wrapper.vm.rangeMin).toBe(0) - }) - - it('sets rangeMax to 200', () => { - expect(wrapper.vm.rangeMax).toBe(200) - }) - - describe('sendForm', () => { - beforeEach(async () => { - await wrapper.find('.test-submit').trigger('click') - }) - - it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalledWith( - expect.objectContaining({ - variables: { - amount: 90, - creationDate: 'YYYY-MM-01', - email: 'bob@baumeister.de', - id: 0, - memo: 'Test create coins', - moderator: 0, - }, - }), - ) - }) - - it('emits update-user-data', () => { - expect(wrapper.emitted('update-user-data')).toBeTruthy() - expect(wrapper.emitted('update-user-data')).toEqual([ - [ - { - id: 0, - email: 'bob@baumeister.de', - }, - [0, 0, 0], - ], - ]) - }) - - it('toast success message', () => { - expect(toastedSuccessMock).toBeCalledWith('creation_form.toasted_update') - }) - - describe('sendForm with error', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutateMock.mockRejectedValue({ - message: 'Ouch!', - }) - wrapper = Wrapper() - await wrapper.setProps({ type: 'singleCreation', creation: [200, 400, 600] }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) - await wrapper.findAll('input[type="radio"]').at(0).setChecked() - await wrapper.setData({ rangeMin: 100 }) - await wrapper.find('.test-submit').trigger('click') - }) - - it('toast error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') - }) - }) - }) + it('calls the API', () => { + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + variables: { + id: 0, + email: 'bob@baumeister.de', + creationDate: getCreationDate(0), + amount: 500, + memo: 'Test Schöpfung 2', + moderator: 0, + }, + }), + ) }) - describe('second radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(1).setChecked() - }) - - it('sets rangeMin to 0', () => { - expect(wrapper.vm.rangeMin).toBe(0) - }) - - it('sets rangeMax to 400', () => { - expect(wrapper.vm.rangeMax).toBe(400) - }) - - describe('sendForm', () => { - beforeEach(async () => { - await wrapper.find('.test-submit').trigger('click') - }) - - it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalledWith( - expect.objectContaining({ - variables: { - amount: 90, - creationDate: 'YYYY-MM-01', - email: 'bob@baumeister.de', - id: 0, - memo: 'Test create coins', - moderator: 0, - }, - }), - ) - }) - - describe('sendForm with error', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutateMock.mockRejectedValue({ - message: 'Ouch!', - }) - wrapper = Wrapper() - await wrapper.setProps({ creation: [200, 400, 600] }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 100 }) - await wrapper.findAll('input[type="radio"]').at(1).setChecked() - await wrapper.setData({ rangeMin: 180 }) - await wrapper.find('.test-submit').trigger('click') - }) - - it('toast error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') - }) - }) - }) + it('emits update-user-data', () => { + expect(wrapper.emitted('update-user-data')).toEqual([ + [ + { + id: 0, + email: 'bob@baumeister.de', + }, + [0, 0, 0], + ], + ]) }) - describe('third radio button', () => { - beforeEach(async () => { - await wrapper.setData({ rangeMin: 180 }) - await wrapper.findAll('input[type="radio"]').at(2).setChecked() - }) + it('emits update-creation-data', () => { + expect(wrapper.emitted('update-creation-data')).toEqual([ + [ + { + amount: 500, + date: expect.any(Date), + memo: 'Test Schöpfung 2', + moderator: 0, + row: expect.any(Object), + }, + ], + ]) + }) - it('sets rangeMin to 180', () => { - expect(wrapper.vm.rangeMin).toBe(180) - }) + it('toasts a success message', () => { + expect(toastSuccessSpy).toBeCalledWith('creation_form.toasted_update') + }) + }) - it('sets rangeMax to 700', () => { - expect(wrapper.vm.rangeMax).toBe(700) - }) + describe('change and save memo and value with error', () => { + beforeEach(async () => { + apolloMutateMock.mockRejectedValue({ message: 'Oh no!' }) + await wrapper.find('input[type="number"]').setValue(500) + await wrapper.find('textarea').setValue('Test Schöpfung 2') + await wrapper.find('.test-submit').trigger('click') + }) - describe('sendForm with success', () => { - beforeEach(async () => { - await wrapper.find('.test-submit').trigger('click') - }) - - it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalledWith( - expect.objectContaining({ - variables: { - amount: 90, - creationDate: 'YYYY-MM-DD', - email: 'bob@baumeister.de', - id: 0, - memo: 'Test create coins', - moderator: 0, - }, - }), - ) - }) - }) - - describe('sendForm with error', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutateMock.mockRejectedValue({ - message: 'Ouch!', - }) - wrapper = Wrapper() - await wrapper.setProps({ creation: [200, 400, 600] }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) - await wrapper.findAll('input[type="radio"]').at(2).setChecked() - await wrapper.setData({ rangeMin: 180 }) - await wrapper.find('.test-submit').trigger('click') - }) - - it('toast error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') - }) - }) + it('toasts an error message', () => { + expect(toastErrorSpy).toBeCalledWith('Oh no!') }) }) }) diff --git a/admin/src/components/EditCreationFormular.vue b/admin/src/components/EditCreationFormular.vue index 172ae5509..82b444154 100644 --- a/admin/src/components/EditCreationFormular.vue +++ b/admin/src/components/EditCreationFormular.vue @@ -2,68 +2,19 @@
- +
- - - - - - - - - - - - - - - - - +
+ + +
@@ -74,7 +25,6 @@ :max="rangeMax" > -
- - +
+
- +
- + {{ $t('creation_form.reset') }} @@ -111,7 +61,7 @@ variant="success" class="test-submit" @click="submitCreation" - :disabled="radioSelected === '' || value <= 0 || text.length < 10" + :disabled="selected === '' || value <= 0 || text.length < 10" > {{ $t('creation_form.update_creation') }} @@ -124,8 +74,11 @@ diff --git a/admin/src/config/index.js b/admin/src/config/index.js index 69d30a66a..fe373386d 100644 --- a/admin/src/config/index.js +++ b/admin/src/config/index.js @@ -4,11 +4,20 @@ // Load Package Details for some default values const pkg = require('../../package') +const constants = { + CONFIG_VERSION: { + DEFAULT: 'DEFAULT', + EXPECTED: 'v1.2022-03-18', + CURRENT: '', + }, +} + const version = { APP_VERSION: pkg.version, BUILD_COMMIT: process.env.BUILD_COMMIT || null, // self reference of `version.BUILD_COMMIT` is not possible at this point, hence the duplicate code - BUILD_COMMIT_SHORT: (process.env.BUILD_COMMIT || '0000000').substr(0, 7), + BUILD_COMMIT_SHORT: (process.env.BUILD_COMMIT || '0000000').slice(0, 7), + PORT: process.env.PORT || 8080, } const environment = { @@ -19,21 +28,32 @@ const environment = { const endpoints = { GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000/graphql', - WALLET_AUTH_URL: process.env.WALLET_AUTH_URL || 'http://localhost/vue/authenticate?token=$1', + WALLET_AUTH_URL: process.env.WALLET_AUTH_URL || 'http://localhost/authenticate?token={token}', + WALLET_URL: process.env.WALLET_URL || 'http://localhost/login', } const debug = { DEBUG_DISABLE_AUTH: process.env.DEBUG_DISABLE_AUTH === 'true' || false, } -const options = {} +// Check config version +constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION || constants.CONFIG_VERSION.DEFAULT +if ( + ![constants.CONFIG_VERSION.EXPECTED, constants.CONFIG_VERSION.DEFAULT].includes( + constants.CONFIG_VERSION.CURRENT, + ) +) { + throw new Error( + `Fatal: Config Version incorrect - expected "${constants.CONFIG_VERSION.EXPECTED}" or "${constants.CONFIG_VERSION.DEFAULT}", but found "${constants.CONFIG_VERSION.CURRENT}"`, + ) +} const CONFIG = { + ...constants, ...version, ...environment, ...endpoints, - ...options, ...debug, } -export default CONFIG +module.exports = CONFIG diff --git a/admin/src/graphql/confirmPendingCreation.js b/admin/src/graphql/confirmPendingCreation.js index 29ac5b4fc..df72cc04d 100644 --- a/admin/src/graphql/confirmPendingCreation.js +++ b/admin/src/graphql/confirmPendingCreation.js @@ -1,7 +1,7 @@ import gql from 'graphql-tag' export const confirmPendingCreation = gql` - mutation ($id: Float!) { + mutation ($id: Int!) { confirmPendingCreation(id: $id) } ` diff --git a/admin/src/graphql/creationTransactionList.js b/admin/src/graphql/creationTransactionList.js new file mode 100644 index 000000000..327221814 --- /dev/null +++ b/admin/src/graphql/creationTransactionList.js @@ -0,0 +1,22 @@ +import gql from 'graphql-tag' + +export const creationTransactionList = gql` + query ($currentPage: Int = 1, $pageSize: Int = 25, $order: Order = DESC, $userId: Int!) { + creationTransactionList( + currentPage: $currentPage + pageSize: $pageSize + order: $order + userId: $userId + ) { + id + amount + balanceDate + creationDate + memo + linkedUser { + firstName + lastName + } + } + } +` diff --git a/admin/src/graphql/deletePendingCreation.js b/admin/src/graphql/deletePendingCreation.js index e47fa6a8d..edf45fe74 100644 --- a/admin/src/graphql/deletePendingCreation.js +++ b/admin/src/graphql/deletePendingCreation.js @@ -1,7 +1,7 @@ import gql from 'graphql-tag' export const deletePendingCreation = gql` - mutation ($id: Float!) { + mutation ($id: Int!) { deletePendingCreation(id: $id) } ` diff --git a/admin/src/graphql/deleteUser.js b/admin/src/graphql/deleteUser.js new file mode 100644 index 000000000..9e3606bd7 --- /dev/null +++ b/admin/src/graphql/deleteUser.js @@ -0,0 +1,7 @@ +import gql from 'graphql-tag' + +export const deleteUser = gql` + mutation ($userId: Int!) { + deleteUser(userId: $userId) + } +` diff --git a/admin/src/graphql/searchUsers.js b/admin/src/graphql/searchUsers.js index cf6225338..e28508d1b 100644 --- a/admin/src/graphql/searchUsers.js +++ b/admin/src/graphql/searchUsers.js @@ -1,14 +1,32 @@ import gql from 'graphql-tag' export const searchUsers = gql` - query ($searchText: String!) { - searchUsers(searchText: $searchText) { - userId - firstName - lastName - email - creation - emailChecked + query ( + $searchText: String! + $currentPage: Int + $pageSize: Int + $notActivated: Boolean + $isDeleted: Boolean + ) { + searchUsers( + searchText: $searchText + currentPage: $currentPage + pageSize: $pageSize + notActivated: $notActivated + isDeleted: $isDeleted + ) { + userCount + userList { + userId + firstName + lastName + email + creation + emailChecked + hasElopage + emailConfirmationSend + deletedAt + } } } ` diff --git a/admin/src/graphql/transactionList.js b/admin/src/graphql/transactionList.js deleted file mode 100644 index 8ae5cde42..000000000 --- a/admin/src/graphql/transactionList.js +++ /dev/null @@ -1,44 +0,0 @@ -import gql from 'graphql-tag' - -export const transactionList = gql` - query ( - $currentPage: Int = 1 - $pageSize: Int = 25 - $order: Order = DESC - $onlyCreations: Boolean = false - $userId: Int = null - ) { - transactionList( - currentPage: $currentPage - pageSize: $pageSize - order: $order - onlyCreations: $onlyCreations - userId: $userId - ) { - gdtSum - count - balance - decay - decayDate - transactions { - type - balance - decayStart - decayEnd - decayDuration - memo - transactionId - name - email - date - decay { - balance - decayStart - decayEnd - decayDuration - decayStartBlock - } - } - } - } -` diff --git a/admin/src/graphql/unDeleteUser.js b/admin/src/graphql/unDeleteUser.js new file mode 100644 index 000000000..b48c8981f --- /dev/null +++ b/admin/src/graphql/unDeleteUser.js @@ -0,0 +1,7 @@ +import gql from 'graphql-tag' + +export const unDeleteUser = gql` + mutation ($userId: Int!) { + unDeleteUser(userId: $userId) + } +` diff --git a/admin/src/graphql/verifyLogin.js b/admin/src/graphql/verifyLogin.js index 553557f3c..ea08bb5b1 100644 --- a/admin/src/graphql/verifyLogin.js +++ b/admin/src/graphql/verifyLogin.js @@ -7,6 +7,7 @@ export const verifyLogin = gql` lastName isAdmin id + language } } ` diff --git a/admin/src/i18n.js b/admin/src/i18n.js index 14e81543e..b2bb08074 100644 --- a/admin/src/i18n.js +++ b/admin/src/i18n.js @@ -54,12 +54,21 @@ const dateTimeFormats = { }, long: { year: 'numeric', - month: 'short', + month: 'long', day: 'numeric', - weekday: 'short', + weekday: 'long', hour: 'numeric', minute: 'numeric', }, + monthShort: { + month: 'short', + }, + month: { + month: 'long', + }, + year: { + year: 'numeric', + }, }, de: { short: { @@ -69,12 +78,21 @@ const dateTimeFormats = { }, long: { day: 'numeric', - month: 'short', + month: 'long', year: 'numeric', - weekday: 'short', + weekday: 'long', hour: 'numeric', minute: 'numeric', }, + monthShort: { + month: 'short', + }, + month: { + month: 'long', + }, + year: { + year: 'numeric', + }, }, } diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index b2f0e427d..fd902db97 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -1,8 +1,10 @@ { - "bookmark": "bookmark", - "confirmed": "bestätigt", + "all_emails": "Alle Nutzer", + "back": "zurück", + "creation": "Schöpfung", "creation_form": { - "creation_for": "Schöpfung für ", + "creation_failed": "Ausstehende Schöpfung für {email} konnte nicht erzeugt werden.", + "creation_for": "Aktives Grundeinkommen für", "enter_text": "Text eintragen", "form": "Schöpfungsformular", "min_characters": "Mindestens 10 Zeichen eingeben", @@ -11,55 +13,87 @@ "select_value": "Betrag auswählen", "submit_creation": "Schöpfung einreichen", "toasted": "Offene Schöpfung ({value} GDD) für {email} wurde gespeichert und liegt zur Bestätigung bereit", + "toasted_created": "Schöpfung wurde erfolgreich gespeichert", + "toasted_delete": "Offene Schöpfung wurde gelöscht", "toasted_update": "`Offene Schöpfung {value} GDD) für {email} wurde geändert und liegt zur Bestätigung bereit", "update_creation": "Schöpfung aktualisieren" }, - "details": "Details", + "creation_for_month": "Schöpfung für Monat", + "date": "Datum", + "delete": "Löschen", + "deleted": "gelöscht", + "deleted_user": "Alle gelöschten Nutzer", + "delete_user": "Nutzer löschen", + "edit": "Bearbeiten", + "enabled": "aktiviert", + "error": "Fehler", "e_mail": "E-Mail", "firstname": "Vorname", - "gradido_admin_footer": "Gradido Akademie Adminkonsole", - "hide_details": "Details verbergen von", + "footer": { + "app_version": "App version {version}", + "copyright": { + "link": "Gradido Akademie Adminkonsole", + "year": "© {year}" + }, + "short_hash": "({shortHash})" + }, + "GDD": "GDD", + "hide_details": "Details verbergen", "lastname": "Nachname", + "math": { + "exclaim": "!", + "pipe": "|" + }, + "moderator": "Moderator", "multiple_creation_text": "Bitte wähle ein oder mehrere Mitglieder aus für die du Schöpfen möchtest.", + "name": "Name", "navbar": { "logout": "Abmelden", "multi_creation": "Mehrfachschöpfung", + "my-account": "Mein Konto", "open_creation": "Offene Schöpfungen", "overview": "Übersicht", - "user_search": "Nutzersuche", - "wallet": "Wallet" + "user_search": "Nutzersuche" }, "not_open_creations": "Keine offenen Schöpfungen", - "open_creation": "Offene Schöpfung", "open_creations": "Offene Schöpfungen", "overlay": { "confirm": { - "no": "Nein, nicht speichern.", - "question": "Willst du diese vorgespeicherte Schöpfung wirklich vollziehen und entgültig speichern?", + "cancel": "Abbrechen", + "question": "Willst du diese vorgespeicherte Schöpfung wirklich vollziehen und endgültig speichern?", "text": "Nach dem Speichern ist der Datensatz nicht mehr änderbar und kann auch nicht mehr gelöscht werden. Bitte überprüfe genau, dass alles stimmt.", "title": "Schöpfung bestätigen!", "yes": "Ja, Schöpfung bestätigen und speichern!" - }, - "remove": { - "no": "Nein, nicht löschen.", - "question": "Willst du die vorgespeicherte Schöpfung wirklich löschen?", - "text": "Nach dem Löschen gibt es keine Möglichkeit mehr diesen Datensatz wiederherzustellen. Es wird aber der gesamte Vorgang in der Logdatei als Übersicht gespeichert.", - "title": "Achtung! Schöpfung löschen!", - "yes": "Ja, Schöpfung löschen!" } }, "remove": "Entfernen", - "transaction": "Transaktion", + "removeNotSelf": "Als Admin / Moderator kannst du dich nicht selber löschen.", + "remove_all": "alle Nutzer entfernen", + "save": "Speichern", + "status": "Status", + "success": "Erfolg", + "text": "Text", "transactionlist": { + "amount": "Betrag", + "balanceDate": "Schöpfungsdatum", + "community": "Gemeinschaft", + "date": "Datum", + "memo": "Nachricht", "title": "Alle geschöpften Transaktionen für den Nutzer" }, - "unregistered_emails": "Unregistrierte E-Mails", + "undelete_user": "Nutzer wiederherstellen", + "unregistered_emails": "Nur unregistrierte Nutzer", "unregister_mail": { "button": "Registrierungs-Email bestätigen, jetzt senden", "error": "Fehler beim Senden des Bestätigungs-Links an den Benutzer: {message}", "info": "Email bestätigen, wiederholt senden an:", + "never_sent": "Es scheint so, als ob wir nie eine E-Mail an {email} geschickt haben", "success": "Erfolgreiches Senden des Bestätigungs-Links an die E-Mail des Nutzers! ({email})", - "text": " Die letzte Email wurde am {date} Uhr an das Mitglied ({mail}) gesendet." + "text_false": " Die letzte Email wurde am {date} Uhr an das Mitglied ({email}) gesendet.", + "text_true": " Die Email wurde bestätigt." }, + "userIsDeleted": "Der Nutzer ist gelöscht. Es können keine GDD mehr geschöpft werden.", + "user_deleted": "Nutzer ist gelöscht.", + "user_recovered": "Nutzer ist wiederhergestellt.", "user_search": "Nutzer-Suche" } diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index 398f4b5f6..d91922d3b 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -1,8 +1,10 @@ { - "bookmark": "Remember", - "confirmed": "confirmed", + "all_emails": "All users", + "back": "back", + "creation": "Creation", "creation_form": { - "creation_for": "Creation for ", + "creation_failed": "Could not create pending creation for {email}", + "creation_for": "Active Basic Income for", "enter_text": "Enter text", "form": "Creation form", "min_characters": "Enter at least 10 characters", @@ -11,55 +13,87 @@ "select_value": "Select amount", "submit_creation": "Submit creation", "toasted": "Open creation ({value} GDD) for {email} has been saved and is ready for confirmation.", + "toasted_created": "Creation has been successfully saved", + "toasted_delete": "Open creation has been deleted", "toasted_update": "Open creation {value} GDD) for {email} has been changed and is ready for confirmation.", "update_creation": "Creation update" }, - "details": "Details", - "e_mail": "E-Mail", + "creation_for_month": "Creation for month", + "date": "Date", + "delete": "Delete", + "deleted": "deleted", + "deleted_user": "All deleted user", + "delete_user": "Delete user", + "edit": "Edit", + "enabled": "enabled", + "error": "Error", + "e_mail": "E-mail", "firstname": "Firstname", - "gradido_admin_footer": "Gradido Academy Admin Console", - "hide_details": "Hide details from", + "footer": { + "app_version": "App version {version}", + "copyright": { + "link": "Gradido Academy Admin Console", + "year": "© {year}" + }, + "short_hash": "({shortHash})" + }, + "GDD": "GDD", + "hide_details": "Hide details", "lastname": "Lastname", + "math": { + "exclaim": "!", + "pipe": "|" + }, + "moderator": "Moderator", "multiple_creation_text": "Please select one or more members for which you would like to perform creations.", + "name": "Name", "navbar": { "logout": "Logout", "multi_creation": "Multiple creation", + "my-account": "My Account", "open_creation": "Open creations", "overview": "Overview", - "user_search": "User search", - "wallet": "Wallet" + "user_search": "User search" }, "not_open_creations": "No open creations", - "open_creation": "Open creation", "open_creations": "Open creations", "overlay": { "confirm": { - "no": "No, do not save.", + "cancel": "Cancel", "question": "Do you really want to carry out and finally save this pre-stored creation?", "text": "After saving, the record can no longer be changed or deleted. Please check carefully that everything is correct.", "title": "Confirm creation!", "yes": "Yes, confirm and save creation!" - }, - "remove": { - "no": "No, do not delete.", - "question": "Do you really want to delete the pre-stored creation?", - "text": "After deletion, there is no possibility to restore this data record. However, the entire process is saved in the log file as an overview.", - "title": "Attention! Delete creation!", - "yes": "Yes, delete creation!" } }, "remove": "Remove", - "transaction": "Transaction", + "removeNotSelf": "As admin / moderator you cannot delete yourself.", + "remove_all": "Remove all users", + "save": "Speichern", + "status": "Status", + "success": "Success", + "text": "Text", "transactionlist": { + "amount": "Amount", + "balanceDate": "Creation date", + "community": "Community", + "date": "Date", + "memo": "Message", "title": "All creation-transactions for the user" }, - "unregistered_emails": "Unregistered e-mails", + "undelete_user": "Undelete User", + "unregistered_emails": "Only unregistered users", "unregister_mail": { "button": "Confirm registration email, send now", "error": "Error sending the confirmation link to the user: {message}", "info": "Confirm email, send repeatedly to:", + "never_sent": "It seems we did never send an email to the member {email}", "success": "Successfully send the confirmation link to the user's email! ({email})", - "text": " The last email was sent to the member ({mail}) on {date} clock." + "text_false": "The last email was sent to the member ({email}) on {date}.", + "text_true": "The email was confirmed." }, + "userIsDeleted": "The user is deleted. No more GDD can be created.", + "user_deleted": "User is deleted.", + "user_recovered": "User is recovered.", "user_search": "User search" } diff --git a/admin/src/main.js b/admin/src/main.js index 2743e0f9a..f6c021a53 100644 --- a/admin/src/main.js +++ b/admin/src/main.js @@ -13,39 +13,31 @@ import i18n from './i18n' import VueApollo from 'vue-apollo' +import PortalVue from 'portal-vue' + import { BootstrapVue, IconsPlugin } from 'bootstrap-vue' import 'bootstrap/dist/css/bootstrap.css' import 'bootstrap-vue/dist/bootstrap-vue.css' -import moment from 'vue-moment' -import Toasted from 'vue-toasted' +import { toasters } from './mixins/toaster' import { apolloProvider } from './plugins/apolloProvider' +Vue.use(PortalVue) Vue.use(BootstrapVue) Vue.use(IconsPlugin) -Vue.use(moment) - Vue.use(VueApollo) -Vue.use(Toasted, { - position: 'top-center', - duration: 5000, - fullWidth: true, - action: { - text: 'x', - onClick: (e, toastObject) => { - toastObject.goAway(0) - }, - }, -}) +Vue.mixin(toasters) -addNavigationGuards(router, store, apolloProvider.defaultClient) +addNavigationGuards(router, store, apolloProvider.defaultClient, i18n) + +i18n.locale = + store.state.moderator && store.state.moderator.language ? store.state.moderator.language : 'en' new Vue({ - moment, router, store, i18n, diff --git a/admin/src/main.test.js b/admin/src/main.test.js index 06efa8b65..20ee70741 100644 --- a/admin/src/main.test.js +++ b/admin/src/main.test.js @@ -6,7 +6,6 @@ import Vue from 'vue' import VueApollo from 'vue-apollo' import i18n from './i18n' import { BootstrapVue, IconsPlugin } from 'bootstrap-vue' -import moment from 'vue-moment' import store from './store/store' import router from './router/router' @@ -14,8 +13,15 @@ jest.mock('vue') jest.mock('vue-apollo') jest.mock('vuex') jest.mock('vue-i18n') -jest.mock('vue-moment') -jest.mock('./store/store') +jest.mock('./store/store', () => { + return { + state: { + moderator: { + language: 'es', + }, + }, + } +}) jest.mock('./i18n') jest.mock('./router/router') @@ -82,10 +88,6 @@ describe('main', () => { expect(Vue.use).toBeCalledWith(IconsPlugin) }) - it('calls Moment', () => { - expect(Vue.use).toBeCalledWith(moment) - }) - it('creates a store', () => { expect(Vue).toBeCalledWith( expect.objectContaining({ @@ -101,4 +103,8 @@ describe('main', () => { }), ) }) + + it('sets the locale from store', () => { + expect(i18n.locale).toBe('es') + }) }) diff --git a/admin/src/mixins/creationMonths.js b/admin/src/mixins/creationMonths.js new file mode 100644 index 000000000..c26dc5b02 --- /dev/null +++ b/admin/src/mixins/creationMonths.js @@ -0,0 +1,41 @@ +export const creationMonths = { + props: { + creation: { + type: Array, + default: () => [1000, 1000, 1000], + }, + }, + computed: { + creationDates() { + const now = new Date(Date.now()) + const dates = [now] + for (let i = 1; i < 3; i++) { + dates.push(new Date(now.getFullYear(), now.getMonth() - i, 1)) + } + return dates.reverse() + }, + creationDateObjects() { + const result = [] + this.creationDates.forEach((date) => { + result.push({ + short: this.$d(date, 'month'), + long: this.$d(date, 'short'), + year: this.$d(date, 'year'), + date: this.$d(date, 'short', 'en'), + }) + }) + return result + }, + radioOptions() { + return this.creationDateObjects.map((obj, idx) => { + return { + item: { ...obj, creation: this.creation[idx] }, + name: obj.short + (this.creation[idx] ? ' ' + this.creation[idx] + ' GDD' : ''), + } + }) + }, + creationLabel() { + return this.creationDates.map((date) => this.$d(date, 'monthShort')).join(' | ') + }, + }, +} diff --git a/admin/src/mixins/toaster.js b/admin/src/mixins/toaster.js new file mode 100644 index 000000000..2db632a81 --- /dev/null +++ b/admin/src/mixins/toaster.js @@ -0,0 +1,30 @@ +export const toasters = { + methods: { + toastSuccess(message) { + this.toast(message, { + title: this.$t('success'), + variant: 'success', + }) + }, + toastError(message) { + this.toast(message, { + title: this.$t('error'), + variant: 'danger', + }) + }, + toast(message, options) { + // for unit tests, check that replace is present + if (message.replace) message = message.replace(/^GraphQL error: /, '') + this.$root.$bvToast.toast(message, { + autoHideDelay: 5000, + appendToast: true, + solid: true, + toaster: 'b-toaster-top-right', + headerClass: 'gdd-toaster-title', + bodyClass: 'gdd-toaster-body', + toastClass: 'gdd-toaster', + ...options, + }) + }, + }, +} diff --git a/admin/src/mixins/toggleRowDetails.js b/admin/src/mixins/toggleRowDetails.js new file mode 100644 index 000000000..cdfca1334 --- /dev/null +++ b/admin/src/mixins/toggleRowDetails.js @@ -0,0 +1,34 @@ +export const toggleRowDetails = { + data() { + return { + slotIndex: 0, + openRow: null, + creationUserData: {}, + } + }, + methods: { + rowToggleDetails(row, index) { + if (this.openRow) { + if (this.openRow.index === row.index) { + if (index === this.slotIndex) { + row.toggleDetails() + this.openRow = null + } else { + this.slotIndex = index + } + } else { + this.openRow.toggleDetails() + row.toggleDetails() + this.slotIndex = index + this.openRow = row + this.creationUserData = row.item + } + } else { + row.toggleDetails() + this.slotIndex = index + this.openRow = row + this.creationUserData = row.item + } + }, + }, +} diff --git a/admin/src/mixins/toggleRowDetails.test.js b/admin/src/mixins/toggleRowDetails.test.js new file mode 100644 index 000000000..22bf7b925 --- /dev/null +++ b/admin/src/mixins/toggleRowDetails.test.js @@ -0,0 +1,141 @@ +import { toggleRowDetails } from './toggleRowDetails' +import { mount } from '@vue/test-utils' + +const localVue = global.localVue + +const Component = { + render() {}, + mixins: [toggleRowDetails], +} + +const toggleDetailsMock = jest.fn() +const secondToggleDetailsMock = jest.fn() + +const row = { + toggleDetails: toggleDetailsMock, + index: 0, + item: { + data: 'item-data', + }, +} + +let wrapper + +describe('toggleRowDetails', () => { + beforeEach(() => { + jest.clearAllMocks() + wrapper = mount(Component, { localVue }) + }) + + it('sets default data', () => { + expect(wrapper.vm.slotIndex).toBe(0) + expect(wrapper.vm.openRow).toBe(null) + expect(wrapper.vm.creationUserData).toEqual({}) + }) + + describe('no open row', () => { + beforeEach(() => { + wrapper.vm.rowToggleDetails(row, 2) + }) + + it('calls toggleDetails', () => { + expect(toggleDetailsMock).toBeCalled() + }) + + it('updates slot index', () => { + expect(wrapper.vm.slotIndex).toBe(2) + }) + + it('updates open row', () => { + expect(wrapper.vm.openRow).toEqual( + expect.objectContaining({ + index: 0, + item: { + data: 'item-data', + }, + }), + ) + }) + + it('updates creation user data', () => { + expect(wrapper.vm.creationUserData).toEqual({ data: 'item-data' }) + }) + }) + + describe('with open row', () => { + beforeEach(() => { + wrapper.setData({ openRow: row }) + }) + + describe('row index is open row index', () => { + describe('index is slot index', () => { + beforeEach(() => { + wrapper.vm.rowToggleDetails(row, 0) + }) + + it('calls toggleDetails', () => { + expect(toggleDetailsMock).toBeCalled() + }) + + it('sets open row to null', () => { + expect(wrapper.vm.openRow).toBe(null) + }) + }) + + describe('index is not slot index', () => { + beforeEach(() => { + wrapper.vm.rowToggleDetails(row, 2) + }) + + it('does not call toggleDetails', () => { + expect(toggleDetailsMock).not.toBeCalled() + }) + + it('updates slot index', () => { + expect(wrapper.vm.slotIndex).toBe(2) + }) + }) + }) + + describe('row index is not open row index', () => { + beforeEach(() => { + wrapper.vm.rowToggleDetails( + { + toggleDetails: secondToggleDetailsMock, + index: 2, + item: { + data: 'new-item-data', + }, + }, + 2, + ) + }) + + it('closes the open row', () => { + expect(toggleDetailsMock).toBeCalled() + }) + + it('opens the new row', () => { + expect(secondToggleDetailsMock).toBeCalled() + }) + + it('updates slot index', () => { + expect(wrapper.vm.slotIndex).toBe(2) + }) + + it('updates open row', () => { + expect(wrapper.vm.openRow).toEqual({ + toggleDetails: secondToggleDetailsMock, + index: 2, + item: { + data: 'new-item-data', + }, + }) + }) + + it('updates creation user data', () => { + expect(wrapper.vm.creationUserData).toEqual({ data: 'new-item-data' }) + }) + }) + }) +}) diff --git a/admin/src/pages/Creation.spec.js b/admin/src/pages/Creation.spec.js index 073b22c0e..f9a4ed506 100644 --- a/admin/src/pages/Creation.spec.js +++ b/admin/src/pages/Creation.spec.js @@ -1,39 +1,48 @@ -import { shallowMount } from '@vue/test-utils' +import { mount } from '@vue/test-utils' import Creation from './Creation.vue' -import Vue from 'vue' +import { toastErrorSpy } from '../../test/testSetup' const localVue = global.localVue const apolloQueryMock = jest.fn().mockResolvedValue({ data: { - searchUsers: [ - { - id: 1, - firstName: 'Bibi', - lastName: 'Bloxberg', - email: 'bibi@bloxberg.de', - creation: [200, 400, 600], - }, - { - id: 2, - firstName: 'Benjamin', - lastName: 'Blümchen', - email: 'benjamin@bluemchen.de', - creation: [800, 600, 400], - }, - ], + searchUsers: { + userCount: 2, + userList: [ + { + userId: 1, + firstName: 'Bibi', + lastName: 'Bloxberg', + email: 'bibi@bloxberg.de', + creation: [200, 400, 600], + emailChecked: true, + }, + { + userId: 2, + firstName: 'Benjamin', + lastName: 'Blümchen', + email: 'benjamin@bluemchen.de', + creation: [800, 600, 400], + emailChecked: true, + }, + ], + }, }, }) -const toastErrorMock = jest.fn() +const storeCommitMock = jest.fn() const mocks = { - $t: jest.fn((t) => t), + $t: jest.fn((t, options) => (options ? [t, options] : t)), + $d: jest.fn((d) => d), $apollo: { query: apolloQueryMock, }, - $toasted: { - error: toastErrorMock, + $store: { + commit: storeCommitMock, + state: { + userSelectedInMassCreation: [], + }, }, } @@ -41,11 +50,12 @@ describe('Creation', () => { let wrapper const Wrapper = () => { - return shallowMount(Creation, { localVue, mocks }) + return mount(Creation, { localVue, mocks }) } - describe('shallowMount', () => { + describe('mount', () => { beforeEach(() => { + jest.clearAllMocks() wrapper = Wrapper() }) @@ -55,165 +65,243 @@ describe('Creation', () => { describe('apollo returns user array', () => { it('calls the searchUser query', () => { - expect(apolloQueryMock).toBeCalled() + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 1, + pageSize: 25, + }, + }), + ) }) - it('sets the data of itemsList', () => { - expect(wrapper.vm.itemsList).toEqual([ + it('has two rows in the left table', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr')).toHaveLength(2) + }) + + it('has nwo rows in the right table', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(0) + }) + + it('has correct data in first row ', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(0).text()).toContain('Bibi') + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(0).text()).toContain( + 'Bloxberg', + ) + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(0).text()).toContain( + '200 | 400 | 600', + ) + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(0).text()).toContain( + 'bibi@bloxberg.de', + ) + }) + + it('has correct data in second row ', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(1).text()).toContain( + 'Benjamin', + ) + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(1).text()).toContain( + 'Blümchen', + ) + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(1).text()).toContain( + '800 | 600 | 400', + ) + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(1).text()).toContain( + 'benjamin@bluemchen.de', + ) + }) + }) + + describe('push item', () => { + beforeEach(() => { + wrapper.findAll('table').at(0).findAll('tbody > tr').at(1).find('button').trigger('click') + }) + + it('has one item in left table', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr')).toHaveLength(1) + }) + + it('has one item in right table', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(1) + }) + + it('has the correct user in left table', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(0).text()).toContain( + 'bibi@bloxberg.de', + ) + }) + + it('has the correct user in right table', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr').at(0).text()).toContain( + 'benjamin@bluemchen.de', + ) + }) + + it('updates userSelectedInMassCreation in store', () => { + expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', [ { - id: 1, - firstName: 'Bibi', - lastName: 'Bloxberg', - email: 'bibi@bloxberg.de', - creation: [200, 400, 600], - showDetails: false, - }, - { - id: 2, + userId: 2, firstName: 'Benjamin', lastName: 'Blümchen', email: 'benjamin@bluemchen.de', creation: [800, 600, 400], showDetails: false, + emailChecked: true, }, ]) }) + + describe('remove item', () => { + beforeEach(async () => { + await wrapper + .findAll('table') + .at(1) + .findAll('tbody > tr') + .at(0) + .find('button') + .trigger('click') + }) + + it('has two items in left table', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr')).toHaveLength(2) + }) + + it('has the removed user in first row', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr').at(0).text()).toContain( + 'benjamin@bluemchen.de', + ) + }) + + it('has no items in right table', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(0) + }) + + it('commits empty array as userSelectedInMassCreation', () => { + expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', []) + }) + }) + + describe('remove all bookmarks', () => { + beforeEach(async () => { + jest.clearAllMocks() + await wrapper.find('button.btn-light').trigger('click') + }) + + it('has no items in right table', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(0) + }) + + it('commits empty array to userSelectedInMassCreation', () => { + expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', []) + }) + + it('calls searchUsers', () => { + expect(apolloQueryMock).toBeCalled() + }) + }) + }) + + describe('store has items in userSelectedInMassCreation', () => { + beforeEach(() => { + mocks.$store.state.userSelectedInMassCreation = [ + { + userId: 2, + firstName: 'Benjamin', + lastName: 'Blümchen', + email: 'benjamin@bluemchen.de', + creation: [800, 600, 400], + showDetails: false, + emailChecked: true, + }, + ] + wrapper = Wrapper() + }) + + it('has one item in left table', () => { + expect(wrapper.findAll('table').at(0).findAll('tbody > tr')).toHaveLength(1) + }) + + it('has one item in right table', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(1) + }) + + it('has the stored user in second row', () => { + expect(wrapper.findAll('table').at(1).findAll('tbody > tr').at(0).text()).toContain( + 'benjamin@bluemchen.de', + ) + }) + }) + + describe('failed creations', () => { + beforeEach(async () => { + await wrapper + .findComponent({ name: 'CreationFormular' }) + .vm.$emit('toast-failed-creations', ['bibi@bloxberg.de', 'benjamin@bluemchen.de']) + }) + + it('toasts two error messages', () => { + expect(toastErrorSpy).toBeCalledWith([ + 'creation_form.creation_failed', + { email: 'bibi@bloxberg.de' }, + ]) + expect(toastErrorSpy).toBeCalledWith([ + 'creation_form.creation_failed', + { email: 'benjamin@bluemchen.de' }, + ]) + }) }) - describe('update item', () => { + describe('watchers', () => { beforeEach(() => { jest.clearAllMocks() }) - describe('push', () => { - beforeEach(() => { - wrapper.findComponent({ name: 'UserTable' }).vm.$emit( - 'update-item', - { - id: 2, - firstName: 'Benjamin', - lastName: 'Blümchen', - email: 'benjamin@bluemchen.de', - creation: [800, 600, 400], - showDetails: false, - }, - 'push', + describe('search criteria', () => { + beforeEach(async () => { + await wrapper.setData({ criteria: 'XX' }) + }) + + it('calls API when criteria changes', async () => { + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: 'XX', + currentPage: 1, + pageSize: 25, + }, + }), ) }) - it('removes the pushed item from itemsList', () => { - expect(wrapper.vm.itemsList).toEqual([ - { - id: 1, - firstName: 'Bibi', - lastName: 'Bloxberg', - email: 'bibi@bloxberg.de', - creation: [200, 400, 600], - showDetails: false, - }, - ]) - }) - - it('adds the pushed item to itemsMassCreation', () => { - expect(wrapper.vm.itemsMassCreation).toEqual([ - { - id: 2, - firstName: 'Benjamin', - lastName: 'Blümchen', - email: 'benjamin@bluemchen.de', - creation: [800, 600, 400], - showDetails: false, - }, - ]) - }) - - describe('remove', () => { - beforeEach(() => { - wrapper.findComponent({ name: 'UserTable' }).vm.$emit( - 'update-item', - { - id: 2, - firstName: 'Benjamin', - lastName: 'Blümchen', - email: 'benjamin@bluemchen.de', - creation: [800, 600, 400], - showDetails: false, - }, - 'remove', + describe('reset search criteria', () => { + it('calls the API', async () => { + jest.clearAllMocks() + await wrapper.find('.test-click-clear-criteria').trigger('click') + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 1, + pageSize: 25, + }, + }), ) }) - - it('removes the item from itemsMassCreation', () => { - expect(wrapper.vm.itemsMassCreation).toEqual([]) - }) - - it('adds the item to itemsList', () => { - expect(wrapper.vm.itemsList).toEqual([ - { - id: 1, - firstName: 'Bibi', - lastName: 'Bloxberg', - email: 'bibi@bloxberg.de', - creation: [200, 400, 600], - showDetails: false, - }, - { - id: 2, - firstName: 'Benjamin', - lastName: 'Blümchen', - email: 'benjamin@bluemchen.de', - creation: [800, 600, 400], - showDetails: false, - }, - ]) - }) }) }) - describe('error', () => { - const consoleErrorMock = jest.fn() - const warnHandler = Vue.config.warnHandler - - beforeEach(() => { - Vue.config.warnHandler = (w) => {} - // eslint-disable-next-line no-console - console.error = consoleErrorMock - wrapper.findComponent({ name: 'UserTable' }).vm.$emit('update-item', {}, 'no-rule') - }) - - afterEach(() => { - Vue.config.warnHandler = warnHandler - }) - - it('throws an error', () => { - expect(consoleErrorMock).toBeCalledWith(expect.objectContaining({ message: 'no-rule' })) - }) - }) - }) - - describe('remove all bookmarks', () => { - beforeEach(async () => { - await wrapper.findComponent({ name: 'UserTable' }).vm.$emit( - 'update-item', - { - id: 2, - firstName: 'Benjamin', - lastName: 'Blümchen', - email: 'benjamin@bluemchen.de', - creation: [800, 600, 400], - showDetails: false, - }, - 'push', + it('calls API when currentPage changes', async () => { + await wrapper.setData({ currentPage: 2 }) + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 2, + pageSize: 25, + }, + }), ) - wrapper.findComponent({ name: 'CreationFormular' }).vm.$emit('remove-all-bookmark') - }) - - it('removes all items from itemsMassCreation', () => { - expect(wrapper.vm.itemsMassCreation).toEqual([]) - }) - - it('adds all items to itemsList', () => { - expect(wrapper.vm.itemsList).toHaveLength(2) }) }) @@ -226,7 +314,7 @@ describe('Creation', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('Ouch') + expect(toastErrorSpy).toBeCalledWith('Ouch') }) }) }) diff --git a/admin/src/pages/Creation.vue b/admin/src/pages/Creation.vue index 4d6dca920..8a229d7be 100644 --- a/admin/src/pages/Creation.vue +++ b/admin/src/pages/Creation.vue @@ -1,35 +1,52 @@ + diff --git a/admin/src/pages/UserSearch.spec.js b/admin/src/pages/UserSearch.spec.js index 473b2bbdc..bd18965ac 100644 --- a/admin/src/pages/UserSearch.spec.js +++ b/admin/src/pages/UserSearch.spec.js @@ -1,42 +1,61 @@ import { mount } from '@vue/test-utils' import UserSearch from './UserSearch.vue' +import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup' const localVue = global.localVue const apolloQueryMock = jest.fn().mockResolvedValue({ data: { - searchUsers: [ - { - firstName: 'Bibi', - lastName: 'Bloxberg', - email: 'bibi@bloxberg.de', - creation: [200, 400, 600], - emailChecked: false, - }, - ], + searchUsers: { + userCount: 1, + userList: [ + { + userId: 1, + firstName: 'Bibi', + lastName: 'Bloxberg', + email: 'bibi@bloxberg.de', + creation: [200, 400, 600], + emailChecked: true, + deletedAt: null, + }, + { + userId: 2, + firstName: 'Benjamin', + lastName: 'Blümchen', + email: 'benjamin@bluemchen.de', + creation: [1000, 1000, 1000], + emailChecked: true, + deletedAt: null, + }, + { + userId: 3, + firstName: 'Peter', + lastName: 'Lustig', + email: 'peter@lustig.de', + creation: [0, 0, 0], + emailChecked: true, + deletedAt: null, + }, + { + userId: 4, + firstName: 'New', + lastName: 'User', + email: 'new@user.ch', + creation: [1000, 1000, 1000], + emailChecked: false, + deletedAt: null, + }, + ], + }, }, }) -const toastErrorMock = jest.fn() - const mocks = { $t: jest.fn((t) => t), + $d: jest.fn((d) => String(d)), $apollo: { query: apolloQueryMock, }, - $toasted: { - error: toastErrorMock, - }, - $moment: jest.fn(() => { - return { - format: jest.fn((m) => m), - subtract: jest.fn(() => { - return { - format: jest.fn((m) => m), - } - }), - } - }), } describe('UserSearch', () => { @@ -48,6 +67,7 @@ describe('UserSearch', () => { describe('mount', () => { beforeEach(() => { + jest.clearAllMocks() wrapper = Wrapper() }) @@ -55,13 +75,130 @@ describe('UserSearch', () => { expect(wrapper.find('div.user-search').exists()).toBeTruthy() }) + it('calls the API', () => { + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 1, + pageSize: 25, + notActivated: false, + isDeleted: false, + }, + }), + ) + }) + describe('unconfirmed emails', () => { beforeEach(async () => { - await wrapper.find('button.btn-block').trigger('click') + await wrapper.find('button.unconfirmedRegisterMails').trigger('click') }) - it('filters the users by unconfirmed emails', () => { - expect(wrapper.vm.searchResult).toHaveLength(0) + it('calls API with filter', () => { + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 1, + pageSize: 25, + notActivated: true, + isDeleted: false, + }, + }), + ) + }) + }) + + describe('deleted Users', () => { + beforeEach(async () => { + await wrapper.find('button.deletedUserSearch').trigger('click') + }) + + it('calls API with filter', () => { + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 1, + pageSize: 25, + notActivated: false, + isDeleted: true, + }, + }), + ) + }) + }) + + describe('pagination', () => { + beforeEach(async () => { + wrapper.setData({ currentPage: 2 }) + }) + + it('calls the API with new page', () => { + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 2, + pageSize: 25, + notActivated: false, + isDeleted: false, + }, + }), + ) + }) + }) + + describe('user search', () => { + beforeEach(async () => { + wrapper.setData({ criteria: 'search string' }) + }) + + it('calls the API with search string', () => { + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: 'search string', + currentPage: 1, + pageSize: 25, + notActivated: false, + isDeleted: false, + }, + }), + ) + }) + + describe('reset the search field', () => { + it('calls the API with empty criteria', async () => { + jest.clearAllMocks() + await wrapper.find('.test-click-clear-criteria').trigger('click') + expect(apolloQueryMock).toBeCalledWith( + expect.objectContaining({ + variables: { + searchText: '', + currentPage: 1, + pageSize: 25, + notActivated: false, + isDeleted: false, + }, + }), + ) + }) + }) + }) + + describe('delete user', () => { + const now = new Date() + beforeEach(async () => { + wrapper.findComponent({ name: 'SearchUserTable' }).vm.$emit('updateDeletedAt', 4, now) + }) + + it('marks the user as deleted', () => { + expect(wrapper.vm.searchResult.find((obj) => obj.userId === 4).deletedAt).toEqual(now) + }) + + it('toasts a success message', () => { + expect(toastSuccessSpy).toBeCalledWith('user_deleted') }) }) @@ -74,7 +211,7 @@ describe('UserSearch', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('Ouch') + expect(toastErrorSpy).toBeCalledWith('Ouch') }) }) }) diff --git a/admin/src/pages/UserSearch.vue b/admin/src/pages/UserSearch.vue index 2c8b289e0..24334e0c9 100644 --- a/admin/src/pages/UserSearch.vue +++ b/admin/src/pages/UserSearch.vue @@ -1,94 +1,81 @@ + diff --git a/admin/src/plugins/apolloProvider.js b/admin/src/plugins/apolloProvider.js index 0e342b8fc..1f51be20a 100644 --- a/admin/src/plugins/apolloProvider.js +++ b/admin/src/plugins/apolloProvider.js @@ -2,8 +2,6 @@ import { ApolloClient, ApolloLink, InMemoryCache, HttpLink } from 'apollo-boost' import VueApollo from 'vue-apollo' import CONFIG from '../config' import store from '../store/store' -import router from '../router/router' -import i18n from '../i18n' const httpLink = new HttpLink({ uri: CONFIG.GRAPHQL_URI }) @@ -16,9 +14,8 @@ const authLink = new ApolloLink((operation, forward) => { }) return forward(operation).map((response) => { if (response.errors && response.errors[0].message === '403.13 - Client certificate revoked') { - response.errors[0].message = i18n.t('error.session-expired') store.dispatch('logout', null) - if (router.currentRoute.path !== '/logout') router.push('/logout') + window.location.assign(CONFIG.WALLET_URL) return response } const newToken = operation.getContext().response.headers.get('token') diff --git a/admin/src/plugins/apolloProvider.test.js b/admin/src/plugins/apolloProvider.test.js index e5f394e96..75e415901 100644 --- a/admin/src/plugins/apolloProvider.test.js +++ b/admin/src/plugins/apolloProvider.test.js @@ -4,12 +4,10 @@ import CONFIG from '../config' import VueApollo from 'vue-apollo' import store from '../store/store' -import router from '../router/router' import i18n from '../i18n' jest.mock('vue-apollo') jest.mock('../store/store') -jest.mock('../router/router') jest.mock('../i18n') jest.mock('apollo-boost', () => { @@ -59,13 +57,11 @@ describe('apolloProvider', () => { errors: [{ message: '403.13 - Client certificate revoked' }], } - // mock router - const routerPushMock = jest.fn() - router.push = routerPushMock - router.currentRoute = { - path: '/overview', + const windowLocationMock = jest.fn() + delete window.location + window.location = { + assign: windowLocationMock, } - // mock context const setContextMock = jest.fn() const getContextMock = jest.fn(() => { @@ -128,21 +124,8 @@ describe('apolloProvider', () => { expect(storeDispatchMock).toBeCalledWith('logout', null) }) - describe('current route is not logout', () => { - it('redirects to logout', () => { - expect(routerPushMock).toBeCalledWith('/logout') - }) - }) - - describe('current route is logout', () => { - beforeEach(() => { - jest.clearAllMocks() - router.currentRoute.path = '/logout' - }) - - it('does not redirect to logout', () => { - expect(routerPushMock).not.toBeCalled() - }) + it('redirects to logout', () => { + expect(windowLocationMock).toBeCalledWith('http://localhost/login') }) }) diff --git a/admin/src/router/guards.js b/admin/src/router/guards.js index 4ed6c8516..dd61e8657 100644 --- a/admin/src/router/guards.js +++ b/admin/src/router/guards.js @@ -1,7 +1,7 @@ import { verifyLogin } from '../graphql/verifyLogin' import CONFIG from '../config' -const addNavigationGuards = (router, store, apollo) => { +const addNavigationGuards = (router, store, apollo, i18n) => { // store token on `authenticate` router.beforeEach(async (to, from, next) => { if (to.path === '/authenticate' && to.query && to.query.token) { @@ -14,6 +14,7 @@ const addNavigationGuards = (router, store, apollo) => { .then((result) => { const moderator = result.data.verifyLogin if (moderator.isAdmin) { + i18n.locale = moderator.language store.commit('moderator', moderator) next({ path: '/' }) } else { diff --git a/admin/src/router/guards.test.js b/admin/src/router/guards.test.js index cd5b33e68..da4dd5969 100644 --- a/admin/src/router/guards.test.js +++ b/admin/src/router/guards.test.js @@ -6,9 +6,11 @@ const apolloQueryMock = jest.fn().mockResolvedValue({ data: { verifyLogin: { isAdmin: true, + language: 'de', }, }, }) +const i18nLocaleMock = jest.fn() const store = { commit: storeCommitMock, @@ -21,7 +23,11 @@ const apollo = { query: apolloQueryMock, } -addNavigationGuards(router, store, apollo) +const i18n = { + locale: i18nLocaleMock, +} + +addNavigationGuards(router, store, apollo, i18n) describe('navigation guards', () => { beforeEach(() => { @@ -33,19 +39,23 @@ describe('navigation guards', () => { const next = jest.fn() describe('with valid token and as admin', () => { - beforeEach(() => { - navGuard({ path: '/authenticate', query: { token: 'valid-token' } }, {}, next) + beforeEach(async () => { + await navGuard({ path: '/authenticate', query: { token: 'valid-token' } }, {}, next) }) - it('commits the token to the store', async () => { + it('commits the token to the store', () => { expect(storeCommitMock).toBeCalledWith('token', 'valid-token') }) - it('commits the moderator to the store', () => { - expect(storeCommitMock).toBeCalledWith('moderator', { isAdmin: true }) + it.skip('sets the locale', () => { + expect(i18nLocaleMock).toBeCalledWith('de') }) - it('redirects to /', async () => { + it('commits the moderator to the store', () => { + expect(storeCommitMock).toBeCalledWith('moderator', { isAdmin: true, language: 'de' }) + }) + + it('redirects to /', () => { expect(next).toBeCalledWith({ path: '/' }) }) }) diff --git a/admin/src/store/store.js b/admin/src/store/store.js index fe5629e19..78fbf21ec 100644 --- a/admin/src/store/store.js +++ b/admin/src/store/store.js @@ -24,6 +24,9 @@ export const mutations = { moderator: (state, moderator) => { state.moderator = moderator }, + setUserSelectedInMassCreation: (state, userSelectedInMassCreation) => { + state.userSelectedInMassCreation = userSelectedInMassCreation + }, } export const actions = { @@ -44,6 +47,7 @@ const store = new Vuex.Store({ token: CONFIG.DEBUG_DISABLE_AUTH ? 'validToken' : null, moderator: null, openCreations: 0, + userSelectedInMassCreation: [], }, // Syncronous mutation of the state mutations, diff --git a/admin/src/store/store.test.js b/admin/src/store/store.test.js index e027ebf1a..5ddb048eb 100644 --- a/admin/src/store/store.test.js +++ b/admin/src/store/store.test.js @@ -10,6 +10,7 @@ const { resetOpenCreations, setOpenCreations, moderator, + setUserSelectedInMassCreation, } = mutations const { logout } = actions @@ -64,6 +65,14 @@ describe('Vuex store', () => { expect(state.openCreations).toEqual(12) }) }) + + describe('setUserSelectedInMassCreation', () => { + it('sets userSelectedInMassCreation to given value', () => { + const state = { userSelectedInMassCreation: [] } + setUserSelectedInMassCreation(state, [0, 1, 2]) + expect(state.userSelectedInMassCreation).toEqual([0, 1, 2]) + }) + }) }) describe('actions', () => { diff --git a/admin/test/testSetup.js b/admin/test/testSetup.js index caaa3c19c..df3a025da 100644 --- a/admin/test/testSetup.js +++ b/admin/test/testSetup.js @@ -5,11 +5,18 @@ import { BootstrapVue, IconsPlugin } from 'bootstrap-vue' // without this async calls are not working import 'regenerator-runtime' +import { toasters } from '../src/mixins/toaster' + +export const toastErrorSpy = jest.spyOn(toasters.methods, 'toastError') +export const toastSuccessSpy = jest.spyOn(toasters.methods, 'toastSuccess') + global.localVue = createLocalVue() global.localVue.use(BootstrapVue) global.localVue.use(IconsPlugin) +global.localVue.mixin(toasters) + // throw errors for vue warnings to force the programmers to take care about warnings Vue.config.warnHandler = (w) => { throw new Error(w) diff --git a/admin/vue.config.js b/admin/vue.config.js index 18929c38c..8cc1e4b89 100644 --- a/admin/vue.config.js +++ b/admin/vue.config.js @@ -2,11 +2,12 @@ const path = require('path') const webpack = require('webpack') const Dotenv = require('dotenv-webpack') const StatsPlugin = require('stats-webpack-plugin') +const CONFIG = require('./src/config') // vue.config.js module.exports = { devServer: { - port: process.env.PORT || 8080, + port: CONFIG.PORT, }, pluginOptions: { i18n: { @@ -14,6 +15,7 @@ module.exports = { fallbackLocale: 'de', localeDir: 'locales', enableInSFC: false, + enableLegacy: false, }, }, lintOnSave: true, @@ -33,7 +35,7 @@ module.exports = { // 'process.env.DOCKER_WORKDIR': JSON.stringify(process.env.DOCKER_WORKDIR), // 'process.env.BUILD_DATE': JSON.stringify(process.env.BUILD_DATE), // 'process.env.BUILD_VERSION': JSON.stringify(process.env.BUILD_VERSION), - 'process.env.BUILD_COMMIT': JSON.stringify(process.env.BUILD_COMMIT), + 'process.env.BUILD_COMMIT': JSON.stringify(CONFIG.BUILD_COMMIT), // 'process.env.PORT': JSON.stringify(process.env.PORT), }), // generate webpack stats to allow analysis of the bundlesize @@ -45,7 +47,7 @@ module.exports = { }, css: { // Enable CSS source maps. - sourceMap: process.env.NODE_ENV !== 'production', + sourceMap: CONFIG.NODE_ENV !== 'production', }, outputDir: path.resolve(__dirname, './dist'), } diff --git a/admin/yarn.lock b/admin/yarn.lock index 46b5aaa93..d5fae27fe 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -932,6 +932,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.14.0": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" + integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@7", "@babel/template@^7.0.0", "@babel/template@^7.15.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" @@ -1001,6 +1008,21 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" + integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.1" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1042,6 +1064,83 @@ cssnano-preset-default "^4.0.0" postcss "^7.0.0" +"@intlify/core-base@^9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.1.9.tgz#e4e8c951010728e4af3a0d13d74cf3f9e7add7f6" + integrity sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw== + dependencies: + "@intlify/devtools-if" "9.1.9" + "@intlify/message-compiler" "9.1.9" + "@intlify/message-resolver" "9.1.9" + "@intlify/runtime" "9.1.9" + "@intlify/shared" "9.1.9" + "@intlify/vue-devtools" "9.1.9" + +"@intlify/devtools-if@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/devtools-if/-/devtools-if-9.1.9.tgz#a30e1dd1256ff2c5c98d8d75d075384fba898e5d" + integrity sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ== + dependencies: + "@intlify/shared" "9.1.9" + +"@intlify/eslint-plugin-vue-i18n@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-1.4.0.tgz#f8fe791892c2dce7d189a364b6a908c87e1c3ac9" + integrity sha512-anB1eBf6rpxpWyW883gi6O1hozQy4Q02VyzyodOUnohOqT07GATVSxnr2J9/qQSV47xWukV+9LiRErJcU7d/uA== + dependencies: + "@eslint/eslintrc" "^1.2.0" + "@intlify/core-base" "^9.1.9" + "@intlify/message-compiler" "^9.1.9" + debug "^4.3.1" + glob "^7.1.3" + ignore "^5.0.5" + is-language-code "^3.1.0" + js-yaml "^4.0.0" + json5 "^2.1.3" + jsonc-eslint-parser "^2.0.0" + lodash "^4.17.11" + parse5 "^6.0.0" + semver "^7.3.4" + vue-eslint-parser "^8.0.0" + yaml-eslint-parser "^0.5.0" + +"@intlify/message-compiler@9.1.9", "@intlify/message-compiler@^9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.1.9.tgz#1193cbd224a71c2fb981455b8534a3c766d2948d" + integrity sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ== + dependencies: + "@intlify/message-resolver" "9.1.9" + "@intlify/shared" "9.1.9" + source-map "0.6.1" + +"@intlify/message-resolver@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/message-resolver/-/message-resolver-9.1.9.tgz#3155ccd2f5e6d0dc16cad8b7f1d8e97fcda05bfc" + integrity sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA== + +"@intlify/runtime@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/runtime/-/runtime-9.1.9.tgz#2c12ce29518a075629efed0a8ed293ee740cb285" + integrity sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg== + dependencies: + "@intlify/message-compiler" "9.1.9" + "@intlify/message-resolver" "9.1.9" + "@intlify/shared" "9.1.9" + +"@intlify/shared@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.1.9.tgz#0baaf96128b85560666bec784ffb01f6623cc17a" + integrity sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw== + +"@intlify/vue-devtools@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz#2be8f4dbe7f7ed4115676eb32348141d411e426b" + integrity sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og== + dependencies: + "@intlify/message-resolver" "9.1.9" + "@intlify/runtime" "9.1.9" + "@intlify/shared" "9.1.9" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1673,6 +1772,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^2.0.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" @@ -2394,6 +2498,11 @@ acorn@^8.2.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== +acorn@^8.5.0, acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + address@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -2640,6 +2749,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -2712,6 +2826,11 @@ array.prototype.flat@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -3508,6 +3627,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3634,16 +3758,16 @@ bootstrap-vue@^2.21.2: portal-vue "^2.1.7" vue-functional-data-merge "^3.1.0" +bootstrap@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" + integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== + "bootstrap@>=4.5.3 <5.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== -bootstrap@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34" - integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3923,6 +4047,15 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -4141,6 +4274,16 @@ cli-spinners@^2.0.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-table3@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -4191,6 +4334,13 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + clone@2.x: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -4268,6 +4418,16 @@ color@^3.0.0: color-convert "^1.9.3" color-string "^1.6.0" +colord@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -4486,6 +4646,17 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -4576,6 +4747,11 @@ css-declaration-sorter@^4.0.1: postcss "^7.0.1" timsort "^0.3.0" +css-functions-list@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.0.1.tgz#1460df7fb584d1692c30b105151dbb988c8094f9" + integrity sha512-PriDuifDt4u4rkDgnqRCLnjfMatufLmWNfQnGCq34xZwpY3oabwhB9SqRBmuvWUgndbemCFlKqg+nO7C2q0SBw== + css-loader@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" @@ -4825,7 +5001,22 @@ debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize@^1.2.0: +debug@^4.3.0, debug@^4.3.1, debug@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4862,7 +5053,7 @@ deepmerge@^1.5.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== -deepmerge@^4.2.2: +deepmerge@^4.2.0, deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== @@ -5101,6 +5292,13 @@ domhandler@^4.0.0, domhandler@^4.2.0: dependencies: domelementtype "^2.2.0" +domhandler@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -5109,7 +5307,7 @@ domutils@^1.7.0: dom-serializer "0" domelementtype "1" -domutils@^2.5.2, domutils@^2.6.0: +domutils@^2.5.2, domutils@^2.6.0, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -5118,6 +5316,14 @@ domutils@^2.5.2, domutils@^2.6.0: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-object@^1.7.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/dot-object/-/dot-object-1.9.0.tgz#6e3d6d8379f794c5174599ddf05528f5990f076e" + integrity sha512-7MPN6y7XhAO4vM4eguj5+5HNKLjJYfkVG1ZR1Aput4Q4TR6SYeSjhpVQ77IzJHoSHffKbDxBC+48aCiiRurDPw== + dependencies: + commander "^2.20.0" + glob "^7.1.4" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -5273,6 +5479,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + errno@^0.1.3, errno@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -5513,6 +5724,14 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -5542,6 +5761,11 @@ eslint-visitor-keys@^3.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186" integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q== +eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + eslint@7.25.0: version "7.25.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" @@ -5585,6 +5809,11 @@ eslint@7.25.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.2.13: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" @@ -5603,6 +5832,15 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +espree@^9.0.0, espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -5734,6 +5972,13 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -5905,6 +6150,17 @@ fast-glob@^3.1.1: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -5915,6 +6171,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -6076,6 +6337,11 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" @@ -6239,6 +6505,11 @@ get-stdin@^6.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -6310,6 +6581,22 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -6339,6 +6626,18 @@ globby@^11.0.4: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -6376,6 +6675,11 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" @@ -6424,6 +6728,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" @@ -6569,6 +6878,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -6659,6 +6975,16 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +htmlparser2@^7.1.2: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -6808,6 +7134,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.0.5, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + ignore@^5.1.1, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" @@ -6843,6 +7174,11 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -6864,6 +7200,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -6897,7 +7238,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4: +ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7074,6 +7415,13 @@ is-core-module@^2.2.0, is-core-module@^2.7.0: dependencies: has "^1.0.3" +is-core-module@^2.5.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -7169,6 +7517,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-language-code@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-language-code/-/is-language-code-3.1.0.tgz#b2386b49227e7010636f16d0c2c681ca40136ab5" + integrity sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA== + dependencies: + "@babel/runtime" "^7.14.0" + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -7217,7 +7572,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -7234,6 +7589,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -7247,6 +7607,11 @@ is-regex@^1.0.4, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -7286,6 +7651,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + is-weakref@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" @@ -8339,6 +8709,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.0.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -8491,7 +8868,7 @@ json3@^3.3.3: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@2.x, json5@^2.1.2: +json5@2.x, json5@^2.1.2, json5@^2.1.3: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== @@ -8510,6 +8887,16 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonc-eslint-parser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.1.0.tgz#4c126b530aa583d85308d0b3041ff81ce402bbb2" + integrity sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g== + dependencies: + acorn "^8.5.0" + eslint-visitor-keys "^3.0.0" + espree "^9.0.0" + semver "^7.3.5" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -8551,7 +8938,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -8561,6 +8948,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +known-css-properties@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.24.0.tgz#19aefd85003ae5698a5560d2b55135bf5432155c" + integrity sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA== + launch-editor-middleware@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" @@ -8821,6 +9213,16 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -8828,6 +9230,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8868,6 +9275,24 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8885,7 +9310,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -8962,6 +9387,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-css-extract-plugin@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" @@ -8989,6 +9419,15 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -9032,11 +9471,6 @@ mkdirp@0.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -moment@^2.19.2, moment@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -9101,6 +9535,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +nanoid@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -9271,6 +9710,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" @@ -9293,6 +9742,11 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -9715,7 +10169,7 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parse5@6.0.1, parse5@^6.0.1: +parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -9989,6 +10443,15 @@ postcss-discard-overridden@^4.0.1: dependencies: postcss "^7.0.0" +postcss-html@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-1.3.0.tgz#5b28b44a9cc8351cdba6ae1f26017c2303bd7642" + integrity sha512-ewbwd7OGW4dLsErtvZH9HpVMEcXnlhYSzKsr7MepGlOT8imHTIZ/+pdfEruLS+hTYapLTQAWDnoQcJpsYU4uRw== + dependencies: + htmlparser2 "^7.1.2" + postcss "^8.4.0" + postcss-safe-parser "^6.0.0" + postcss-load-config@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -10007,6 +10470,11 @@ postcss-loader@^3.0.0: postcss-load-config "^2.0.0" schema-utils "^1.0.0" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -10212,6 +10680,21 @@ postcss-reduce-transforms@^4.0.2: postcss "^7.0.0" postcss-value-parser "^3.0.0" +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= + +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-scss@^4.0.2, postcss-scss@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.3.tgz#36c23c19a804274e722e83a54d20b838ab4767ac" + integrity sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA== + postcss-selector-parser@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" @@ -10229,6 +10712,14 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-svgo@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" @@ -10257,6 +10748,11 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" @@ -10265,6 +10761,15 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.3 picocolors "^0.2.1" source-map "^0.6.1" +postcss@^8.4.0, postcss@^8.4.6, postcss@^8.4.8: + version "8.4.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.8.tgz#dad963a76e82c081a0657d3a2f3602ce10c2e032" + integrity sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ== + dependencies: + nanoid "^3.3.1" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -10485,6 +10990,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -10606,6 +11116,14 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + regenerate-unicode-properties@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" @@ -11045,7 +11563,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -11204,6 +11722,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -11303,6 +11826,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -11327,16 +11855,16 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -11391,6 +11919,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -11542,7 +12075,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^2.0.0: +string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -11651,6 +12184,13 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -11661,6 +12201,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -11670,6 +12215,112 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylelint-config-html@>=1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-html/-/stylelint-config-html-1.0.0.tgz#172acb996ee4c854e8c670fcff77ff0d98d3bec2" + integrity sha512-rKQUUWDpaYC7ybsS6tLxddjn6DxhjSIXybElSmcTyVQj3ExhmU3q+l41ktrlwHRyY0M5SkTkZiwngvYPYmsgSQ== + +stylelint-config-recommended-scss@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.2.tgz#193f483861c76a36ece24c52eb6baca4838f4a48" + integrity sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg== + dependencies: + postcss-scss "^4.0.2" + stylelint-config-recommended "^6.0.0" + stylelint-scss "^4.0.0" + +stylelint-config-recommended-vue@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.3.0.tgz#a40f1efa5bff8bd3e2c1c58c3faacbe73b5b69ec" + integrity sha512-UEY/MZlBO2yiQdZoJm33trtqJ1MEDzBADhIAM0pTvfYbyXe5KwdbTtmALHETG1cXfDxuuUbJTvL9uENMy2Rjug== + dependencies: + semver "^7.3.5" + stylelint-config-html ">=1.0.0" + stylelint-config-recommended ">=6.0.0" + +stylelint-config-recommended@>=6.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz#7497372ae83ab7a6fffc18d7d7b424c6480ae15e" + integrity sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q== + +stylelint-config-recommended@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz#fd2523a322836005ad9bf473d3e5534719c09f9d" + integrity sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw== + +stylelint-config-standard-scss@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-3.0.0.tgz#dafc4fa5538d0ed833bf0a7d391e075683ffd96c" + integrity sha512-zt3ZbzIbllN1iCmc94e4pDxqpkzeR6CJo5DDXzltshuXr+82B8ylHyMMARNnUYrZH80B7wgY7UkKTYCFM0UUyw== + dependencies: + stylelint-config-recommended-scss "^5.0.2" + stylelint-config-standard "^24.0.0" + +stylelint-config-standard@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-24.0.0.tgz#6823f207ab997ae0b641f9a636d007cc44d77541" + integrity sha512-+RtU7fbNT+VlNbdXJvnjc3USNPZRiRVp/d2DxOF/vBDDTi0kH5RX2Ny6errdtZJH3boO+bmqIYEllEmok4jiuw== + dependencies: + stylelint-config-recommended "^6.0.0" + +stylelint-scss@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-4.1.0.tgz#39b808696f8152081163d970449257ff80b5c041" + integrity sha512-BNYTo7MMamhFOlcaAWp2dMpjg6hPyM/FFqfDIYzmYVLMmQJqc8lWRIiTqP4UX5bresj9Vo0dKC6odSh43VP2NA== + dependencies: + lodash "^4.17.21" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.0.6" + postcss-value-parser "^4.1.0" + +stylelint@^14.5.3: + version "14.5.3" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.5.3.tgz#103b6670128ba3dea69fe3a1a07c4a5d3e0e3450" + integrity sha512-omHETL+kGHR+fCXFK1SkZD/A+emCP9esggAdWEl8GPjTNeyRYj+H6uetRDcU+7E451zwWiUYGVAX+lApsAZgsQ== + dependencies: + balanced-match "^2.0.0" + colord "^2.9.2" + cosmiconfig "^7.0.1" + css-functions-list "^3.0.1" + debug "^4.3.3" + execall "^2.0.0" + fast-glob "^3.2.11" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.1" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.2.0" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.24.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.4" + normalize-path "^3.0.0" + normalize-selector "^0.2.0" + picocolors "^1.0.0" + postcss "^8.4.6" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + specificity "^0.4.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + style-search "^0.1.0" + supports-hyperlinks "^2.2.0" + svg-tags "^1.0.0" + table "^6.8.0" + v8-compile-cache "^2.3.0" + write-file-atomic "^4.0.1" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -11703,7 +12354,7 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: +supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== @@ -11757,6 +12408,17 @@ table@^6.0.4: string-width "^4.2.3" strip-ansi "^6.0.1" +table@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -12000,6 +12662,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -12106,6 +12773,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -12364,7 +13036,7 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -12426,6 +13098,20 @@ vue-apollo@^3.0.8: serialize-javascript "^4.0.0" throttle-debounce "^2.1.0" +vue-cli-plugin-i18n@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/vue-cli-plugin-i18n/-/vue-cli-plugin-i18n-2.3.1.tgz#193b1e481a02e044d847392b3d070e1a3dec954e" + integrity sha512-1bNVZtLIAL9Pge8hiw986vixofyqF/tlgsqe4fF5JWn9c8xhsqVugEBuUeaYxevrE9efhhFk9mRmEDwBwQnbNg== + dependencies: + debug "^4.3.0" + deepmerge "^4.2.0" + dotenv "^8.2.0" + flat "^5.0.0" + rimraf "^3.0.0" + vue "^2.6.11" + vue-i18n "^8.17.0" + vue-i18n-extract "1.0.2" + vue-eslint-parser@^7.10.0: version "7.11.0" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" @@ -12439,6 +13125,19 @@ vue-eslint-parser@^7.10.0: lodash "^4.17.21" semver "^6.3.0" +vue-eslint-parser@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d" + integrity sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g== + dependencies: + debug "^4.3.2" + eslint-scope "^7.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.0.0" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.5" + vue-functional-data-merge@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz#08a7797583b7f35680587f8a1d51d729aa1dc657" @@ -12449,6 +13148,23 @@ vue-hot-reload-api@^2.3.0: resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== +vue-i18n-extract@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vue-i18n-extract/-/vue-i18n-extract-1.0.2.tgz#0a136e12d1634d6799e187aad81a7003d02f67a5" + integrity sha512-+zwDKvle4KcfloXZnj5hF01ViKDiFr5RMx5507D7oyDXpSleRpekF5YHgZa/+Ra6Go68//z0Nya58J9tKFsCjw== + dependencies: + cli-table3 "^0.5.1" + dot-object "^1.7.1" + esm "^3.2.13" + glob "^7.1.3" + is-valid-glob "^1.0.0" + yargs "^13.2.2" + +vue-i18n@^8.17.0: + version "8.27.0" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.27.0.tgz#3e3b3ed2c107ccbd7f20dbdd7a96763a9990253e" + integrity sha512-SX35iJHL5PJ4Gfh0Mo/q0shyHiI2V6Zkh51c+k8E9O1RKv5BQyYrCxRzpvPrsIOJEnLaeiovet3dsUB0e/kDzw== + vue-i18n@^8.26.5: version "8.26.5" resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.26.5.tgz#b61e994e7ae83564c6aebd004543156bbdc7c7e9" @@ -12491,13 +13207,6 @@ vue-loader@^15.9.2: vue-hot-reload-api "^2.3.0" vue-style-loader "^4.1.0" -vue-moment@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vue-moment/-/vue-moment-4.1.0.tgz#092a8ff723a96c6f85a0a8e23ad30f0bf320f3b0" - integrity sha512-Gzisqpg82ItlrUyiD9d0Kfru+JorW2o4mQOH06lEDZNgxci0tv/fua1Hl0bo4DozDV2JK1r52Atn/8QVCu8qQw== - dependencies: - moment "^2.19.2" - vue-router@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.3.tgz#041048053e336829d05dafacf6a8fb669a2e7999" @@ -12524,11 +13233,6 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue-toasted@^1.1.28: - version "1.1.28" - resolved "https://registry.yarnpkg.com/vue-toasted/-/vue-toasted-1.1.28.tgz#dbabb83acc89f7a9e8765815e491d79f0dc65c26" - integrity sha512-UUzr5LX51UbbiROSGZ49GOgSzFxaMHK6L00JV8fir/CYNJCpIIvNZ5YmS4Qc8Y2+Z/4VVYRpeQL2UO0G800Raw== - vue@^2.6.11: version "2.6.14" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" @@ -12835,7 +13539,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12912,6 +13616,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^5.2.0: version "5.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" @@ -12971,6 +13683,20 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml-eslint-parser@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/yaml-eslint-parser/-/yaml-eslint-parser-0.5.0.tgz#01d4e4d992a820769ea85ef5fd526dfc20ebc6f5" + integrity sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g== + dependencies: + eslint-visitor-keys "^3.0.0" + lodash "^4.17.21" + yaml "^1.10.2" + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@10.x: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" @@ -12994,12 +13720,12 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^13.3.0, yargs@^13.3.2: +yargs@^13.2.2, yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== diff --git a/backend/.env.dist b/backend/.env.dist index f38e31be5..b8a3d5dbe 100644 --- a/backend/.env.dist +++ b/backend/.env.dist @@ -1,36 +1,48 @@ +CONFIG_VERSION=v1.2022-03-18 + +# Server PORT=4000 JWT_SECRET=secret123 JWT_EXPIRES_IN=10m GRAPHIQL=false GDT_API_URL=https://gdt.gradido.net + +# Database DB_HOST=localhost DB_PORT=3306 DB_USER=root DB_PASSWORD= DB_DATABASE=gradido_community +TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log -#EMAIL=true -#EMAIL_USERNAME= -#EMAIL_SENDER= -#EMAIL_PASSWORD= -#EMAIL_SMTP_URL= -#EMAIL_SMTP_PORT=587 -#RESEND_TIME=1 minute, 60 => 1hour, 1440 (60 minutes * 24 hours) => 24 hours -#RESEND_TIME= -RESEND_TIME=10 +# Klicktipp +KLICKTIPP=false +KLICKTTIPP_API_URL=https://api.klicktipp.com +KLICKTIPP_USER=gradido_test +KLICKTIPP_PASSWORD=secret321 +KLICKTIPP_APIKEY_DE=SomeFakeKeyDE +KLICKTIPP_APIKEY_EN=SomeFakeKeyEN -#EMAIL_LINK_VERIFICATION=http://localhost/vue/checkEmail/$1 +# Community +COMMUNITY_NAME=Gradido Entwicklung +COMMUNITY_URL=http://localhost/ +COMMUNITY_REGISTER_URL=http://localhost/register +COMMUNITY_DESCRIPTION=Die lokale Entwicklungsumgebung von Gradido. -#KLICKTIPP_USER= -#KLICKTIPP_PASSWORD= -#KLICKTIPP_APIKEY_DE= -#KLICKTIPP_APIKEY_EN= -#KLICKTIPP=true -COMMUNITY_NAME= -COMMUNITY_URL= -COMMUNITY_REGISTER_URL= -COMMUNITY_DESCRIPTION= +# Login Server LOGIN_APP_SECRET=21ffbbc616fe LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a +# EMail +EMAIL=false +EMAIL_USERNAME=gradido_email +EMAIL_SENDER=info@gradido.net +EMAIL_PASSWORD=xxx +EMAIL_SMTP_URL=gmail.com +EMAIL_SMTP_PORT=587 +EMAIL_LINK_VERIFICATION=http://localhost/checkEmail/{optin}{code} +EMAIL_LINK_SETPASSWORD=http://localhost/reset/{optin} +EMAIL_CODE_VALID_TIME=10 + +# Webhook WEBHOOK_ELOPAGE_SECRET=secret \ No newline at end of file diff --git a/backend/.env.template b/backend/.env.template new file mode 100644 index 000000000..454b25d3c --- /dev/null +++ b/backend/.env.template @@ -0,0 +1,48 @@ +CONFIG_VERSION=$BACKEND_CONFIG_VERSION + +# Server +JWT_SECRET=$JWT_SECRET +JWT_EXPIRES_IN=10m +GRAPHIQL=false +GDT_API_URL=$GDT_API_URL + +# Database +DB_HOST=localhost +DB_PORT=3306 +DB_USER=$DB_USER +DB_PASSWORD=$DB_PASSWORD +DB_DATABASE=gradido_community +TYPEORM_LOGGING_RELATIVE_PATH=$TYPEORM_LOGGING_RELATIVE_PATH + +# Klicktipp +KLICKTIPP=$KLICKTIPP +KLICKTTIPP_API_URL=https://api.klicktipp.com +KLICKTIPP_USER=$KLICKTIPP_USER +KLICKTIPP_PASSWORD=$KLICKTIPP_PASSWORD +KLICKTIPP_APIKEY_DE=$KLICKTIPP_APIKEY_DE +KLICKTIPP_APIKEY_EN=$KLICKTIPP_APIKEY_EN + +# Community +COMMUNITY_NAME=$COMMUNITY_NAME +COMMUNITY_URL=$COMMUNITY_URL +COMMUNITY_REGISTER_URL=$COMMUNITY_REGISTER_URL +COMMUNITY_DESCRIPTION=$COMMUNITY_DESCRIPTION + +# Login Server +LOGIN_APP_SECRET=21ffbbc616fe +LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a + +# EMail +RESEND_TIME=10 +EMAIL=$EMAIL +EMAIL_USERNAME=$EMAIL_USERNAME +EMAIL_SENDER=$EMAIL_SENDER +EMAIL_PASSWORD=$EMAIL_PASSWORD +EMAIL_SMTP_URL=$EMAIL_SMTP_URL +EMAIL_SMTP_PORT=587 +EMAIL_LINK_VERIFICATION=$EMAIL_LINK_VERIFICATION +EMAIL_LINK_SETPASSWORD=$EMAIL_LINK_SETPASSWORD +RESEND_TIME=10 + +# Webhook +WEBHOOK_ELOPAGE_SECRET=$WEBHOOK_ELOPAGE_SECRET \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore index 90ee96052..147e82849 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,5 +1,6 @@ /node_modules/ /.env +/.env.bak /build/ package-json.lock coverage diff --git a/backend/jest.config.js b/backend/jest.config.js index 9d99c68f6..6ab44002c 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -3,10 +3,20 @@ module.exports = { verbose: true, preset: 'ts-jest', collectCoverage: true, - collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**'], + collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'], + setupFiles: ['/test/testSetup.ts'], + modulePathIgnorePatterns: ['/build/'], moduleNameMapper: { - '@entity/(.*)': '/../database/build/entity/$1', - // This is hack to fix a problem with the library `ts-mysql-migrate` which does differentiate between its ts/js state + '@/(.*)': '/src/$1', + '@model/(.*)': '/src/graphql/model/$1', + '@arg/(.*)': '/src/graphql/arg/$1', + '@enum/(.*)': '/src/graphql/enum/$1', + '@repository/(.*)': '/src/typeorm/repository/$1', + '@test/(.*)': '/test/$1', + '@entity/(.*)': + process.env.NODE_ENV === 'development' + ? '/../database/entity/$1' + : '/../database/build/entity/$1', '@dbTools/(.*)': process.env.NODE_ENV === 'development' ? '/../database/src/$1' diff --git a/backend/package.json b/backend/package.json index c9314f0fd..3ce04bded 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "gradido-backend", - "version": "1.5.1", + "version": "1.6.6", "description": "Gradido unified backend providing an API-Service for Gradido Transactions", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/backend", @@ -10,38 +10,39 @@ "scripts": { "build": "tsc --build", "clean": "tsc --build --clean", - "start": "node build/index.js", - "dev": "nodemon -w src --ext ts --exec ts-node src/index.ts", - "lint": "eslint . --ext .js,.ts", - "CI_worklfow_test": "jest --runInBand --coverage ", - "test": "NODE_ENV=development jest --runInBand --coverage " + "start": "TZ=UTC TS_NODE_BASEURL=./build node -r tsconfig-paths/register build/src/index.js", + "dev": "TZ=UTC nodemon -w src --ext ts --exec ts-node -r tsconfig-paths/register src/index.ts", + "lint": "eslint --max-warnings=0 --ext .js,.ts .", + "test": "TZ=UTC NODE_ENV=development jest --runInBand --coverage --forceExit --detectOpenHandles", + "seed": "TZ=UTC ts-node -r tsconfig-paths/register src/seeds/index.ts" }, "dependencies": { "@types/jest": "^27.0.2", + "@types/lodash.clonedeep": "^4.5.6", + "apollo-log": "^1.1.0", "apollo-server-express": "^2.25.2", "apollo-server-testing": "^2.25.2", "axios": "^0.21.1", - "body-parser": "^1.19.0", "class-validator": "^0.13.1", "cors": "^2.8.5", + "decimal.js-light": "^2.5.1", "dotenv": "^10.0.0", "express": "^4.17.1", "graphql": "^15.5.1", "jest": "^27.2.4", "jsonwebtoken": "^8.5.1", - "module-alias": "^2.2.2", - "moment": "^2.29.1", + "lodash.clonedeep": "^4.5.0", "mysql2": "^2.3.0", "nodemailer": "^6.6.5", "random-bigint": "^0.0.1", "reflect-metadata": "^0.1.13", "sodium-native": "^3.3.0", "ts-jest": "^27.0.5", - "type-graphql": "^1.1.1", - "typeorm": "^0.2.38" + "type-graphql": "^1.1.1" }, "devDependencies": { "@types/express": "^4.17.12", + "@types/faker": "^5.5.9", "@types/jsonwebtoken": "^8.5.2", "@types/node": "^16.10.3", "@types/nodemailer": "^6.4.4", @@ -54,13 +55,11 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-promise": "^5.1.0", + "faker": "^5.5.3", "nodemon": "^2.0.7", "prettier": "^2.3.1", "ts-node": "^10.0.0", + "tsconfig-paths": "^3.14.0", "typescript": "^4.3.4" - }, - "_moduleAliases": { - "@entity": "../database/build/entity", - "@dbTools": "../database/build/src" } } diff --git a/backend/src/apis/KlicktippController.ts b/backend/src/apis/KlicktippController.ts index 544b39d97..824d40af2 100644 --- a/backend/src/apis/KlicktippController.ts +++ b/backend/src/apis/KlicktippController.ts @@ -1,11 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { KlicktippConnector } from './klicktippConnector' -import CONFIG from '../config' +import CONFIG from '@/config' const klicktippConnector = new KlicktippConnector() -export const signIn = async ( +export const klicktippSignIn = async ( email: string, language: string, firstName?: string, diff --git a/backend/src/auth/INALIENABLE_RIGHTS.ts b/backend/src/auth/INALIENABLE_RIGHTS.ts index 58a81ce52..348cd5b20 100644 --- a/backend/src/auth/INALIENABLE_RIGHTS.ts +++ b/backend/src/auth/INALIENABLE_RIGHTS.ts @@ -7,5 +7,6 @@ export const INALIENABLE_RIGHTS = [ RIGHTS.CREATE_USER, RIGHTS.SEND_RESET_PASSWORD_EMAIL, RIGHTS.SET_PASSWORD, - RIGHTS.CHECK_USERNAME, + RIGHTS.QUERY_TRANSACTION_LINK, + RIGHTS.QUERY_OPT_IN, ] diff --git a/backend/src/auth/JWT.ts b/backend/src/auth/JWT.ts index 06c6507b8..e32e68223 100644 --- a/backend/src/auth/JWT.ts +++ b/backend/src/auth/JWT.ts @@ -1,5 +1,5 @@ import jwt from 'jsonwebtoken' -import CONFIG from '../config/' +import CONFIG from '@/config/' import { CustomJwtPayload } from './CustomJwtPayload' export const decode = (token: string): CustomJwtPayload | null => { diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 8988620d7..f40088779 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -16,9 +16,14 @@ export enum RIGHTS { CREATE_USER = 'CREATE_USER', SEND_RESET_PASSWORD_EMAIL = 'SEND_RESET_PASSWORD_EMAIL', SET_PASSWORD = 'SET_PASSWORD', + QUERY_OPT_IN = 'QUERY_OPT_IN', UPDATE_USER_INFOS = 'UPDATE_USER_INFOS', - CHECK_USERNAME = 'CHECK_USERNAME', HAS_ELOPAGE = 'HAS_ELOPAGE', + CREATE_TRANSACTION_LINK = 'CREATE_TRANSACTION_LINK', + DELETE_TRANSACTION_LINK = 'DELETE_TRANSACTION_LINK', + QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', + REDEEM_TRANSACTION_LINK = 'REDEEM_TRANSACTION_LINK', + LIST_TRANSACTION_LINKS = 'LIST_TRANSACTION_LINKS', // Admin SEARCH_USERS = 'SEARCH_USERS', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', @@ -26,4 +31,8 @@ export enum RIGHTS { SEARCH_PENDING_CREATION = 'SEARCH_PENDING_CREATION', DELETE_PENDING_CREATION = 'DELETE_PENDING_CREATION', CONFIRM_PENDING_CREATION = 'CONFIRM_PENDING_CREATION', + SEND_ACTIVATION_EMAIL = 'SEND_ACTIVATION_EMAIL', + DELETE_USER = 'DELETE_USER', + UNDELETE_USER = 'UNDELETE_USER', + CREATION_TRANSACTION_LIST = 'CREATION_TRANSACTION_LIST', } diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index ada6a2cef..82c689848 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -18,6 +18,10 @@ export const ROLE_USER = new Role('user', [ RIGHTS.LOGOUT, RIGHTS.UPDATE_USER_INFOS, RIGHTS.HAS_ELOPAGE, + RIGHTS.CREATE_TRANSACTION_LINK, + RIGHTS.DELETE_TRANSACTION_LINK, + RIGHTS.REDEEM_TRANSACTION_LINK, + RIGHTS.LIST_TRANSACTION_LINKS, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights diff --git a/backend/src/config/index.test.ts b/backend/src/config/index.test.ts new file mode 100644 index 000000000..3c4c7865e --- /dev/null +++ b/backend/src/config/index.test.ts @@ -0,0 +1,9 @@ +import CONFIG from './index' + +describe('config/index', () => { + describe('decay start block', () => { + it('has the correct date set', () => { + expect(CONFIG.DECAY_START_TIME).toEqual(new Date('2021-05-13 17:46:31')) + }) + }) +}) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 88d07737c..dcfea2bdb 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -1,8 +1,24 @@ // ATTENTION: DO NOT PUT ANY SECRETS IN HERE (or the .env) import dotenv from 'dotenv' +import Decimal from 'decimal.js-light' dotenv.config() +Decimal.set({ + precision: 25, + rounding: Decimal.ROUND_HALF_UP, +}) + +const constants = { + DB_VERSION: '0033-add_referrer_id', + DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0 + CONFIG_VERSION: { + DEFAULT: 'DEFAULT', + EXPECTED: 'v1.2022-03-18', + CURRENT: '', + }, +} + const server = { PORT: process.env.PORT || 4000, JWT_SECRET: process.env.JWT_SECRET || 'secret123', @@ -18,6 +34,7 @@ const database = { DB_USER: process.env.DB_USER || 'root', DB_PASSWORD: process.env.DB_PASSWORD || '', DB_DATABASE: process.env.DB_DATABASE || 'gradido_community', + TYPEORM_LOGGING_RELATIVE_PATH: process.env.TYPEORM_LOGGING_RELATIVE_PATH || 'typeorm.backend.log', } const klicktipp = { @@ -31,8 +48,8 @@ const klicktipp = { const community = { COMMUNITY_NAME: process.env.COMMUNITY_NAME || 'Gradido Entwicklung', - COMMUNITY_URL: process.env.COMMUNITY_URL || 'http://localhost/vue/', - COMMUNITY_REGISTER_URL: process.env.COMMUNITY_REGISTER_URL || 'http://localhost/vue/register', + COMMUNITY_URL: process.env.COMMUNITY_URL || 'http://localhost/', + COMMUNITY_REGISTER_URL: process.env.COMMUNITY_REGISTER_URL || 'http://localhost/register', COMMUNITY_DESCRIPTION: process.env.COMMUNITY_DESCRIPTION || 'Die lokale Entwicklungsumgebung von Gradido.', } @@ -42,7 +59,6 @@ const loginServer = { LOGIN_SERVER_KEY: process.env.LOGIN_SERVER_KEY || 'a51ef8ac7ef1abf162fb7a65261acd7a', } -const resendTime = parseInt(process.env.RESEND_TIME ? process.env.RESEND_TIME : 'null') const email = { EMAIL: process.env.EMAIL === 'true' || false, EMAIL_USERNAME: process.env.EMAIL_USERNAME || 'gradido_email', @@ -51,19 +67,36 @@ const email = { EMAIL_SMTP_URL: process.env.EMAIL_SMTP_URL || 'gmail.com', EMAIL_SMTP_PORT: process.env.EMAIL_SMTP_PORT || '587', EMAIL_LINK_VERIFICATION: - process.env.EMAIL_LINK_VERIFICATION || 'http://localhost/vue/checkEmail/$1', - EMAIL_LINK_SETPASSWORD: process.env.EMAIL_LINK_SETPASSWORD || 'http://localhost/vue/reset/$1', - RESEND_TIME: isNaN(resendTime) ? 10 : resendTime, + process.env.EMAIL_LINK_VERIFICATION || 'http://localhost/checkEmail/{optin}{code}', + EMAIL_LINK_SETPASSWORD: + process.env.EMAIL_LINK_SETPASSWORD || 'http://localhost/reset-password/{optin}', + EMAIL_CODE_VALID_TIME: process.env.EMAIL_CODE_VALID_TIME + ? parseInt(process.env.EMAIL_CODE_VALID_TIME) || 10 + : 10, } const webhook = { + // Elopage WEBHOOK_ELOPAGE_SECRET: process.env.WEBHOOK_ELOPAGE_SECRET || 'secret', } // This is needed by graphql-directive-auth process.env.APP_SECRET = server.JWT_SECRET +// Check config version +constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION || constants.CONFIG_VERSION.DEFAULT +if ( + ![constants.CONFIG_VERSION.EXPECTED, constants.CONFIG_VERSION.DEFAULT].includes( + constants.CONFIG_VERSION.CURRENT, + ) +) { + throw new Error( + `Fatal: Config Version incorrect - expected "${constants.CONFIG_VERSION.EXPECTED}" or "${constants.CONFIG_VERSION.DEFAULT}", but found "${constants.CONFIG_VERSION.CURRENT}"`, + ) +} + const CONFIG = { + ...constants, ...server, ...database, ...klicktipp, diff --git a/backend/src/config/mnemonic.uncompressed_buffer13116.txt b/backend/src/config/mnemonic.uncompressed_buffer13116.txt new file mode 100644 index 000000000..8eceb1e2f --- /dev/null +++ b/backend/src/config/mnemonic.uncompressed_buffer13116.txt @@ -0,0 +1 @@ +abandon,ability,able,about,above,absent,absorb,abstract,absurd,abuse,access,accident,account,accuse,achieve,acid,acoustic,acquire,across,act,action,actor,actress,actual,adapt,add,addict,address,adjust,admit,adult,advance,advice,aerobic,affair,afford,afraid,again,age,agent,agree,ahead,aim,air,airport,aisle,alarm,album,alcohol,alert,alien,all,alley,allow,almost,alone,alpha,already,also,alter,always,amateur,amazing,among,amount,amused,analyst,anchor,ancient,anger,angle,angry,animal,ankle,announce,annual,another,answer,antenna,antique,anxiety,any,apart,apology,appear,apple,approve,april,arch,arctic,area,arena,argue,arm,armed,armor,army,around,arrange,arrest,arrive,arrow,art,artefact,artist,artwork,ask,aspect,assault,asset,assist,assume,asthma,athlete,atom,attack,attend,attitude,attract,auction,audit,august,aunt,author,auto,autumn,average,avocado,avoid,awake,aware,away,awesome,awful,awkward,axis,baby,bachelor,bacon,badge,bag,balance,balcony,ball,bamboo,banana,banner,bar,barely,bargain,barrel,base,basic,basket,battle,beach,bean,beauty,because,become,beef,before,begin,behave,behind,believe,below,belt,bench,benefit,best,betray,better,between,beyond,bicycle,bid,bike,bind,biology,bird,birth,bitter,black,blade,blame,blanket,blast,bleak,bless,blind,blood,blossom,blouse,blue,blur,blush,board,boat,body,boil,bomb,bone,bonus,book,boost,border,boring,borrow,boss,bottom,bounce,box,boy,bracket,brain,brand,brass,brave,bread,breeze,brick,bridge,brief,bright,bring,brisk,broccoli,broken,bronze,broom,brother,brown,brush,bubble,buddy,budget,buffalo,build,bulb,bulk,bullet,bundle,bunker,burden,burger,burst,bus,business,busy,butter,buyer,buzz,cabbage,cabin,cable,cactus,cage,cake,call,calm,camera,camp,can,canal,cancel,candy,cannon,canoe,canvas,canyon,capable,capital,captain,car,carbon,card,cargo,carpet,carry,cart,case,cash,casino,castle,casual,cat,catalog,catch,category,cattle,caught,cause,caution,cave,ceiling,celery,cement,census,century,cereal,certain,chair,chalk,champion,change,chaos,chapter,charge,chase,chat,cheap,check,cheese,chef,cherry,chest,chicken,chief,child,chimney,choice,choose,chronic,chuckle,chunk,churn,cigar,cinnamon,circle,citizen,city,civil,claim,clap,clarify,claw,clay,clean,clerk,clever,click,client,cliff,climb,clinic,clip,clock,clog,close,cloth,cloud,clown,club,clump,cluster,clutch,coach,coast,coconut,code,coffee,coil,coin,collect,color,column,combine,come,comfort,comic,common,company,concert,conduct,confirm,congress,connect,consider,control,convince,cook,cool,copper,copy,coral,core,corn,correct,cost,cotton,couch,country,couple,course,cousin,cover,coyote,crack,cradle,craft,cram,crane,crash,crater,crawl,crazy,cream,credit,creek,crew,cricket,crime,crisp,critic,crop,cross,crouch,crowd,crucial,cruel,cruise,crumble,crunch,crush,cry,crystal,cube,culture,cup,cupboard,curious,current,curtain,curve,cushion,custom,cute,cycle,dad,damage,damp,dance,danger,daring,dash,daughter,dawn,day,deal,debate,debris,decade,december,decide,decline,decorate,decrease,deer,defense,define,defy,degree,delay,deliver,demand,demise,denial,dentist,deny,depart,depend,deposit,depth,deputy,derive,describe,desert,design,desk,despair,destroy,detail,detect,develop,device,devote,diagram,dial,diamond,diary,dice,diesel,diet,differ,digital,dignity,dilemma,dinner,dinosaur,direct,dirt,disagree,discover,disease,dish,dismiss,disorder,display,distance,divert,divide,divorce,dizzy,doctor,document,dog,doll,dolphin,domain,donate,donkey,donor,door,dose,double,dove,draft,dragon,drama,drastic,draw,dream,dress,drift,drill,drink,drip,drive,drop,drum,dry,duck,dumb,dune,during,dust,dutch,duty,dwarf,dynamic,eager,eagle,early,earn,earth,easily,east,easy,echo,ecology,economy,edge,edit,educate,effort,egg,eight,either,elbow,elder,electric,elegant,element,elephant,elevator,elite,else,embark,embody,embrace,emerge,emotion,employ,empower,empty,enable,enact,end,endless,endorse,enemy,energy,enforce,engage,engine,enhance,enjoy,enlist,enough,enrich,enroll,ensure,enter,entire,entry,envelope,episode,equal,equip,era,erase,erode,erosion,error,erupt,escape,essay,essence,estate,eternal,ethics,evidence,evil,evoke,evolve,exact,example,excess,exchange,excite,exclude,excuse,execute,exercise,exhaust,exhibit,exile,exist,exit,exotic,expand,expect,expire,explain,expose,express,extend,extra,eye,eyebrow,fabric,face,faculty,fade,faint,faith,fall,false,fame,family,famous,fan,fancy,fantasy,farm,fashion,fat,fatal,father,fatigue,fault,favorite,feature,february,federal,fee,feed,feel,female,fence,festival,fetch,fever,few,fiber,fiction,field,figure,file,film,filter,final,find,fine,finger,finish,fire,firm,first,fiscal,fish,fit,fitness,fix,flag,flame,flash,flat,flavor,flee,flight,flip,float,flock,floor,flower,fluid,flush,fly,foam,focus,fog,foil,fold,follow,food,foot,force,forest,forget,fork,fortune,forum,forward,fossil,foster,found,fox,fragile,frame,frequent,fresh,friend,fringe,frog,front,frost,frown,frozen,fruit,fuel,fun,funny,furnace,fury,future,gadget,gain,galaxy,gallery,game,gap,garage,garbage,garden,garlic,garment,gas,gasp,gate,gather,gauge,gaze,general,genius,genre,gentle,genuine,gesture,ghost,giant,gift,giggle,ginger,giraffe,girl,give,glad,glance,glare,glass,glide,glimpse,globe,gloom,glory,glove,glow,glue,goat,goddess,gold,good,goose,gorilla,gospel,gossip,govern,gown,grab,grace,grain,grant,grape,grass,gravity,great,green,grid,grief,grit,grocery,group,grow,grunt,guard,guess,guide,guilt,guitar,gun,gym,habit,hair,half,hammer,hamster,hand,happy,harbor,hard,harsh,harvest,hat,have,hawk,hazard,head,health,heart,heavy,hedgehog,height,hello,helmet,help,hen,hero,hidden,high,hill,hint,hip,hire,history,hobby,hockey,hold,hole,holiday,hollow,home,honey,hood,hope,horn,horror,horse,hospital,host,hotel,hour,hover,hub,huge,human,humble,humor,hundred,hungry,hunt,hurdle,hurry,hurt,husband,hybrid,ice,icon,idea,identify,idle,ignore,ill,illegal,illness,image,imitate,immense,immune,impact,impose,improve,impulse,inch,include,income,increase,index,indicate,indoor,industry,infant,inflict,inform,inhale,inherit,initial,inject,injury,inmate,inner,innocent,input,inquiry,insane,insect,inside,inspire,install,intact,interest,into,invest,invite,involve,iron,island,isolate,issue,item,ivory,jacket,jaguar,jar,jazz,jealous,jeans,jelly,jewel,job,join,joke,journey,joy,judge,juice,jump,jungle,junior,junk,just,kangaroo,keen,keep,ketchup,key,kick,kid,kidney,kind,kingdom,kiss,kit,kitchen,kite,kitten,kiwi,knee,knife,knock,know,lab,label,labor,ladder,lady,lake,lamp,language,laptop,large,later,latin,laugh,laundry,lava,law,lawn,lawsuit,layer,lazy,leader,leaf,learn,leave,lecture,left,leg,legal,legend,leisure,lemon,lend,length,lens,leopard,lesson,letter,level,liar,liberty,library,license,life,lift,light,like,limb,limit,link,lion,liquid,list,little,live,lizard,load,loan,lobster,local,lock,logic,lonely,long,loop,lottery,loud,lounge,love,loyal,lucky,luggage,lumber,lunar,lunch,luxury,lyrics,machine,mad,magic,magnet,maid,mail,main,major,make,mammal,man,manage,mandate,mango,mansion,manual,maple,marble,march,margin,marine,market,marriage,mask,mass,master,match,material,math,matrix,matter,maximum,maze,meadow,mean,measure,meat,mechanic,medal,media,melody,melt,member,memory,mention,menu,mercy,merge,merit,merry,mesh,message,metal,method,middle,midnight,milk,million,mimic,mind,minimum,minor,minute,miracle,mirror,misery,miss,mistake,mix,mixed,mixture,mobile,model,modify,mom,moment,monitor,monkey,monster,month,moon,moral,more,morning,mosquito,mother,motion,motor,mountain,mouse,move,movie,much,muffin,mule,multiply,muscle,museum,mushroom,music,must,mutual,myself,mystery,myth,naive,name,napkin,narrow,nasty,nation,nature,near,neck,need,negative,neglect,neither,nephew,nerve,nest,net,network,neutral,never,news,next,nice,night,noble,noise,nominee,noodle,normal,north,nose,notable,note,nothing,notice,novel,now,nuclear,number,nurse,nut,oak,obey,object,oblige,obscure,observe,obtain,obvious,occur,ocean,october,odor,off,offer,office,often,oil,okay,old,olive,olympic,omit,once,one,onion,online,only,open,opera,opinion,oppose,option,orange,orbit,orchard,order,ordinary,organ,orient,original,orphan,ostrich,other,outdoor,outer,output,outside,oval,oven,over,own,owner,oxygen,oyster,ozone,pact,paddle,page,pair,palace,palm,panda,panel,panic,panther,paper,parade,parent,park,parrot,party,pass,patch,path,patient,patrol,pattern,pause,pave,payment,peace,peanut,pear,peasant,pelican,pen,penalty,pencil,people,pepper,perfect,permit,person,pet,phone,photo,phrase,physical,piano,picnic,picture,piece,pig,pigeon,pill,pilot,pink,pioneer,pipe,pistol,pitch,pizza,place,planet,plastic,plate,play,please,pledge,pluck,plug,plunge,poem,poet,point,polar,pole,police,pond,pony,pool,popular,portion,position,possible,post,potato,pottery,poverty,powder,power,practice,praise,predict,prefer,prepare,present,pretty,prevent,price,pride,primary,print,priority,prison,private,prize,problem,process,produce,profit,program,project,promote,proof,property,prosper,protect,proud,provide,public,pudding,pull,pulp,pulse,pumpkin,punch,pupil,puppy,purchase,purity,purpose,purse,push,put,puzzle,pyramid,quality,quantum,quarter,question,quick,quit,quiz,quote,rabbit,raccoon,race,rack,radar,radio,rail,rain,raise,rally,ramp,ranch,random,range,rapid,rare,rate,rather,raven,raw,razor,ready,real,reason,rebel,rebuild,recall,receive,recipe,record,recycle,reduce,reflect,reform,refuse,region,regret,regular,reject,relax,release,relief,rely,remain,remember,remind,remove,render,renew,rent,reopen,repair,repeat,replace,report,require,rescue,resemble,resist,resource,response,result,retire,retreat,return,reunion,reveal,review,reward,rhythm,rib,ribbon,rice,rich,ride,ridge,rifle,right,rigid,ring,riot,ripple,risk,ritual,rival,river,road,roast,robot,robust,rocket,romance,roof,rookie,room,rose,rotate,rough,round,route,royal,rubber,rude,rug,rule,run,runway,rural,sad,saddle,sadness,safe,sail,salad,salmon,salon,salt,salute,same,sample,sand,satisfy,satoshi,sauce,sausage,save,say,scale,scan,scare,scatter,scene,scheme,school,science,scissors,scorpion,scout,scrap,screen,script,scrub,sea,search,season,seat,second,secret,section,security,seed,seek,segment,select,sell,seminar,senior,sense,sentence,series,service,session,settle,setup,seven,shadow,shaft,shallow,share,shed,shell,sheriff,shield,shift,shine,ship,shiver,shock,shoe,shoot,shop,short,shoulder,shove,shrimp,shrug,shuffle,shy,sibling,sick,side,siege,sight,sign,silent,silk,silly,silver,similar,simple,since,sing,siren,sister,situate,six,size,skate,sketch,ski,skill,skin,skirt,skull,slab,slam,sleep,slender,slice,slide,slight,slim,slogan,slot,slow,slush,small,smart,smile,smoke,smooth,snack,snake,snap,sniff,snow,soap,soccer,social,sock,soda,soft,solar,soldier,solid,solution,solve,someone,song,soon,sorry,sort,soul,sound,soup,source,south,space,spare,spatial,spawn,speak,special,speed,spell,spend,sphere,spice,spider,spike,spin,spirit,split,spoil,sponsor,spoon,sport,spot,spray,spread,spring,spy,square,squeeze,squirrel,stable,stadium,staff,stage,stairs,stamp,stand,start,state,stay,steak,steel,stem,step,stereo,stick,still,sting,stock,stomach,stone,stool,story,stove,strategy,street,strike,strong,struggle,student,stuff,stumble,style,subject,submit,subway,success,such,sudden,suffer,sugar,suggest,suit,summer,sun,sunny,sunset,super,supply,supreme,sure,surface,surge,surprise,surround,survey,suspect,sustain,swallow,swamp,swap,swarm,swear,sweet,swift,swim,swing,switch,sword,symbol,symptom,syrup,system,table,tackle,tag,tail,talent,talk,tank,tape,target,task,taste,tattoo,taxi,teach,team,tell,ten,tenant,tennis,tent,term,test,text,thank,that,theme,then,theory,there,they,thing,this,thought,three,thrive,throw,thumb,thunder,ticket,tide,tiger,tilt,timber,time,tiny,tip,tired,tissue,title,toast,tobacco,today,toddler,toe,together,toilet,token,tomato,tomorrow,tone,tongue,tonight,tool,tooth,top,topic,topple,torch,tornado,tortoise,toss,total,tourist,toward,tower,town,toy,track,trade,traffic,tragic,train,transfer,trap,trash,travel,tray,treat,tree,trend,trial,tribe,trick,trigger,trim,trip,trophy,trouble,truck,true,truly,trumpet,trust,truth,try,tube,tuition,tumble,tuna,tunnel,turkey,turn,turtle,twelve,twenty,twice,twin,twist,two,type,typical,ugly,umbrella,unable,unaware,uncle,uncover,under,undo,unfair,unfold,unhappy,uniform,unique,unit,universe,unknown,unlock,until,unusual,unveil,update,upgrade,uphold,upon,upper,upset,urban,urge,usage,use,used,useful,useless,usual,utility,vacant,vacuum,vague,valid,valley,valve,van,vanish,vapor,various,vast,vault,vehicle,velvet,vendor,venture,venue,verb,verify,version,very,vessel,veteran,viable,vibrant,vicious,victory,video,view,village,vintage,violin,virtual,virus,visa,visit,visual,vital,vivid,vocal,voice,void,volcano,volume,vote,voyage,wage,wagon,wait,walk,wall,walnut,want,warfare,warm,warrior,wash,wasp,waste,water,wave,way,wealth,weapon,wear,weasel,weather,web,wedding,weekend,weird,welcome,west,wet,whale,what,wheat,wheel,when,where,whip,whisper,wide,width,wife,wild,will,win,window,wine,wing,wink,winner,winter,wire,wisdom,wise,wish,witness,wolf,woman,wonder,wood,wool,word,work,world,worry,worth,wrap,wreck,wrestle,wrist,write,wrong,yard,year,yellow,you,young,youth,zebra,zero,zone,zoo, \ No newline at end of file diff --git a/backend/src/config/mnemonic.words_ulf.encoding.txt b/backend/src/config/mnemonic.words_ulf.encoding.txt deleted file mode 100644 index 1be83cc2e..000000000 --- a/backend/src/config/mnemonic.words_ulf.encoding.txt +++ /dev/null @@ -1,2048 +0,0 @@ -Monumental -Volksbank -Beeren -huschen -leer -Haft -saagut -Positiv -daran -solide -dauerhaft -zahlungsfähig -beinhalten -weglassen -Ausmaß -irrtümlich -Impuls -darüber -Abriss -setzten -Herkunft -manipulierbar -anfängt -anliegen -Mutter -Beobachter -Zeichner -dran -genug -Medikament -Tanten -behindern -Johannes -Rand -Illusion -anzuwenden -Fehler -erniedrigen -gehören -Güte -unangenehm -Horst -Koordination -weltweit -geprägt -unerlässlich -einig -mitbringen -Dieb -dann -Karriere -Ethik -dich -Ursachen -beglücken -Wahl -dermaßen -spritzen -erbittert -Maler -täglich -Wohlstand -hübsch -Klarheit -voneinander -berühmt -Iris -plausibel -verlagern -Lauf -Foyer -Idol -spreizen -Hölderlin -Grenze -Code -Dogma -langfristig -Urzustand -verursacht -Fasching -Finger -König -barbarisch -einbringen -Disziplin -angreifen -speichern -Urheberrecht -ermorden -Diana -Auswirkung -beginnen -kooperativ -Ahnung -allen -bisschen -durften -Prostitution -Strahlen -Umschwung -Foto -taten -Mechanismus -Urvertrauen -Chef -feminin -nirgendwo -Absatzmarkt -welches -Entwicklung -gearbeitet -erblühen -umtauschen -Aufklärung -online -produktiv -Pest -Coach -Anblick -ursprünglich -schon -solange -eventuell -Tatsache -erforderlich -Buch -derartig -werden -auseinander -halten -Maurer -Himmel -Loch -Forum -Kluft -aufbauen -bricht -permanent -saugen -exponential -Fetzen -Mord -unausweichlich -untrennbar -skeptisch -geschützt -Gebäude -Butter -bezeichnet -Daunen -Journalist -ehrgeizig -System -Zugriff -Anwalt -Krone -ankommt -zulassen -Stufenplan -Raum -Sanktion -Währung -Tradition -Money -dafür -Gruppe -solch -geben -geholfen -frei -Rahmen -Rasen -feindlich -Wirklichkeit -Unheil -luden -Ausgleich -leugnen -erklärt -Vater -Ingenieur -Erfahrung -Stil -dörren -wozu -befassen -gemäß -Apotheke -Vegan -simultan -wehen -gang -immateriell -Wilhelm -fertig -kennen -korrigieren -Jahr -Industrie -hier -Glück -Anton -Bionik -abwaschen -Hannes -Diamant -Anweisung -angleichen -Fördern -Helene -glasklar -Abgaben -beflügeln -Trennung -Ziegler -überhaupt -Guido -rotieren -treiben -sowie -Begründung -Erdöl -selig -jegliche -belastbar -ehrlich -Eier -Schulden -Brutto -Paar -Sitz -hast -annähern -Neigung -Menü -messbar -vervollständigt -Erkenntnis -pendeln -Edwin -römisch -entstehen -Gefahr -Resonanz -ungleich -Sprache -Tsunami -Bindung -Sympathie -Bomber -Schlusswort -bislang -befreien -fegen -drastisch -greift -obwohl -bewährt -Jörg -drehen -Quartett -Betätigung -Szene -Kinder -Respekt -Empathie -eher -unwichtig -besser -nein -Kredit -liegen -zulegen -Forschung -Hurrikan -wesentlich -Deutschland -eintauchen -entzünden -betteln -Islam -Rohre -Müll -Tage -sinken -Hunger -fungieren -Radio -Lohn -lenken -Container -marode -gering -Ozean -Revolution -Meter -tausend -Kalkulation -blau -Hautfarbe -Kurt -Ding -Mathematiker -jene -renovieren -Popstar -auferlegen -unübersichtlich -fantasievoll -Bedürfnisse -Maßstab -Feier -Onkel -essen -Stein -einzeln -Woche -Sekunde -Phantasie -Blockade -Chip -Moment -lüften -Jasmin -aufrecht -eisern -oder -Fachsprache -Komponist -Vermögen -allmählich -Urwissen -selbstregulierend -Brust -Leute -Gegner -Pause -unqualifiziert -August -Umdrehung -wegdenken -gucken -leihen -vordringen -Durst -Seite -fast -hinaus -Binnenland -Bund -sollt -Albert -Smartphone -Kriminalität -Protest -Fremdkosten -klingen -Chicago -Baum -sammeln -sehen -soviel -Horoskop -keiner -Pension -soweit -Quantensprung -intrinsisch -anno -Züge -Zeug -Wissenschaft -dass -loszulassen -brauchen -Lehrer -rufen -Lama -Sparen -größte -Kerl -enthalten -Flügel -Rabatt -ehrt -endlich -religiös -Orchester -braten -Feedback -exemplarisch -Zitat -Recht -toll -Zusammenfassung -hervor -Eigentum -teuer -nichtkommerziell -benachbart -leider -Fahrzeug -glauben -putzen -geübt -begünstigen -Kasten -zuspitzen -meckern -organisation -loben -Anthropologie -Seminar -moralisch -Last -merken -Samen -kassieren -Bube -Engpass -Hopfen -Hirte -Gefängnis -Gedanke -bepacken -brillant -verrichtet -drohen -Katze -reif -Fossilien -gezeigt -Packen -persönlich -denen -wegweisend -Horror -Diplomat -Japan -pflanzlich -kaltblütig -Kunde -Geruch -Patriarch -Garnele -bedingungslos -Prinzip -Vergänglichkeit -stört -hinein -Tomate -halb -geplatzt -Theologe -Vogel -September -Steak -repräsentieren -heißen -hoch -hinblick -Wunsch -frustriert -Fidel -Blödsinn -früh -Birne -Hülle -loslegen -jetzt -Biene -regnen -Celsius -hören -genommen -Fleisch -diejenigen -davon -vorrangig -sonst -herrschend -ertragen -Neuorientierung -nächsten -sozusagen -Sabbat -honorieren -verwirklichen -Mobbing -Annahme -Hügel -Bedeutung -Risiko -riskieren -ermöglichen -hemmen -Frist -Klima -böse -sofern -Paul -vertieft -missionieren -zuvor -Nagel -backen -getauft -dazu -Blech -zufolge -Koch -immerwährend -Regenwald -Finnland -altruistisch -grau -Oktober -Universität -Philosoph -Ungarn -Wirtschaft -hinlänglich -Abteil -sperrt -aggressiv -Gast -externe -Saat -Zustand -losfliegen -egal -Dubai -aktiv -flattern -zunehmend -Bauweise -erreichen -Markus -gegründet -zwölf -Rente -zwar -leicht -Fischer -Emotion -dunkel -Vision -fressen -dritter -athletisch -warum -Lage -bestimmt -Mitwirkender -Totenkopf -Qualität -hegen -Ecke -erhalten -fuhr -Sklave -getätigt -belügen -gutmachen -breit -konnten -Obst -subventionieren -Pflicht -Planet -keimen -sogar -deshalb -Milch -Gesicht -zögern -fundamental -Zwang -typisch -gefunden -offen -Publikum -wieso -strukturell -Voraussetzung -umhin -Geduld -dient -Professor -wechseln -Minute -Ärmel -Konto -waren -Information -ganz -studieren -Reihenhaus -Henry -oftmals -Apfelbaum -reißen -Labor -effektiv -Umfeld -sogenannten -Insolvenz -erzwingen -später -funktionieren -Meile -extrem -Hallo -mitdenken -Heim -Praxis -lediglich -Kohle -inmitten -berichten -Soja -Firma -rasant -relativ -doof -Belgien -Rendite -Auge -abschreiben -Direktor -unsere -Absätze -plus -suchen -inklusive -somit -Spirit -verändern -Test -Bewohner -eindeutig -Strom -leiten -Zentralbank -Austausch -pickt -weise -Tourismus -spielen -Absicht -Beachtung -Spekulation -ernst -telefonieren -Trotz -Technologie -indigene -gelöst -Thomas -Blüte -Ferienjob -geteilt -Heinrich -gelangen -Situation -Kunst -Zufall -Haufen -geworden -Wurzel -Punkt -Temperatur -zukunftsfähig -Opfer -Josef -nutzen -Kauf -annehmen -Klaus -berauben -Griff -erdacht -neulich -geändert -besitzen -liberal -kopieren -superreich -bekommen -Kolumbus -Mangel -Steffi -Hase -bahnbrechend -Norbert -Karte -kreativ -unverändert -effizient -Historiker -anschließend -Stichtag -These -nimmt -Finanzblase -wegnehmen -heutige -Hexe -Foliant -Flamme -Diktatur -klick -Mitleidenschaft -dick -vorliegend -verhindern -Klasse -uralt -Abfall -stoßen -lernen -ethnisch -Eleganz -schmackhaft -helfen -Wind -Pfarrer -neueste -anfangen -Erich -ausatmen -Präzision -Stück -aktuell -unproduktiv -dastehen -runter -Figaro -Internet -Gäste -sträflich -Angst -Bedarf -Ozonloch -Bioprodukte -mögen -Abraham -Sohn -Nebensitzer -zudem -Konzept -Russland -erzeugt -Stress -Hanau -Hugo -zehn -resultieren -Dach -junge -lehnen -Bewirtschaftung -gekommen -erproben -durch -Häuser -gigantisch -unendlich -Wegfall -Irland -Reparatur -perfekt -Pilz -Zauberwort -Dorf -darin -absolut -Anbau -Dung -müssen -betreiben -sieht -investieren -Ansatz -Vorwort -ablegen -Verantwortung -gebaut -Dreck -Feld -explizit -Harmonie -Rangordnung -maximal -meiner -vereinigt -Hamburg -clever -global -unfreiwillig -tierisch -Bayern -Importgüter -schenken -Donnerstag -Puffer -Rohstoff -britisch -Samuel -Handel -anstatt -Sprung -Dollar -Lösung -Engagement -Oberst -unmöglich -Goethe -zehren -Humorist -neuartig -plötzlich -Graf -ging -intakt -tragen -nahm -zusätzlich -Potenzial -beeinflussen -ziemlich -Beitrag -Fest -Hektik -beliebt -ergibt -ausbeuten -vorhanden -klagt -wegrationalisieren -bequem -werben -Welle -Spuren -decken -autistisch -Satz -musizieren -Umlaufbahn -nützlich -simpel -sauber -Fortschritt -losgelöst -bist -weder -ungünstig -Meer -treffen -peinlich -einnehmen -bewegte -notbedingt -benennen -Zugvogel -identisch -Infrastruktur -Blase -erfinden -modern -gähnen -Sportler -alte -aufs -Kampf -Nikolaus -fröhlich -Stockwerk -Fabel -Brasilien -passend -abgeschaut -Pädagoge -militärisch -Spaß -beugen -Einwohner -Ressourcen -Lunge -Discounter -insbesondere -lukrativ -bloß -erarbeiten -Referat -Neuseeland -Rose -Abhängigkeit -Gänse -Duft -Pilot -vernachlässigt -Lausbub -Darsteller -Bezahlung -Wörtchen -Seele -altbekannt -Seil -Lothar -irgendwann -Ironie -Titel -zumindest -Aussage -bezwingen -Errungenschaft -Medaille -Uhren -unmittelbar -treten -richtung -wahr -mitverursachen -bilden -Tennisspielerin -jenseits -Mädchen -aber -Territorium -Fenchel -Spende -Definition -draußen -parallel -annimmt -allgemein -King -verbessert -sowohl -Methode -Affe -Dank -Versorgung -Staunen -Vorteil -gegangen -ansonsten -kommt -beim -Gefrierpunkt -senkt -Elster -unter -Äther -niemand -dennoch -Zeit -Schriftsteller -klettern -boshaft -ohne -riesig -sorgfältig -Slums -Beschränkung -Gehalt -hergestellt -Urlaub -Gabe -Kapazität -werfen -suggerieren -Rolle -Guthaben -Höhle -nehmen -unfair -gemacht -Flur -kannst -Rassenkonflikte -Herbizide -Twitter -iPhone -Bausparkasse -entfalten -Vorbild -Orientale -erwidern -abrupt -mich -dein -Krieg -umkämpft -Kriterium -behaupten -Mitarbeiter -runden -Wort -hereinholen -beurteilen -Frieden -totalversagen -Africa -konfrontiert -Grün -sofort -ersten -Dotter -Facebook -gelingen -Unsinn -Arthur -umstellen -Kultur -Urmutter -Pyramide -Obsoleszenz -Biedermeier -gewehrt -heraus -ideal -ihnen -ausnahmslos -gerecht -satt -Inspiration -Sägemehl -jemanden -pflegen -Laden -optimieren -spazieren -mitnehmen -sondern -Nektar -anbringen -vorne -günstig -Vorfall -blind -widerstehen -einpendeln -einmal -Krebs -Einleitung -Institut -desto -Alibi -Besen -auftreten -zuschauen -Haar -Baukasten -ließen -polar -Umsetzung -Millionär -prima -gilt -insgesamt -Wartung -inländisch -reiten -befinden -bekannt -Niveau -Faktor -Antike -gutschreiben -antreiben -Drama -Floh -praktisch -unzählig -heikel -leiblich -Augsburg -Keller -Abendessen -anheben -retten -schnell -erhält -voriges -Wertschätzung -unnütz -neunziger -Prozess -Flutwelle -umfangreich -Geld -haben -gekauft -Öse -zukommen -Querdenker -genmanipuliert -müde -Seerose -gewaltfrei -Fiat -Negativität -faul -Datum -erfunden -gepachtet -sauer -bisher -wollen -Bonität -erbringen -restlich -oben -Fuß -Flotte -Robert -Phase -Inflation -tapfer -weinen -zeigen -hoffentlich -hingen -mutig -prüfen -lustig -gravierend -Fondue -ehemalig -mitharbeiten -Steuern -Holland -stabil -dessen -Initiative -geblieben -nachfolgen -Befehl -Nordstern -dahinter -Gott -Erbsen -Unmenschlichkeit -Reise -euch -Papa -Ersatz -Bande -womit -gerne -auskommen -nahezu -Brücke -Küche -Traum -selten -manche -häkeln -Summe -würdigen -einräumen -Lebzeiten -bitte -atmen -Licht -gekriegt -Neidisch -umso -Erde -Wolfgang -letzten -eignen -dezentral -genießen -klein -Sanft -pathologisch -anbieten -zugänglich -Flug -Bonus -regulieren -stolz -Zyklus -zerstören -fiel -Basis -delegieren -Legehenne -Leser -Fieber -wunderbar -Familie -Hippie -Gemeinschaft -Stunde -Zwergstaat -sagen -fokussieren -toxisch -psychologisch -fragen -Bach -zaudern -Lektorat -Ausland -Fackel -mehr -Datenbank -runzlig -erwähnen -Zimmerleute -Spuk -Preis -Einführung -gewidmet -talentiert -Gregor -Inhalt -Human -Südafrika -Sozialabgaben -Erfüllung -benutzt -Englisch -Nationalstaat -Krankheit -gönnen -unschätzbar -Fähigkeit -Tellerwäscher -damit -bebauen -Ehre -Software -stirbt -Honig -Altlasten -zuwider -Hobby -murmeln -beziffern -degradieren -geformt -Zufriedenheit -erlaubt -Fluss -Ratgeber -Fernseher -Hesse -jammern -verzeihen -Wagen -Mahlzeit -Abwicklung -Lizenz -Umwelt -Papst -Wolke -Fontane -Weggefährte -Fläche -ausdrücklich -stetig -dumm -Webseite -besonders -signifikant -exakt -virtuell -weichen -hilft -Topmanager -dazwischen -dringend -herzlich -kaum -Haupt -gespielt -einher -Arzt -gewöhnt -florieren -Anziehung -senden -Fichte -eingeführt -Anlass -Locke -geboren -zuerst -mahnen -evolutionär -beißen -Forelle -wenden -Umsatz -drucken -führen -Pflock -Haiti -Miesmacher -Estland -Staatseinkommen -Motte -dort -aufhören -Konsum -gutwillig -Befürworter -Ketzer -Blick -Hühner -bunkern -erinnern -Fohlen -hatten -zwitschern -Gentechnik -Berlin -foppen -Gier -Leonardo -väterlich -Hähnchen -bereits -Designer -rebellieren -Ufer -auch -Hütte -&Übel -Eden -Hermann -ungewöhnlich -Partei -gnädig -womöglich -Winter -anzetteln -vorprogrammiert -Fips -Flagge -zinslos -weil -bewahrt -Werk -Atom -Akademie -Anker -Sonne -derselbe -Sockel -Somalia -wann -erzählen -Abstand -enorm -indem -etwas -Erasmus -vorkommen -Rede -Tokio -dreifach -halfen -Zivilisation -Luftfahrt -Endverbraucher -Mama -Angebot -Vorschlag -hart -lokal -Sorte -Priorität -jedoch -genügend -dadurch -Branche -großartig -Regal -garantiert -unbewusst -Migrant -Auerhahn -David -stärken -Erbe -notfalls -hindurch -wickeln -quasi -darf -comedy -gehen -Start -verdeckt -Dosis -Brezel -Element -Kurs -Ämter -leuchten -zwischen -Beileid -weiblich -Ruder -Zoologe -aushalten -neugeboren -spüren -Ingwer -fließen -Idee -Samstag -trainieren -Flandern -Auffassung -ziehen -Masse -Nina -Arten -Gnade -Spezial -unkonventionell -Wald -Jugend -Busch -Fabian -dokumentieren -Felix -Film -belohnt -Gertrud -architektur -derzeitig -echt -Tagtraum -Margret -Objektivität -Sieger -empfinden -Beamten -akzeptieren -laut -Sternenstaub -Stadt -Aristoteles -Ferrari -finden -Google -Westen -Fratze -Bauer -Kreislauf -wovon -Jürgen -gerade -Platz -Madonna -Zahnersatz -Marianne -euer -Privat -Schatten -hundert -besucht -aufwärts -dynamisch -Sahne -viel -Teufel -Gebrauchsanweisung -Gradido -sieben -Flucht -holen -baden -ändern -jüngeren -Natur -chinesisch -Rohmaterial -Hauch -Konkurrenz -fiktiv -akkumulieren -Ball -beenden -bemüht -recyclebar -gedruckt -vegetarisch -woran -erwerben -lasst -bleiben -Radfahrer -Bücher -Klavier -genannt -Quelle -erheblich -gegenseitig -abzahlen -stagnieren -Hubert -Ende -Crash -Trinkwasser -Franz -Insekt -sensibilisieren -Erneuerung -Sehnen -Maus -Frau -betonung -stiege -Porsche -beide -absurd -dato -Österreich -beteiligen -dies -gezwungen -anvertrauen -Tilgung -Feder -logisch -konventionell -fatal -kulinarisch -Abholzung -Cicero -nostalgischen -schützen -brachte -Metzger -geehrt -Flasche -bringt -Villa -Krise -bietet -Entlastung -ausführung -Wikipedia -stellen -Park -Video -Papiergeld -voll -inzwischen -Jäger -Topf -ülzen -umgekehrt -Hanf -Februar -zirkulieren -John -heben -Novellierung -unfähig -servieren -Meier -jeweilig -Heuschrecke -daher -Alexander -Peter -erkannt -Gehirn -lateinisch -anpassbar -anderen -Artikel -Wucht -Leben -sein -exzellent -beantworten -Asche -reduzieren -Hersteller -Victor -zumal -Plage -hassen -fünf -liebevoll -für -Acker -morphogenetisch -Sachverhalt -umpolen -gibt -Busfahrer -beherzigen -weitergeben -brav -jeder -sich -Galaxis -steht -Maschine -erzielen -Sanierung -Kraft -Netto -Begabung -ersetzen -mindest -gestorben -Osten -Gebiet -Zweifel -zugleich -wild -kameradschaftlich -Farbe -Mitmensch -bevölkern -gesamt -Mittel -Reporter -Kilometer -kostenlos -mobil -wehren -herunter -Ansehen -erfrischend -Hotel -Analyse -Griechisch -Abwurf -käuflich -Bernd -entgegengesetzt -Bewusstsein -ankaufen -zurzeit -Impressum -Toast -Ladung -Verfütterung -Form -Wasser -gesund -noch -horchen -Variante -Anleitung -Pazifik -Wiederherstellung -Wandel -transformieren -Tisch -verknappt -Material -Realisierung -einer -Daimler -unvorstellbar -meldete -Strickmuster -stammen -Menge -Verifizieren -tief -Puzzle -Gepflogenheit -Ziel -dürfen -doch -Sinn -Region -fangen -zuteil -Anspruch -kehrte -Freund -Fimmel -darum -Girokonto -Zweck -Wohngemeinschaft -Projekt -schweigen -Kupfer -tauchen -holzig -Tendenz -abhalten -Nummer -bald -Töne -Salvador -Kapitel -Ibiza -Komfort -wobei -lachen -Wagnis -metaphorisch -gelb -bevor -unnatürlich -Leasing -bemerkenswert -zugute -beruhen -soeben -Kopf -wischen -appellieren -gelten -statt -Futter -Erdball -benötigt -futsch -Symbol -wofür -Glanz -beispiellos -normalen -mitfinanzieren -Frucht -italienisch -woher -allzu -beleben -weigern -Senf -Gift -atemlos -Cäsar -Begegnung -horten -sobald -Luxus -biologisch -Wettbewerb -Umkehrschluss -fallen -Darlehen -klug -anpreisen -doppelt -abwechslungsreich -Werner -nannte -Wittenberg -existenzbedrohend -deren -zynisch -Feuer -Leistung -Ideologie -Enkel -diskutiert -pervers -Brot -Ordnung -blubbern -einander -College -folgen -Anreiz -Agrarfläche -aufdecken -zerrinnen -ergründen -spalten -unehelich -Experte -viertel -gezogen -Mitspieler -geklappt -Kette -Petrus -Nahrung -Georg -Patent -Unkenntlich -Waage -ernähren -Botschafter -hell -Zelle -Silbe -pfiffig -Mystisch -Acht -ahnen -erkämpft -Team -zunächst -Benzin -falsch -erwarten -raffen -Auflage -Thema -ernten -Monat -lindern -meisten -zurückerlangen -Fenster -unabhängig -Jesus -geistig -divers -Göttingen -unruhig -Kategorie -fassen -hinzu -Wachstum -Sven -Chemie -quälen -Herde -standen -jährlich -Anhang -nötig -Hirsch -derjenige -Kurzgeschichte -ökologische -Theater -willkommen -ausüben -Kanal -nennt -Name -wussten -drücken -aufnehmen -Äste -Rücken -intuition -hätte -Zunahme -Gläubiger -abzählen -Phänomen -Ablage -spontan -spannend -Vanessa -Asien -gewusst -elektronisch -derb -getilgt -Antwort -geeignet -Bote -gequält -Anerkennung -Bilanz -natürlich -machbar -Verpackung -Blut -Eltern -Himbeere -rumfliegen -Senioren -zwingen -Spitze -Taschendiebe -steckt -Monster -Egotrip -Helmut -Bibel -geerbt -zitieren -Ameisenbau -Rekordgewinne -Hände -ergänzen -danach -orden -hinter -wenn -paddeln -gutes -Hinsicht -wegen -Teilhabe -Gesellschaft -christlich -Bezugsquelle -Igor -ausprobieren -Endpreis -links -gekürzt -einkaufen -Lied -Gerhard -gelohnt -nackt -Geburt -gelehrt -einseitig -gedeckt -hinweg -Eduard -Premiere -demografisch -ihre -höchste -wichtigsten -Aufmerksamkeit -Horde -physisch -Arbeitsklima -Brief -Notdurft -proportional -fordern -Ewig -denken -Daniel -Arabisch -edle -golden -Minimum -pure -beibringen -Boden -Anzahl -erschaffen -Energie -sehr -Gerücht -Generation -Räuber -Motivation -Chance -dabei -Programm -segensreich -April -ignorieren -Nase -epochal -Boot -faszinieren -Heilkunde -Helikopter -Computer -Kabarettist -wenig -zukünftig -sechzehn -stimmt -getragen -reagieren -Esoterik -Koralle -Dame -Katastrophe -liefern -Grund -Elend -ausreichen -Notenbank -Garten -zutiefst -Immobilien -Aspekt -naiv -besprechen -zählen -Terminologie -Amerika -Atmosphäre -Iran -debatte -Sound -Zugang -fair -unrentabel -baut -kollektiv -schief -Bank -Mann -Apropos -Ergebnis -Niederlande -Mietshaus -errichten -Ereignis -Portal -erhielten -erleben -Haus -Dschungel -Null -Pleite -Seegras -Entdeckung -also -Ebene -Anbeginn -kohärent -Autor -Mensch -hielt -Reich -Land -bekloppt -außerdem -Berg -gleich -sind -Argument -einverstanden -Euro -Sektor -dagegen -Knappheit -Armut -innerhalb -Blume -Problem -Bruder -Netzwerk -Orte -bedrängen -Aufgabe diff --git a/backend/src/config/mnemonic.words_ulf.txt b/backend/src/config/mnemonic.words_ulf.txt deleted file mode 100644 index 3b44fbd12..000000000 --- a/backend/src/config/mnemonic.words_ulf.txt +++ /dev/null @@ -1,2048 +0,0 @@ -Monumental -Volksbank -Beeren -huschen -leer -Haft -saagut -Positiv -daran -solide -dauerhaft -zahlungsfhig -beinhalten -weglassen -Ausma -irrtmlich -Impuls -darber -Abriss -setzten -Herkunft -manipulierbar -anfngt -anliegen -Mutter -Beobachter -Zeichner -dran -genug -Medikament -Tanten -behindern -Johannes -Rand -Illusion -anzuwenden -Fehler -erniedrigen -gehren -Gte -unangenehm -Horst -Koordination -weltweit -geprgt -unerlsslich -einig -mitbringen -Dieb -dann -Karriere -Ethik -dich -Ursachen -beglcken -Wahl -dermaen -spritzen -erbittert -Maler -tglich -Wohlstand -hbsch -Klarheit -voneinander -berhmt -Iris -plausibel -verlagern -Lauf -Foyer -Idol -spreizen -Hlderlin -Grenze -Code -Dogma -langfristig -Urzustand -verursacht -Fasching -Finger -Knig -barbarisch -einbringen -Disziplin -angreifen -speichern -Urheberrecht -ermorden -Diana -Auswirkung -beginnen -kooperativ -Ahnung -allen -bisschen -durften -Prostitution -Strahlen -Umschwung -Foto -taten -Mechanismus -Urvertrauen -Chef -feminin -nirgendwo -Absatzmarkt -welches -Entwicklung -gearbeitet -erblhen -umtauschen -Aufklrung -online -produktiv -Pest -Coach -Anblick -ursprnglich -schon -solange -eventuell -Tatsache -erforderlich -Buch -derartig -werden -auseinander -halten -Maurer -Himmel -Loch -Forum -Kluft -aufbauen -bricht -permanent -saugen -exponential -Fetzen -Mord -unausweichlich -untrennbar -skeptisch -geschtzt -Gebude -Butter -bezeichnet -Daunen -Journalist -ehrgeizig -System -Zugriff -Anwalt -Krone -ankommt -zulassen -Stufenplan -Raum -Sanktion -Whrung -Tradition -Money -dafr -Gruppe -solch -geben -geholfen -frei -Rahmen -Rasen -feindlich -Wirklichkeit -Unheil -luden -Ausgleich -leugnen -erklrt -Vater -Ingenieur -Erfahrung -Stil -drren -wozu -befassen -gem -Apotheke -Vegan -simultan -wehen -gang -immateriell -Wilhelm -fertig -kennen -korrigieren -Jahr -Industrie -hier -Glck -Anton -Bionik -abwaschen -Hannes -Diamant -Anweisung -angleichen -Frdern -Helene -glasklar -Abgaben -beflgeln -Trennung -Ziegler -berhaupt -Guido -rotieren -treiben -sowie -Begrndung -Erdl -selig -jegliche -belastbar -ehrlich -Eier -Schulden -Brutto -Paar -Sitz -hast -annhern -Neigung -Men -messbar -vervollstndigt -Erkenntnis -pendeln -Edwin -rmisch -entstehen -Gefahr -Resonanz -ungleich -Sprache -Tsunami -Bindung -Sympathie -Bomber -Schlusswort -bislang -befreien -fegen -drastisch -greift -obwohl -bewhrt -Jrg -drehen -Quartett -Bettigung -Szene -Kinder -Respekt -Empathie -eher -unwichtig -besser -nein -Kredit -liegen -zulegen -Forschung -Hurrikan -wesentlich -Deutschland -eintauchen -entznden -betteln -Islam -Rohre -Mll -Tage -sinken -Hunger -fungieren -Radio -Lohn -lenken -Container -marode -gering -Ozean -Revolution -Meter -tausend -Kalkulation -blau -Hautfarbe -Kurt -Ding -Mathematiker -jene -renovieren -Popstar -auferlegen -unbersichtlich -fantasievoll -Bedrfnisse -Mastab -Feier -Onkel -essen -Stein -einzeln -Woche -Sekunde -Phantasie -Blockade -Chip -Moment -lften -Jasmin -aufrecht -eisern -oder -Fachsprache -Komponist -Vermgen -allmhlich -Urwissen -selbstregulierend -Brust -Leute -Gegner -Pause -unqualifiziert -August -Umdrehung -wegdenken -gucken -leihen -vordringen -Durst -Seite -fast -hinaus -Binnenland -Bund -sollt -Albert -Smartphone -Kriminalitt -Protest -Fremdkosten -klingen -Chicago -Baum -sammeln -sehen -soviel -Horoskop -keiner -Pension -soweit -Quantensprung -intrinsisch -anno -Zge -Zeug -Wissenschaft -dass -loszulassen -brauchen -Lehrer -rufen -Lama -Sparen -grte -Kerl -enthalten -Flgel -Rabatt -ehrt -endlich -religis -Orchester -braten -Feedback -exemplarisch -Zitat -Recht -toll -Zusammenfassung -hervor -Eigentum -teuer -nichtkommerziell -benachbart -leider -Fahrzeug -glauben -putzen -gebt -begnstigen -Kasten -zuspitzen -meckern -organisation -loben -Anthropologie -Seminar -moralisch -Last -merken -Samen -kassieren -Bube -Engpass -Hopfen -Hirte -Gefngnis -Gedanke -bepacken -brillant -verrichtet -drohen -Katze -reif -Fossilien -gezeigt -Packen -persnlich -denen -wegweisend -Horror -Diplomat -Japan -pflanzlich -kaltbltig -Kunde -Geruch -Patriarch -Garnele -bedingungslos -Prinzip -Vergnglichkeit -strt -hinein -Tomate -halb -geplatzt -Theologe -Vogel -September -Steak -reprsentieren -heien -hoch -hinblick -Wunsch -frustriert -Fidel -Bldsinn -frh -Birne -Hlle -loslegen -jetzt -Biene -regnen -Celsius -hren -genommen -Fleisch -diejenigen -davon -vorrangig -sonst -herrschend -ertragen -Neuorientierung -nchsten -sozusagen -Sabbat -honorieren -verwirklichen -Mobbing -Annahme -Hgel -Bedeutung -Risiko -riskieren -ermglichen -hemmen -Frist -Klima -bse -sofern -Paul -vertieft -missionieren -zuvor -Nagel -backen -getauft -dazu -Blech -zufolge -Koch -immerwhrend -Regenwald -Finnland -altruistisch -grau -Oktober -Universitt -Philosoph -Ungarn -Wirtschaft -hinlnglich -Abteil -sperrt -aggressiv -Gast -externe -Saat -Zustand -losfliegen -egal -Dubai -aktiv -flattern -zunehmend -Bauweise -erreichen -Markus -gegrndet -zwlf -Rente -zwar -leicht -Fischer -Emotion -dunkel -Vision -fressen -dritter -athletisch -warum -Lage -bestimmt -Mitwirkender -Totenkopf -Qualitt -hegen -Ecke -erhalten -fuhr -Sklave -gettigt -belgen -gutmachen -breit -konnten -Obst -subventionieren -Pflicht -Planet -keimen -sogar -deshalb -Milch -Gesicht -zgern -fundamental -Zwang -typisch -gefunden -offen -Publikum -wieso -strukturell -Voraussetzung -umhin -Geduld -dient -Professor -wechseln -Minute -rmel -Konto -waren -Information -ganz -studieren -Reihenhaus -Henry -oftmals -Apfelbaum -reien -Labor -effektiv -Umfeld -sogenannten -Insolvenz -erzwingen -spter -funktionieren -Meile -extrem -Hallo -mitdenken -Heim -Praxis -lediglich -Kohle -inmitten -berichten -Soja -Firma -rasant -relativ -doof -Belgien -Rendite -Auge -abschreiben -Direktor -unsere -Abstze -plus -suchen -inklusive -somit -Spirit -verndern -Test -Bewohner -eindeutig -Strom -leiten -Zentralbank -Austausch -pickt -weise -Tourismus -spielen -Absicht -Beachtung -Spekulation -ernst -telefonieren -Trotz -Technologie -indigene -gelst -Thomas -Blte -Ferienjob -geteilt -Heinrich -gelangen -Situation -Kunst -Zufall -Haufen -geworden -Wurzel -Punkt -Temperatur -zukunftsfhig -Opfer -Josef -nutzen -Kauf -annehmen -Klaus -berauben -Griff -erdacht -neulich -gendert -besitzen -liberal -kopieren -superreich -bekommen -Kolumbus -Mangel -Steffi -Hase -bahnbrechend -Norbert -Karte -kreativ -unverndert -effizient -Historiker -anschlieend -Stichtag -These -nimmt -Finanzblase -wegnehmen -heutige -Hexe -Foliant -Flamme -Diktatur -klick -Mitleidenschaft -dick -vorliegend -verhindern -Klasse -uralt -Abfall -stoen -lernen -ethnisch -Eleganz -schmackhaft -helfen -Wind -Pfarrer -neueste -anfangen -Erich -ausatmen -Przision -Stck -aktuell -unproduktiv -dastehen -runter -Figaro -Internet -Gste -strflich -Angst -Bedarf -Ozonloch -Bioprodukte -mgen -Abraham -Sohn -Nebensitzer -zudem -Konzept -Russland -erzeugt -Stress -Hanau -Hugo -zehn -resultieren -Dach -junge -lehnen -Bewirtschaftung -gekommen -erproben -durch -Huser -gigantisch -unendlich -Wegfall -Irland -Reparatur -perfekt -Pilz -Zauberwort -Dorf -darin -absolut -Anbau -Dung -mssen -betreiben -sieht -investieren -Ansatz -Vorwort -ablegen -Verantwortung -gebaut -Dreck -Feld -explizit -Harmonie -Rangordnung -maximal -meiner -vereinigt -Hamburg -clever -global -unfreiwillig -tierisch -Bayern -Importgter -schenken -Donnerstag -Puffer -Rohstoff -britisch -Samuel -Handel -anstatt -Sprung -Dollar -Lsung -Engagement -Oberst -unmglich -Goethe -zehren -Humorist -neuartig -pltzlich -Graf -ging -intakt -tragen -nahm -zustzlich -Potenzial -beeinflussen -ziemlich -Beitrag -Fest -Hektik -beliebt -ergibt -ausbeuten -vorhanden -klagt -wegrationalisieren -bequem -werben -Welle -Spuren -decken -autistisch -Satz -musizieren -Umlaufbahn -ntzlich -simpel -sauber -Fortschritt -losgelst -bist -weder -ungnstig -Meer -treffen -peinlich -einnehmen -bewegte -notbedingt -benennen -Zugvogel -identisch -Infrastruktur -Blase -erfinden -modern -ghnen -Sportler -alte -aufs -Kampf -Nikolaus -frhlich -Stockwerk -Fabel -Brasilien -passend -abgeschaut -Pdagoge -militrisch -Spa -beugen -Einwohner -Ressourcen -Lunge -Discounter -insbesondere -lukrativ -blo -erarbeiten -Referat -Neuseeland -Rose -Abhngigkeit -Gnse -Duft -Pilot -vernachlssigt -Lausbub -Darsteller -Bezahlung -Wrtchen -Seele -altbekannt -Seil -Lothar -irgendwann -Ironie -Titel -zumindest -Aussage -bezwingen -Errungenschaft -Medaille -Uhren -unmittelbar -treten -richtung -wahr -mitverursachen -bilden -Tennisspielerin -jenseits -Mdchen -aber -Territorium -Fenchel -Spende -Definition -drauen -parallel -annimmt -allgemein -King -verbessert -sowohl -Methode -Affe -Dank -Versorgung -Staunen -Vorteil -gegangen -ansonsten -kommt -beim -Gefrierpunkt -senkt -Elster -unter -ther -niemand -dennoch -Zeit -Schriftsteller -klettern -boshaft -ohne -riesig -sorgfltig -Slums -Beschrnkung -Gehalt -hergestellt -Urlaub -Gabe -Kapazitt -werfen -suggerieren -Rolle -Guthaben -Hhle -nehmen -unfair -gemacht -Flur -kannst -Rassenkonflikte -Herbizide -Twitter -iPhone -Bausparkasse -entfalten -Vorbild -Orientale -erwidern -abrupt -mich -dein -Krieg -umkmpft -Kriterium -behaupten -Mitarbeiter -runden -Wort -hereinholen -beurteilen -Frieden -totalversagen -Africa -konfrontiert -Grn -sofort -ersten -Dotter -Facebook -gelingen -Unsinn -Arthur -umstellen -Kultur -Urmutter -Pyramide -Obsoleszenz -Biedermeier -gewehrt -heraus -ideal -ihnen -ausnahmslos -gerecht -satt -Inspiration -Sgemehl -jemanden -pflegen -Laden -optimieren -spazieren -mitnehmen -sondern -Nektar -anbringen -vorne -gnstig -Vorfall -blind -widerstehen -einpendeln -einmal -Krebs -Einleitung -Institut -desto -Alibi -Besen -auftreten -zuschauen -Haar -Baukasten -lieen -polar -Umsetzung -Millionr -prima -gilt -insgesamt -Wartung -inlndisch -reiten -befinden -bekannt -Niveau -Faktor -Antike -gutschreiben -antreiben -Drama -Floh -praktisch -unzhlig -heikel -leiblich -Augsburg -Keller -Abendessen -anheben -retten -schnell -erhlt -voriges -Wertschtzung -unntz -neunziger -Prozess -Flutwelle -umfangreich -Geld -haben -gekauft -se -zukommen -Querdenker -genmanipuliert -mde -Seerose -gewaltfrei -Fiat -Negativitt -faul -Datum -erfunden -gepachtet -sauer -bisher -wollen -Bonitt -erbringen -restlich -oben -Fu -Flotte -Robert -Phase -Inflation -tapfer -weinen -zeigen -hoffentlich -hingen -mutig -prfen -lustig -gravierend -Fondue -ehemalig -mitharbeiten -Steuern -Holland -stabil -dessen -Initiative -geblieben -nachfolgen -Befehl -Nordstern -dahinter -Gott -Erbsen -Unmenschlichkeit -Reise -euch -Papa -Ersatz -Bande -womit -gerne -auskommen -nahezu -Brcke -Kche -Traum -selten -manche -hkeln -Summe -wrdigen -einrumen -Lebzeiten -bitte -atmen -Licht -gekriegt -Neidisch -umso -Erde -Wolfgang -letzten -eignen -dezentral -genieen -klein -Sanft -pathologisch -anbieten -zugnglich -Flug -Bonus -regulieren -stolz -Zyklus -zerstren -fiel -Basis -delegieren -Legehenne -Leser -Fieber -wunderbar -Familie -Hippie -Gemeinschaft -Stunde -Zwergstaat -sagen -fokussieren -toxisch -psychologisch -fragen -Bach -zaudern -Lektorat -Ausland -Fackel -mehr -Datenbank -runzlig -erwhnen -Zimmerleute -Spuk -Preis -Einfhrung -gewidmet -talentiert -Gregor -Inhalt -Human -Sdafrika -Sozialabgaben -Erfllung -benutzt -Englisch -Nationalstaat -Krankheit -gnnen -unschtzbar -Fhigkeit -Tellerwscher -damit -bebauen -Ehre -Software -stirbt -Honig -Altlasten -zuwider -Hobby -murmeln -beziffern -degradieren -geformt -Zufriedenheit -erlaubt -Fluss -Ratgeber -Fernseher -Hesse -jammern -verzeihen -Wagen -Mahlzeit -Abwicklung -Lizenz -Umwelt -Papst -Wolke -Fontane -Weggefhrte -Flche -ausdrcklich -stetig -dumm -Webseite -besonders -signifikant -exakt -virtuell -weichen -hilft -Topmanager -dazwischen -dringend -herzlich -kaum -Haupt -gespielt -einher -Arzt -gewhnt -florieren -Anziehung -senden -Fichte -eingefhrt -Anlass -Locke -geboren -zuerst -mahnen -evolutionr -beien -Forelle -wenden -Umsatz -drucken -fhren -Pflock -Haiti -Miesmacher -Estland -Staatseinkommen -Motte -dort -aufhren -Konsum -gutwillig -Befrworter -Ketzer -Blick -Hhner -bunkern -erinnern -Fohlen -hatten -zwitschern -Gentechnik -Berlin -foppen -Gier -Leonardo -vterlich -Hhnchen -bereits -Designer -rebellieren -Ufer -auch -Htte -&bel -Eden -Hermann -ungewhnlich -Partei -gndig -womglich -Winter -anzetteln -vorprogrammiert -Fips -Flagge -zinslos -weil -bewahrt -Werk -Atom -Akademie -Anker -Sonne -derselbe -Sockel -Somalia -wann -erzhlen -Abstand -enorm -indem -etwas -Erasmus -vorkommen -Rede -Tokio -dreifach -halfen -Zivilisation -Luftfahrt -Endverbraucher -Mama -Angebot -Vorschlag -hart -lokal -Sorte -Prioritt -jedoch -gengend -dadurch -Branche -groartig -Regal -garantiert -unbewusst -Migrant -Auerhahn -David -strken -Erbe -notfalls -hindurch -wickeln -quasi -darf -comedy -gehen -Start -verdeckt -Dosis -Brezel -Element -Kurs -mter -leuchten -zwischen -Beileid -weiblich -Ruder -Zoologe -aushalten -neugeboren -spren -Ingwer -flieen -Idee -Samstag -trainieren -Flandern -Auffassung -ziehen -Masse -Nina -Arten -Gnade -Spezial -unkonventionell -Wald -Jugend -Busch -Fabian -dokumentieren -Felix -Film -belohnt -Gertrud -architektur -derzeitig -echt -Tagtraum -Margret -Objektivitt -Sieger -empfinden -Beamten -akzeptieren -laut -Sternenstaub -Stadt -Aristoteles -Ferrari -finden -Google -Westen -Fratze -Bauer -Kreislauf -wovon -Jrgen -gerade -Platz -Madonna -Zahnersatz -Marianne -euer -Privat -Schatten -hundert -besucht -aufwrts -dynamisch -Sahne -viel -Teufel -Gebrauchsanweisung -Gradido -sieben -Flucht -holen -baden -ndern -jngeren -Natur -chinesisch -Rohmaterial -Hauch -Konkurrenz -fiktiv -akkumulieren -Ball -beenden -bemht -recyclebar -gedruckt -vegetarisch -woran -erwerben -lasst -bleiben -Radfahrer -Bcher -Klavier -genannt -Quelle -erheblich -gegenseitig -abzahlen -stagnieren -Hubert -Ende -Crash -Trinkwasser -Franz -Insekt -sensibilisieren -Erneuerung -Sehnen -Maus -Frau -betonung -stiege -Porsche -beide -absurd -dato -sterreich -beteiligen -dies -gezwungen -anvertrauen -Tilgung -Feder -logisch -konventionell -fatal -kulinarisch -Abholzung -Cicero -nostalgischen -schtzen -brachte -Metzger -geehrt -Flasche -bringt -Villa -Krise -bietet -Entlastung -ausfhrung -Wikipedia -stellen -Park -Video -Papiergeld -voll -inzwischen -Jger -Topf -lzen -umgekehrt -Hanf -Februar -zirkulieren -John -heben -Novellierung -unfhig -servieren -Meier -jeweilig -Heuschrecke -daher -Alexander -Peter -erkannt -Gehirn -lateinisch -anpassbar -anderen -Artikel -Wucht -Leben -sein -exzellent -beantworten -Asche -reduzieren -Hersteller -Victor -zumal -Plage -hassen -fnf -liebevoll -fr -Acker -morphogenetisch -Sachverhalt -umpolen -gibt -Busfahrer -beherzigen -weitergeben -brav -jeder -sich -Galaxis -steht -Maschine -erzielen -Sanierung -Kraft -Netto -Begabung -ersetzen -mindest -gestorben -Osten -Gebiet -Zweifel -zugleich -wild -kameradschaftlich -Farbe -Mitmensch -bevlkern -gesamt -Mittel -Reporter -Kilometer -kostenlos -mobil -wehren -herunter -Ansehen -erfrischend -Hotel -Analyse -Griechisch -Abwurf -kuflich -Bernd -entgegengesetzt -Bewusstsein -ankaufen -zurzeit -Impressum -Toast -Ladung -Verftterung -Form -Wasser -gesund -noch -horchen -Variante -Anleitung -Pazifik -Wiederherstellung -Wandel -transformieren -Tisch -verknappt -Material -Realisierung -einer -Daimler -unvorstellbar -meldete -Strickmuster -stammen -Menge -Verifizieren -tief -Puzzle -Gepflogenheit -Ziel -drfen -doch -Sinn -Region -fangen -zuteil -Anspruch -kehrte -Freund -Fimmel -darum -Girokonto -Zweck -Wohngemeinschaft -Projekt -schweigen -Kupfer -tauchen -holzig -Tendenz -abhalten -Nummer -bald -Tne -Salvador -Kapitel -Ibiza -Komfort -wobei -lachen -Wagnis -metaphorisch -gelb -bevor -unnatrlich -Leasing -bemerkenswert -zugute -beruhen -soeben -Kopf -wischen -appellieren -gelten -statt -Futter -Erdball -bentigt -futsch -Symbol -wofr -Glanz -beispiellos -normalen -mitfinanzieren -Frucht -italienisch -woher -allzu -beleben -weigern -Senf -Gift -atemlos -Csar -Begegnung -horten -sobald -Luxus -biologisch -Wettbewerb -Umkehrschluss -fallen -Darlehen -klug -anpreisen -doppelt -abwechslungsreich -Werner -nannte -Wittenberg -existenzbedrohend -deren -zynisch -Feuer -Leistung -Ideologie -Enkel -diskutiert -pervers -Brot -Ordnung -blubbern -einander -College -folgen -Anreiz -Agrarflche -aufdecken -zerrinnen -ergrnden -spalten -unehelich -Experte -viertel -gezogen -Mitspieler -geklappt -Kette -Petrus -Nahrung -Georg -Patent -Unkenntlich -Waage -ernhren -Botschafter -hell -Zelle -Silbe -pfiffig -Mystisch -Acht -ahnen -erkmpft -Team -zunchst -Benzin -falsch -erwarten -raffen -Auflage -Thema -ernten -Monat -lindern -meisten -zurckerlangen -Fenster -unabhngig -Jesus -geistig -divers -Gttingen -unruhig -Kategorie -fassen -hinzu -Wachstum -Sven -Chemie -qulen -Herde -standen -jhrlich -Anhang -ntig -Hirsch -derjenige -Kurzgeschichte -kologische -Theater -willkommen -ausben -Kanal -nennt -Name -wussten -drcken -aufnehmen -ste -Rcken -intuition -htte -Zunahme -Glubiger -abzhlen -Phnomen -Ablage -spontan -spannend -Vanessa -Asien -gewusst -elektronisch -derb -getilgt -Antwort -geeignet -Bote -geqult -Anerkennung -Bilanz -natrlich -machbar -Verpackung -Blut -Eltern -Himbeere -rumfliegen -Senioren -zwingen -Spitze -Taschendiebe -steckt -Monster -Egotrip -Helmut -Bibel -geerbt -zitieren -Ameisenbau -Rekordgewinne -Hnde -ergnzen -danach -orden -hinter -wenn -paddeln -gutes -Hinsicht -wegen -Teilhabe -Gesellschaft -christlich -Bezugsquelle -Igor -ausprobieren -Endpreis -links -gekrzt -einkaufen -Lied -Gerhard -gelohnt -nackt -Geburt -gelehrt -einseitig -gedeckt -hinweg -Eduard -Premiere -demografisch -ihre -hchste -wichtigsten -Aufmerksamkeit -Horde -physisch -Arbeitsklima -Brief -Notdurft -proportional -fordern -Ewig -denken -Daniel -Arabisch -edle -golden -Minimum -pure -beibringen -Boden -Anzahl -erschaffen -Energie -sehr -Gercht -Generation -Ruber -Motivation -Chance -dabei -Programm -segensreich -April -ignorieren -Nase -epochal -Boot -faszinieren -Heilkunde -Helikopter -Computer -Kabarettist -wenig -zuknftig -sechzehn -stimmt -getragen -reagieren -Esoterik -Koralle -Dame -Katastrophe -liefern -Grund -Elend -ausreichen -Notenbank -Garten -zutiefst -Immobilien -Aspekt -naiv -besprechen -zhlen -Terminologie -Amerika -Atmosphre -Iran -debatte -Sound -Zugang -fair -unrentabel -baut -kollektiv -schief -Bank -Mann -Apropos -Ergebnis -Niederlande -Mietshaus -errichten -Ereignis -Portal -erhielten -erleben -Haus -Dschungel -Null -Pleite -Seegras -Entdeckung -also -Ebene -Anbeginn -kohrent -Autor -Mensch -hielt -Reich -Land -bekloppt -auerdem -Berg -gleich -sind -Argument -einverstanden -Euro -Sektor -dagegen -Knappheit -Armut -innerhalb -Blume -Problem -Bruder -Netzwerk -Orte -bedrngen -Aufgabe diff --git a/backend/src/config/mnemonic.words_ulf_org.txt b/backend/src/config/mnemonic.words_ulf_org.txt deleted file mode 100644 index d0f96c49c..000000000 --- a/backend/src/config/mnemonic.words_ulf_org.txt +++ /dev/null @@ -1,2048 +0,0 @@ -Monumental -Volksbank -Beeren -huschen -leer -Haft -saagut -Positiv -daran -solide -dauerhaft -zahlungsfähig -beinhalten -weglassen -Ausmaß -irrtümlich -Impuls -darüber -Abriss -setzten -Herkunft -manipulierbar -anfängt -anliegen -Mutter -Beobachter -Zeichner -dran -genug -Medikament -Tanten -behindern -Johannes -Rand -Illusion -anzuwenden -Fehler -erniedrigen -gehören -Güte -unangenehm -Horst -Koordination -weltweit -geprägt -unerlässlich -einig -mitbringen -Dieb -dann -Karriere -Ethik -dich -Ursachen -beglücken -Wahl -dermaßen -spritzen -erbittert -Maler -täglich -Wohlstand -hübsch -Klarheit -voneinander -berühmt -Iris -plausibel -verlagern -Lauf -Foyer -Idol -spreizen -Hölderlin -Grenze -Code -Dogma -langfristig -Urzustand -verursacht -Fasching -Finger -König -barbarisch -einbringen -Disziplin -angreifen -speichern -Urheberrecht -ermorden -Diana -Auswirkung -beginnen -kooperativ -Ahnung -allen -bisschen -durften -Prostitution -Strahlen -Umschwung -Foto -taten -Mechanismus -Urvertrauen -Chef -feminin -nirgendwo -Absatzmarkt -welches -Entwicklung -gearbeitet -erblühen -umtauschen -Aufklärung -online -produktiv -Pest -Coach -Anblick -ursprünglich -schon -solange -eventuell -Tatsache -erforderlich -Buch -derartig -werden -auseinander -halten -Maurer -Himmel -Loch -Forum -Kluft -aufbauen -bricht -permanent -saugen -exponential -Fetzen -Mord -unausweichlich -untrennbar -skeptisch -geschützt -Gebäude -Butter -bezeichnet -Daunen -Journalist -ehrgeizig -System -Zugriff -Anwalt -Krone -ankommt -zulassen -Stufenplan -Raum -Sanktion -Währung -Tradition -Money -dafür -Gruppe -solch -geben -geholfen -frei -Rahmen -Rasen -feindlich -Wirklichkeit -Unheil -luden -Ausgleich -leugnen -erklärt -Vater -Ingenieur -Erfahrung -Stil -dörren -wozu -befassen -gemäß -Apotheke -Vegan -simultan -wehen -gang -immateriell -Wilhelm -fertig -kennen -korrigieren -Jahr -Industrie -hier -Glück -Anton -Bionik -abwaschen -Hannes -Diamant -Anweisung -angleichen -Fördern -Helene -glasklar -Abgaben -beflügeln -Trennung -Ziegler -überhaupt -Guido -rotieren -treiben -sowie -Begründung -Erdöl -selig -jegliche -belastbar -ehrlich -Eier -Schulden -Brutto -Paar -Sitz -hast -annähern -Neigung -Menü -messbar -vervollständigt -Erkenntnis -pendeln -Edwin -römisch -entstehen -Gefahr -Resonanz -ungleich -Sprache -Tsunami -Bindung -Sympathie -Bomber -Schlusswort -bislang -befreien -fegen -drastisch -greift -obwohl -bewährt -Jörg -drehen -Quartett -Betätigung -Szene -Kinder -Respekt -Empathie -eher -unwichtig -besser -nein -Kredit -liegen -zulegen -Forschung -Hurrikan -wesentlich -Deutschland -eintauchen -entzünden -betteln -Islam -Rohre -Müll -Tage -sinken -Hunger -fungieren -Radio -Lohn -lenken -Container -marode -gering -Ozean -Revolution -Meter -tausend -Kalkulation -blau -Hautfarbe -Kurt -Ding -Mathematiker -jene -renovieren -Popstar -auferlegen -unübersichtlich -fantasievoll -Bedürfnisse -Maßstab -Feier -Onkel -essen -Stein -einzeln -Woche -Sekunde -Phantasie -Blockade -Chip -Moment -lüften -Jasmin -aufrecht -eisern -oder -Fachsprache -Komponist -Vermögen -allmählich -Urwissen -selbstregulierend -Brust -Leute -Gegner -Pause -unqualifiziert -August -Umdrehung -wegdenken -gucken -leihen -vordringen -Durst -Seite -fast -hinaus -Binnenland -Bund -sollt -Albert -Smartphone -Kriminalität -Protest -Fremdkosten -klingen -Chicago -Baum -sammeln -sehen -soviel -Horoskop -keiner -Pension -soweit -Quantensprung -intrinsisch -anno -Züge -Zeug -Wissenschaft -dass -loszulassen -brauchen -Lehrer -rufen -Lama -Sparen -größte -Kerl -enthalten -Flügel -Rabatt -ehrt -endlich -religiös -Orchester -braten -Feedback -exemplarisch -Zitat -Recht -toll -Zusammenfassung -hervor -Eigentum -teuer -nichtkommerziell -benachbart -leider -Fahrzeug -glauben -putzen -geübt -begünstigen -Kasten -zuspitzen -meckern -organisation -loben -Anthropologie -Seminar -moralisch -Last -merken -Samen -kassieren -Bube -Engpass -Hopfen -Hirte -Gefängnis -Gedanke -bepacken -brillant -verrichtet -drohen -Katze -reif -Fossilien -gezeigt -Packen -persönlich -denen -wegweisend -Horror -Diplomat -Japan -pflanzlich -kaltblütig -Kunde -Geruch -Patriarch -Garnele -bedingungslos -Prinzip -Vergänglichkeit -stört -hinein -Tomate -halb -geplatzt -Theologe -Vogel -September -Steak -repräsentieren -heißen -hoch -hinblick -Wunsch -frustriert -Fidel -Blödsinn -früh -Birne -Hülle -loslegen -jetzt -Biene -regnen -Celsius -hören -genommen -Fleisch -diejenigen -davon -vorrangig -sonst -herrschend -ertragen -Neuorientierung -nächsten -sozusagen -Sabbat -honorieren -verwirklichen -Mobbing -Annahme -Hügel -Bedeutung -Risiko -riskieren -ermöglichen -hemmen -Frist -Klima -böse -sofern -Paul -vertieft -missionieren -zuvor -Nagel -backen -getauft -dazu -Blech -zufolge -Koch -immerwährend -Regenwald -Finnland -altruistisch -grau -Oktober -Universität -Philosoph -Ungarn -Wirtschaft -hinlänglich -Abteil -sperrt -aggressiv -Gast -externe -Saat -Zustand -losfliegen -egal -Dubai -aktiv -flattern -zunehmend -Bauweise -erreichen -Markus -gegründet -zwölf -Rente -zwar -leicht -Fischer -Emotion -dunkel -Vision -fressen -dritter -athletisch -warum -Lage -bestimmt -Mitwirkender -Totenkopf -Qualität -hegen -Ecke -erhalten -fuhr -Sklave -getätigt -belügen -gutmachen -breit -konnten -Obst -subventionieren -Pflicht -Planet -keimen -sogar -deshalb -Milch -Gesicht -zögern -fundamental -Zwang -typisch -gefunden -offen -Publikum -wieso -strukturell -Voraussetzung -umhin -Geduld -dient -Professor -wechseln -Minute -Ärmel -Konto -waren -Information -ganz -studieren -Reihenhaus -Henry -oftmals -Apfelbaum -reißen -Labor -effektiv -Umfeld -sogenannten -Insolvenz -erzwingen -später -funktionieren -Meile -extrem -Hallo -mitdenken -Heim -Praxis -lediglich -Kohle -inmitten -berichten -Soja -Firma -rasant -relativ -doof -Belgien -Rendite -Auge -abschreiben -Direktor -unsere -Absätze -plus -suchen -inklusive -somit -Spirit -verändern -Test -Bewohner -eindeutig -Strom -leiten -Zentralbank -Austausch -pickt -weise -Tourismus -spielen -Absicht -Beachtung -Spekulation -ernst -telefonieren -Trotz -Technologie -indigene -gelöst -Thomas -Blüte -Ferienjob -geteilt -Heinrich -gelangen -Situation -Kunst -Zufall -Haufen -geworden -Wurzel -Punkt -Temperatur -zukunftsfähig -Opfer -Josef -nutzen -Kauf -annehmen -Klaus -berauben -Griff -erdacht -neulich -geändert -besitzen -liberal -kopieren -superreich -bekommen -Kolumbus -Mangel -Steffi -Hase -bahnbrechend -Norbert -Karte -kreativ -unverändert -effizient -Historiker -anschließend -Stichtag -These -nimmt -Finanzblase -wegnehmen -heutige -Hexe -Foliant -Flamme -Diktatur -klick -Mitleidenschaft -dick -vorliegend -verhindern -Klasse -uralt -Abfall -stoßen -lernen -ethnisch -Eleganz -schmackhaft -helfen -Wind -Pfarrer -neueste -anfangen -Erich -ausatmen -Präzision -Stück -aktuell -unproduktiv -dastehen -runter -Figaro -Internet -Gäste -sträflich -Angst -Bedarf -Ozonloch -Bioprodukte -mögen -Abraham -Sohn -Nebensitzer -zudem -Konzept -Russland -erzeugt -Stress -Hanau -Hugo -zehn -resultieren -Dach -junge -lehnen -Bewirtschaftung -gekommen -erproben -durch -Häuser -gigantisch -unendlich -Wegfall -Irland -Reparatur -perfekt -Pilz -Zauberwort -Dorf -darin -absolut -Anbau -Dung -müssen -betreiben -sieht -investieren -Ansatz -Vorwort -ablegen -Verantwortung -gebaut -Dreck -Feld -explizit -Harmonie -Rangordnung -maximal -meiner -vereinigt -Hamburg -clever -global -unfreiwillig -tierisch -Bayern -Importgüter -schenken -Donnerstag -Puffer -Rohstoff -britisch -Samuel -Handel -anstatt -Sprung -Dollar -Lösung -Engagement -Oberst -unmöglich -Goethe -zehren -Humorist -neuartig -plötzlich -Graf -ging -intakt -tragen -nahm -zusätzlich -Potenzial -beeinflussen -ziemlich -Beitrag -Fest -Hektik -beliebt -ergibt -ausbeuten -vorhanden -klagt -wegrationalisieren -bequem -werben -Welle -Spuren -decken -autistisch -Satz -musizieren -Umlaufbahn -nützlich -simpel -sauber -Fortschritt -losgelöst -bist -weder -ungünstig -Meer -treffen -peinlich -einnehmen -bewegte -notbedingt -benennen -Zugvogel -identisch -Infrastruktur -Blase -erfinden -modern -gähnen -Sportler -alte -aufs -Kampf -Nikolaus -fröhlich -Stockwerk -Fabel -Brasilien -passend -abgeschaut -Pädagoge -militärisch -Spaß -beugen -Einwohner -Ressourcen -Lunge -Discounter -insbesondere -lukrativ -bloß -erarbeiten -Referat -Neuseeland -Rose -Abhängigkeit -Gänse -Duft -Pilot -vernachlässigt -Lausbub -Darsteller -Bezahlung -Wörtchen -Seele -altbekannt -Seil -Lothar -irgendwann -Ironie -Titel -zumindest -Aussage -bezwingen -Errungenschaft -Medaille -Uhren -unmittelbar -treten -richtung -wahr -mitverursachen -bilden -Tennisspielerin -jenseits -Mädchen -aber -Territorium -Fenchel -Spende -Definition -draußen -parallel -annimmt -allgemein -King -verbessert -sowohl -Methode -Affe -Dank -Versorgung -Staunen -Vorteil -gegangen -ansonsten -kommt -beim -Gefrierpunkt -senkt -Elster -unter -Äther -niemand -dennoch -Zeit -Schriftsteller -klettern -boshaft -ohne -riesig -sorgfältig -Slums -Beschränkung -Gehalt -hergestellt -Urlaub -Gabe -Kapazität -werfen -suggerieren -Rolle -Guthaben -Höhle -nehmen -unfair -gemacht -Flur -kannst -Rassenkonflikte -Herbizide -Twitter -iPhone -Bausparkasse -entfalten -Vorbild -Orientale -erwidern -abrupt -mich -dein -Krieg -umkämpft -Kriterium -behaupten -Mitarbeiter -runden -Wort -hereinholen -beurteilen -Frieden -totalversagen -Africa -konfrontiert -Grün -sofort -ersten -Dotter -Facebook -gelingen -Unsinn -Arthur -umstellen -Kultur -Urmutter -Pyramide -Obsoleszenz -Biedermeier -gewehrt -heraus -ideal -ihnen -ausnahmslos -gerecht -satt -Inspiration -Sägemehl -jemanden -pflegen -Laden -optimieren -spazieren -mitnehmen -sondern -Nektar -anbringen -vorne -günstig -Vorfall -blind -widerstehen -einpendeln -einmal -Krebs -Einleitung -Institut -desto -Alibi -Besen -auftreten -zuschauen -Haar -Baukasten -ließen -polar -Umsetzung -Millionär -prima -gilt -insgesamt -Wartung -inländisch -reiten -befinden -bekannt -Niveau -Faktor -Antike -gutschreiben -antreiben -Drama -Floh -praktisch -unzählig -heikel -leiblich -Augsburg -Keller -Abendessen -anheben -retten -schnell -erhält -voriges -Wertschätzung -unnütz -neunziger -Prozess -Flutwelle -umfangreich -Geld -haben -gekauft -Öse -zukommen -Querdenker -genmanipuliert -müde -Seerose -gewaltfrei -Fiat -Negativität -faul -Datum -erfunden -gepachtet -sauer -bisher -wollen -Bonität -erbringen -restlich -oben -Fuß -Flotte -Robert -Phase -Inflation -tapfer -weinen -zeigen -hoffentlich -hingen -mutig -prüfen -lustig -gravierend -Fondue -ehemalig -mitharbeiten -Steuern -Holland -stabil -dessen -Initiative -geblieben -nachfolgen -Befehl -Nordstern -dahinter -Gott -Erbsen -Unmenschlichkeit -Reise -euch -Papa -Ersatz -Bande -womit -gerne -auskommen -nahezu -Brücke -Küche -Traum -selten -manche -häkeln -Summe -würdigen -einräumen -Lebzeiten -bitte -atmen -Licht -gekriegt -Neidisch -umso -Erde -Wolfgang -letzten -eignen -dezentral -genießen -klein -Sanft -pathologisch -anbieten -zugänglich -Flug -Bonus -regulieren -stolz -Zyklus -zerstören -fiel -Basis -delegieren -Legehenne -Leser -Fieber -wunderbar -Familie -Hippie -Gemeinschaft -Stunde -Zwergstaat -sagen -fokussieren -toxisch -psychologisch -fragen -Bach -zaudern -Lektorat -Ausland -Fackel -mehr -Datenbank -runzlig -erwähnen -Zimmerleute -Spuk -Preis -Einführung -gewidmet -talentiert -Gregor -Inhalt -Human -Südafrika -Sozialabgaben -Erfüllung -benutzt -Englisch -Nationalstaat -Krankheit -gönnen -unschätzbar -Fähigkeit -Tellerwäscher -damit -bebauen -Ehre -Software -stirbt -Honig -Altlasten -zuwider -Hobby -murmeln -beziffern -degradieren -geformt -Zufriedenheit -erlaubt -Fluss -Ratgeber -Fernseher -Hesse -jammern -verzeihen -Wagen -Mahlzeit -Abwicklung -Lizenz -Umwelt -Papst -Wolke -Fontane -Weggefährte -Fläche -ausdrücklich -stetig -dumm -Webseite -besonders -signifikant -exakt -virtuell -weichen -hilft -Topmanager -dazwischen -dringend -herzlich -kaum -Haupt -gespielt -einher -Arzt -gewöhnt -florieren -Anziehung -senden -Fichte -eingeführt -Anlass -Locke -geboren -zuerst -mahnen -evolutionär -beißen -Forelle -wenden -Umsatz -drucken -führen -Pflock -Haiti -Miesmacher -Estland -Staatseinkommen -Motte -dort -aufhören -Konsum -gutwillig -Befürworter -Ketzer -Blick -Hühner -bunkern -erinnern -Fohlen -hatten -zwitschern -Gentechnik -Berlin -foppen -Gier -Leonardo -väterlich -Hähnchen -bereits -Designer -rebellieren -Ufer -auch -Hütte -Übel -Eden -Hermann -ungewöhnlich -Partei -gnädig -womöglich -Winter -anzetteln -vorprogrammiert -Fips -Flagge -zinslos -weil -bewahrt -Werk -Atom -Akademie -Anker -Sonne -derselbe -Sockel -Somalia -wann -erzählen -Abstand -enorm -indem -etwas -Erasmus -vorkommen -Rede -Tokio -dreifach -halfen -Zivilisation -Luftfahrt -Endverbraucher -Mama -Angebot -Vorschlag -hart -lokal -Sorte -Priorität -jedoch -genügend -dadurch -Branche -großartig -Regal -garantiert -unbewusst -Migrant -Auerhahn -David -stärken -Erbe -notfalls -hindurch -wickeln -quasi -darf -comedy -gehen -Start -verdeckt -Dosis -Brezel -Element -Kurs -Ämter -leuchten -zwischen -Beileid -weiblich -Ruder -Zoologe -aushalten -neugeboren -spüren -Ingwer -fließen -Idee -Samstag -trainieren -Flandern -Auffassung -ziehen -Masse -Nina -Arten -Gnade -Spezial -unkonventionell -Wald -Jugend -Busch -Fabian -dokumentieren -Felix -Film -belohnt -Gertrud -architektur -derzeitig -echt -Tagtraum -Margret -Objektivität -Sieger -empfinden -Beamten -akzeptieren -laut -Sternenstaub -Stadt -Aristoteles -Ferrari -finden -Google -Westen -Fratze -Bauer -Kreislauf -wovon -Jürgen -gerade -Platz -Madonna -Zahnersatz -Marianne -euer -Privat -Schatten -hundert -besucht -aufwärts -dynamisch -Sahne -viel -Teufel -Gebrauchsanweisung -Gradido -sieben -Flucht -holen -baden -ändern -jüngeren -Natur -chinesisch -Rohmaterial -Hauch -Konkurrenz -fiktiv -akkumulieren -Ball -beenden -bemüht -recyclebar -gedruckt -vegetarisch -woran -erwerben -lasst -bleiben -Radfahrer -Bücher -Klavier -genannt -Quelle -erheblich -gegenseitig -abzahlen -stagnieren -Hubert -Ende -Crash -Trinkwasser -Franz -Insekt -sensibilisieren -Erneuerung -Sehnen -Maus -Frau -betonung -stiege -Porsche -beide -absurd -dato -Österreich -beteiligen -dies -gezwungen -anvertrauen -Tilgung -Feder -logisch -konventionell -fatal -kulinarisch -Abholzung -Cicero -nostalgischen -schützen -brachte -Metzger -geehrt -Flasche -bringt -Villa -Krise -bietet -Entlastung -ausführung -Wikipedia -stellen -Park -Video -Papiergeld -voll -inzwischen -Jäger -Topf -ülzen -umgekehrt -Hanf -Februar -zirkulieren -John -heben -Novellierung -unfähig -servieren -Meier -jeweilig -Heuschrecke -daher -Alexander -Peter -erkannt -Gehirn -lateinisch -anpassbar -anderen -Artikel -Wucht -Leben -sein -exzellent -beantworten -Asche -reduzieren -Hersteller -Victor -zumal -Plage -hassen -fünf -liebevoll -für -Acker -morphogenetisch -Sachverhalt -umpolen -gibt -Busfahrer -beherzigen -weitergeben -brav -jeder -sich -Galaxis -steht -Maschine -erzielen -Sanierung -Kraft -Netto -Begabung -ersetzen -mindest -gestorben -Osten -Gebiet -Zweifel -zugleich -wild -kameradschaftlich -Farbe -Mitmensch -bevölkern -gesamt -Mittel -Reporter -Kilometer -kostenlos -mobil -wehren -herunter -Ansehen -erfrischend -Hotel -Analyse -Griechisch -Abwurf -käuflich -Bernd -entgegengesetzt -Bewusstsein -ankaufen -zurzeit -Impressum -Toast -Ladung -Verfütterung -Form -Wasser -gesund -noch -horchen -Variante -Anleitung -Pazifik -Wiederherstellung -Wandel -transformieren -Tisch -verknappt -Material -Realisierung -einer -Daimler -unvorstellbar -meldete -Strickmuster -stammen -Menge -Verifizieren -tief -Puzzle -Gepflogenheit -Ziel -dürfen -doch -Sinn -Region -fangen -zuteil -Anspruch -kehrte -Freund -Fimmel -darum -Girokonto -Zweck -Wohngemeinschaft -Projekt -schweigen -Kupfer -tauchen -holzig -Tendenz -abhalten -Nummer -bald -Töne -Salvador -Kapitel -Ibiza -Komfort -wobei -lachen -Wagnis -metaphorisch -gelb -bevor -unnatürlich -Leasing -bemerkenswert -zugute -beruhen -soeben -Kopf -wischen -appellieren -gelten -statt -Futter -Erdball -benötigt -futsch -Symbol -wofür -Glanz -beispiellos -normalen -mitfinanzieren -Frucht -italienisch -woher -allzu -beleben -weigern -Senf -Gift -atemlos -Cäsar -Begegnung -horten -sobald -Luxus -biologisch -Wettbewerb -Umkehrschluss -fallen -Darlehen -klug -anpreisen -doppelt -abwechslungsreich -Werner -nannte -Wittenberg -existenzbedrohend -deren -zynisch -Feuer -Leistung -Ideologie -Enkel -diskutiert -pervers -Brot -Ordnung -blubbern -einander -College -folgen -Anreiz -Agrarfläche -aufdecken -zerrinnen -ergründen -spalten -unehelich -Experte -viertel -gezogen -Mitspieler -geklappt -Kette -Petrus -Nahrung -Georg -Patent -Unkenntlich -Waage -ernähren -Botschafter -hell -Zelle -Silbe -pfiffig -Mystisch -Acht -ahnen -erkämpft -Team -zunächst -Benzin -falsch -erwarten -raffen -Auflage -Thema -ernten -Monat -lindern -meisten -zurückerlangen -Fenster -unabhängig -Jesus -geistig -divers -Göttingen -unruhig -Kategorie -fassen -hinzu -Wachstum -Sven -Chemie -quälen -Herde -standen -jährlich -Anhang -nötig -Hirsch -derjenige -Kurzgeschichte -ökologische -Theater -willkommen -ausüben -Kanal -nennt -Name -wussten -drücken -aufnehmen -Äste -Rücken -intuition -hätte -Zunahme -Gläubiger -abzählen -Phänomen -Ablage -spontan -spannend -Vanessa -Asien -gewusst -elektronisch -derb -getilgt -Antwort -geeignet -Bote -gequält -Anerkennung -Bilanz -natürlich -machbar -Verpackung -Blut -Eltern -Himbeere -rumfliegen -Senioren -zwingen -Spitze -Taschendiebe -steckt -Monster -Egotrip -Helmut -Bibel -geerbt -zitieren -Ameisenbau -Rekordgewinne -Hände -ergänzen -danach -orden -hinter -wenn -paddeln -gutes -Hinsicht -wegen -Teilhabe -Gesellschaft -christlich -Bezugsquelle -Igor -ausprobieren -Endpreis -links -gekürzt -einkaufen -Lied -Gerhard -gelohnt -nackt -Geburt -gelehrt -einseitig -gedeckt -hinweg -Eduard -Premiere -demografisch -ihre -höchste -wichtigsten -Aufmerksamkeit -Horde -physisch -Arbeitsklima -Brief -Notdurft -proportional -fordern -Ewig -denken -Daniel -Arabisch -edle -golden -Minimum -pure -beibringen -Boden -Anzahl -erschaffen -Energie -sehr -Gerücht -Generation -Räuber -Motivation -Chance -dabei -Programm -segensreich -April -ignorieren -Nase -epochal -Boot -faszinieren -Heilkunde -Helikopter -Computer -Kabarettist -wenig -zukünftig -sechzehn -stimmt -getragen -reagieren -Esoterik -Koralle -Dame -Katastrophe -liefern -Grund -Elend -ausreichen -Notenbank -Garten -zutiefst -Immobilien -Aspekt -naiv -besprechen -zählen -Terminologie -Amerika -Atmosphäre -Iran -debatte -Sound -Zugang -fair -unrentabel -baut -kollektiv -schief -Bank -Mann -Apropos -Ergebnis -Niederlande -Mietshaus -errichten -Ereignis -Portal -erhielten -erleben -Haus -Dschungel -Null -Pleite -Seegras -Entdeckung -also -Ebene -Anbeginn -kohärent -Autor -Mensch -hielt -Reich -Land -bekloppt -außerdem -Berg -gleich -sind -Argument -einverstanden -Euro -Sektor -dagegen -Knappheit -Armut -innerhalb -Blume -Problem -Bruder -Netzwerk -Orte -bedrängen -Aufgabe diff --git a/backend/src/graphql/arg/CheckUsernameArgs.ts b/backend/src/graphql/arg/CheckUsernameArgs.ts deleted file mode 100644 index 64265b64e..000000000 --- a/backend/src/graphql/arg/CheckUsernameArgs.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ArgsType, Field } from 'type-graphql' - -@ArgsType() -export default class CheckUsernameArgs { - @Field(() => String) - username: string -} diff --git a/backend/src/graphql/arg/CreateUserArgs.ts b/backend/src/graphql/arg/CreateUserArgs.ts index 0d63e76bb..af915b91a 100644 --- a/backend/src/graphql/arg/CreateUserArgs.ts +++ b/backend/src/graphql/arg/CreateUserArgs.ts @@ -16,4 +16,7 @@ export default class CreateUserArgs { @Field(() => Int, { nullable: true }) publisherId: number + + @Field(() => String, { nullable: true }) + redeemCode?: string | null } diff --git a/backend/src/graphql/arg/Paginated.ts b/backend/src/graphql/arg/Paginated.ts index 85853a1c7..97326caf2 100644 --- a/backend/src/graphql/arg/Paginated.ts +++ b/backend/src/graphql/arg/Paginated.ts @@ -1,5 +1,5 @@ import { ArgsType, Field, Int } from 'type-graphql' -import { Order } from '../enum/Order' +import { Order } from '@enum/Order' @ArgsType() export default class Paginated { @@ -11,10 +11,4 @@ export default class Paginated { @Field(() => Order, { nullable: true }) order?: Order - - @Field(() => Boolean, { nullable: true }) - onlyCreations?: boolean - - @Field(() => Int, { nullable: true }) - userId?: number } diff --git a/backend/src/graphql/arg/SearchUsersArgs.ts b/backend/src/graphql/arg/SearchUsersArgs.ts new file mode 100644 index 000000000..52da77852 --- /dev/null +++ b/backend/src/graphql/arg/SearchUsersArgs.ts @@ -0,0 +1,19 @@ +import { ArgsType, Field, Int } from 'type-graphql' + +@ArgsType() +export default class SearchUsersArgs { + @Field(() => String) + searchText: string + + @Field(() => Int, { nullable: true }) + currentPage?: number + + @Field(() => Int, { nullable: true }) + pageSize?: number + + @Field(() => Boolean, { nullable: true }) + notActivated?: boolean + + @Field(() => Boolean, { nullable: true }) + isDeleted?: boolean +} diff --git a/backend/src/graphql/arg/TransactionLinkArgs.ts b/backend/src/graphql/arg/TransactionLinkArgs.ts new file mode 100644 index 000000000..553efcfbe --- /dev/null +++ b/backend/src/graphql/arg/TransactionLinkArgs.ts @@ -0,0 +1,11 @@ +import { ArgsType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' + +@ArgsType() +export default class TransactionLinkArgs { + @Field(() => Decimal) + amount: Decimal + + @Field(() => String) + memo: string +} diff --git a/backend/src/graphql/arg/TransactionSendArgs.ts b/backend/src/graphql/arg/TransactionSendArgs.ts index cf4e43d94..e75921383 100644 --- a/backend/src/graphql/arg/TransactionSendArgs.ts +++ b/backend/src/graphql/arg/TransactionSendArgs.ts @@ -1,12 +1,13 @@ import { ArgsType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' @ArgsType() export default class TransactionSendArgs { @Field(() => String) email: string - @Field(() => Number) - amount: number + @Field(() => Decimal) + amount: Decimal @Field(() => String) memo: string diff --git a/backend/src/graphql/arg/UpdateUserInfosArgs.ts b/backend/src/graphql/arg/UpdateUserInfosArgs.ts index dca9ec4ab..d1e95ebef 100644 --- a/backend/src/graphql/arg/UpdateUserInfosArgs.ts +++ b/backend/src/graphql/arg/UpdateUserInfosArgs.ts @@ -8,12 +8,6 @@ export default class UpdateUserInfosArgs { @Field({ nullable: true }) lastName?: string - @Field({ nullable: true }) - description?: string - - @Field({ nullable: true }) - username?: string - @Field({ nullable: true }) language?: string diff --git a/backend/src/graphql/directive/isAuthorized.ts b/backend/src/graphql/directive/isAuthorized.ts index 19cd7bcdb..84756c45a 100644 --- a/backend/src/graphql/directive/isAuthorized.ts +++ b/backend/src/graphql/directive/isAuthorized.ts @@ -2,35 +2,45 @@ import { AuthChecker } from 'type-graphql' -import { decode, encode } from '../../auth/JWT' -import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '../../auth/ROLES' -import { RIGHTS } from '../../auth/RIGHTS' -import { ServerUserRepository } from '../../typeorm/repository/ServerUser' -import { getCustomRepository } from 'typeorm' -import { UserRepository } from '../../typeorm/repository/User' +import { decode, encode } from '@/auth/JWT' +import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '@/auth/ROLES' +import { RIGHTS } from '@/auth/RIGHTS' +import { getCustomRepository } from '@dbTools/typeorm' +import { UserRepository } from '@repository/User' +import { INALIENABLE_RIGHTS } from '@/auth/INALIENABLE_RIGHTS' +import { ServerUser } from '@entity/ServerUser' const isAuthorized: AuthChecker = async ({ context }, rights) => { context.role = ROLE_UNAUTHORIZED // unauthorized user - // Do we have a token? - if (context.token) { - const decoded = decode(context.token) - if (!decoded) { - // we always throw on an invalid token - throw new Error('403.13 - Client certificate revoked') - } - // Set context pubKey - context.pubKey = Buffer.from(decoded.pubKey).toString('hex') - // set new header token - // TODO - load from database dynamically & admin - maybe encode this in the token to prevent many database requests - // TODO this implementation is bullshit - two database queries cause our user identifiers are not aligned and vary between email, id and pubKey - const userRepository = await getCustomRepository(UserRepository) - const user = await userRepository.findByPubkeyHex(context.pubKey) - const serverUserRepository = await getCustomRepository(ServerUserRepository) - const countServerUsers = await serverUserRepository.count({ email: user.email }) - context.role = countServerUsers > 0 ? ROLE_ADMIN : ROLE_USER + // is rights an inalienable right? + if ((rights).reduce((acc, right) => acc && INALIENABLE_RIGHTS.includes(right), true)) + return true - context.setHeaders.push({ key: 'token', value: encode(decoded.pubKey) }) + // Do we have a token? + if (!context.token) { + throw new Error('401 Unauthorized') + } + + // Decode the token + const decoded = decode(context.token) + if (!decoded) { + throw new Error('403.13 - Client certificate revoked') + } + // Set context pubKey + context.pubKey = Buffer.from(decoded.pubKey).toString('hex') + + // TODO - load from database dynamically & admin - maybe encode this in the token to prevent many database requests + // TODO this implementation is bullshit - two database queries cause our user identifiers are not aligned and vary between email, id and pubKey + const userRepository = await getCustomRepository(UserRepository) + try { + const user = await userRepository.findByPubkeyHex(context.pubKey) + context.user = user + const countServerUsers = await ServerUser.count({ email: user.email }) + context.role = countServerUsers > 0 ? ROLE_ADMIN : ROLE_USER + } catch { + // in case the database query fails (user deleted) + throw new Error('401 Unauthorized') } // check for correct rights @@ -39,6 +49,8 @@ const isAuthorized: AuthChecker = async ({ context }, rights) => { throw new Error('401 Unauthorized') } + // set new header token + context.setHeaders.push({ key: 'token', value: encode(decoded.pubKey) }) return true } diff --git a/backend/src/graphql/enum/TransactionTypeId.ts b/backend/src/graphql/enum/TransactionTypeId.ts index 4ff3671cf..a7e39eebc 100644 --- a/backend/src/graphql/enum/TransactionTypeId.ts +++ b/backend/src/graphql/enum/TransactionTypeId.ts @@ -3,6 +3,10 @@ import { registerEnumType } from 'type-graphql' export enum TransactionTypeId { CREATION = 1, SEND = 2, + RECEIVE = 3, + // This is a virtual property, never occurring on the database + DECAY = 4, + LINK_SUMMARY = 5, } registerEnumType(TransactionTypeId, { diff --git a/backend/src/graphql/model/Balance.ts b/backend/src/graphql/model/Balance.ts index 93d497e0c..2f1eeb406 100644 --- a/backend/src/graphql/model/Balance.ts +++ b/backend/src/graphql/model/Balance.ts @@ -1,21 +1,22 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' @ObjectType() export class Balance { constructor(json: any) { - this.balance = Number(json.balance) - this.decay = Number(json.decay) + this.balance = json.balance + this.decay = json.decay this.decayDate = json.decay_date } - @Field(() => Number) - balance: number + @Field(() => Decimal) + balance: Decimal - @Field(() => Number) - decay: number + @Field(() => Decimal) + decay: Decimal - @Field(() => String) - decayDate: string + @Field(() => Date) + decayDate: Date } diff --git a/backend/src/graphql/model/Decay.ts b/backend/src/graphql/model/Decay.ts index 48ed7b8c5..f1204e730 100644 --- a/backend/src/graphql/model/Decay.ts +++ b/backend/src/graphql/model/Decay.ts @@ -1,33 +1,34 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field, Int } from 'type-graphql' +import Decimal from 'decimal.js-light' @ObjectType() export class Decay { - constructor(json: any) { - if (json) { - this.balance = Number(json.balance) - this.decayStart = json.decay_start - this.decayEnd = json.decay_end - this.decayDuration = json.decay_duration - this.decayStartBlock = json.decay_start_block - } + constructor( + balance: Decimal, + decay: Decimal, + start: Date | null, + end: Date | null, + duration: number | null, + ) { + this.balance = balance + this.decay = decay + this.start = start + this.end = end + this.duration = duration } - @Field(() => Number) - balance: number + @Field(() => Decimal) + balance: Decimal - // timestamp in seconds - @Field(() => Int, { nullable: true }) - decayStart: string + @Field(() => Decimal) + decay: Decimal - // timestamp in seconds - @Field(() => Int, { nullable: true }) - decayEnd: string + @Field(() => Date, { nullable: true }) + start: Date | null - @Field(() => String, { nullable: true }) - decayDuration?: number + @Field(() => Date, { nullable: true }) + end: Date | null @Field(() => Int, { nullable: true }) - decayStartBlock?: string + duration: number | null } diff --git a/backend/src/graphql/model/GdtEntry.ts b/backend/src/graphql/model/GdtEntry.ts index 2f4b31b00..43529fb06 100644 --- a/backend/src/graphql/model/GdtEntry.ts +++ b/backend/src/graphql/model/GdtEntry.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' -import { GdtEntryType } from '../enum/GdtEntryType' +import { GdtEntryType } from '@enum/GdtEntryType' @ObjectType() export class GdtEntry { diff --git a/backend/src/graphql/model/GdtSumPerEmail.ts b/backend/src/graphql/model/GdtSumPerEmail.ts deleted file mode 100644 index c90c7293b..000000000 --- a/backend/src/graphql/model/GdtSumPerEmail.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* -import { ObjectType, Field } from 'type-graphql' - -@ObjectType() -export class GdtSumPerEmail { - constructor(email: string, summe: number) { - this.email = email - this.summe = summe - } - - @Field(() => String) - email: string - - @Field(() => Number) - summe: number -} -*/ diff --git a/backend/src/graphql/model/Transaction.ts b/backend/src/graphql/model/Transaction.ts index 3aa3c429d..684224175 100644 --- a/backend/src/graphql/model/Transaction.ts +++ b/backend/src/graphql/model/Transaction.ts @@ -1,55 +1,75 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' import { Decay } from './Decay' - -// we need a better solution for the decay block: -// the first transaction on the first page shows the decay since the last transaction -// the format is actually a Decay and not a Transaction. -// Therefore we have a lot of nullable fields, which should be always present +import { Transaction as dbTransaction } from '@entity/Transaction' +import Decimal from 'decimal.js-light' +import { TransactionTypeId } from '@enum/TransactionTypeId' +import { User } from './User' @ObjectType() export class Transaction { - constructor() { - this.type = '' - this.balance = 0 - this.totalBalance = 0 - this.memo = '' + constructor(transaction: dbTransaction, user: User, linkedUser: User | null = null) { + this.id = transaction.id + this.user = user + this.previous = transaction.previous + this.typeId = transaction.typeId + this.amount = transaction.amount + this.balance = transaction.balance + this.balanceDate = transaction.balanceDate + if (!transaction.decayStart) { + this.decay = new Decay(transaction.balance, new Decimal(0), null, null, null) + } else { + this.decay = new Decay( + transaction.balance, + transaction.decay, + transaction.decayStart, + transaction.balanceDate, + Math.round((transaction.balanceDate.getTime() - transaction.decayStart.getTime()) / 1000), + ) + } + this.memo = transaction.memo + this.creationDate = transaction.creationDate + this.linkedUser = linkedUser + this.linkedTransactionId = transaction.linkedTransactionId + this.transactionLinkId = transaction.transactionLinkId } - @Field(() => String) - type: string - @Field(() => Number) - balance: number + id: number - @Field(() => Number) - totalBalance: number + @Field(() => User) + user: User - @Field({ nullable: true }) - decayStart?: string + @Field(() => Number, { nullable: true }) + previous: number | null - @Field({ nullable: true }) - decayEnd?: string + @Field(() => TransactionTypeId) + typeId: TransactionTypeId - @Field({ nullable: true }) - decayDuration?: number + @Field(() => Decimal) + amount: Decimal + + @Field(() => Decimal) + balance: Decimal + + @Field(() => Date) + balanceDate: Date + + @Field(() => Decay) + decay: Decay @Field(() => String) memo: string + @Field(() => Date, { nullable: true }) + creationDate: Date | null + + @Field(() => User, { nullable: true }) + linkedUser: User | null + @Field(() => Number, { nullable: true }) - transactionId?: number + linkedTransactionId?: number | null - @Field({ nullable: true }) - name?: string - - @Field({ nullable: true }) - email?: string - - @Field({ nullable: true }) - date?: string - - @Field({ nullable: true }) - decay?: Decay + // Links to the TransactionLink when transaction was created by a link + @Field(() => Number, { nullable: true }) + transactionLinkId?: number | null } diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts new file mode 100644 index 000000000..414bba73f --- /dev/null +++ b/backend/src/graphql/model/TransactionLink.ts @@ -0,0 +1,54 @@ +import { ObjectType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import { User } from './User' + +@ObjectType() +export class TransactionLink { + constructor(transactionLink: dbTransactionLink, user: User, redeemedBy: User | null = null) { + this.id = transactionLink.id + this.user = user + this.amount = transactionLink.amount + this.holdAvailableAmount = transactionLink.holdAvailableAmount + this.memo = transactionLink.memo + this.code = transactionLink.code + this.createdAt = transactionLink.createdAt + this.validUntil = transactionLink.validUntil + this.deletedAt = transactionLink.deletedAt + this.redeemedAt = transactionLink.redeemedAt + this.redeemedBy = redeemedBy + } + + @Field(() => Number) + id: number + + @Field(() => User) + user: User + + @Field(() => Decimal) + amount: Decimal + + @Field(() => Decimal) + holdAvailableAmount: Decimal + + @Field(() => String) + memo: string + + @Field(() => String) + code: string + + @Field(() => Date) + createdAt: Date + + @Field(() => Date, { nullable: true }) + deletedAt: Date | null + + @Field(() => Date) + validUntil: Date + + @Field(() => Date, { nullable: true }) + redeemedAt: Date | null + + @Field(() => User, { nullable: true }) + redeemedBy: User | null +} diff --git a/backend/src/graphql/model/TransactionList.ts b/backend/src/graphql/model/TransactionList.ts index 0175048d1..9e8356747 100644 --- a/backend/src/graphql/model/TransactionList.ts +++ b/backend/src/graphql/model/TransactionList.ts @@ -1,32 +1,40 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' +import CONFIG from '@/config' +import Decimal from 'decimal.js-light' import { Transaction } from './Transaction' @ObjectType() export class TransactionList { - constructor() { - this.gdtSum = 0 - this.count = 0 - this.balance = 0 - this.decay = 0 - this.decayDate = '' + constructor( + balance: Decimal, + transactions: Transaction[], + count: number, + linkCount: number, + balanceGDT?: number | null, + decayStartBlock: Date = CONFIG.DECAY_START_TIME, + ) { + this.balance = balance + this.transactions = transactions + this.count = count + this.linkCount = linkCount + this.balanceGDT = balanceGDT || null + this.decayStartBlock = decayStartBlock } - @Field(() => Number) - gdtSum: number + @Field(() => Number, { nullable: true }) + balanceGDT: number | null @Field(() => Number) count: number @Field(() => Number) - balance: number + linkCount: number - @Field(() => Number) - decay: number + @Field(() => Decimal) + balance: Decimal - @Field(() => String) - decayDate: string + @Field(() => Date) + decayStartBlock: Date @Field(() => [Transaction]) transactions: Transaction[] diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index c7b5806ca..1a187a38f 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -1,90 +1,74 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { ObjectType, Field, Int } from 'type-graphql' +import { ObjectType, Field } from 'type-graphql' import { KlickTipp } from './KlickTipp' +import { User as dbUser } from '@entity/User' @ObjectType() export class User { - /* - @Field(() => ID) - @PrimaryGeneratedColumn() - id: number - */ - constructor(json?: any) { - if (json) { - this.id = json.id - this.email = json.email - this.firstName = json.first_name - this.lastName = json.last_name - this.username = json.username - this.description = json.description - this.pubkey = json.public_hex - this.language = json.language - this.publisherId = json.publisher_id - this.isAdmin = json.isAdmin - } + constructor(user: dbUser) { + this.id = user.id + this.email = user.email + this.firstName = user.firstName + this.lastName = user.lastName + this.deletedAt = user.deletedAt + this.createdAt = user.createdAt + this.emailChecked = user.emailChecked + this.language = user.language + this.publisherId = user.publisherId + // TODO + this.isAdmin = null + this.coinanimation = null + this.klickTipp = null + this.hasElopage = null } @Field(() => Number) id: number + // `public_key` binary(32) DEFAULT NULL, + // `privkey` binary(80) DEFAULT NULL, + + // TODO privacy issue here @Field(() => String) email: string - @Field(() => String) - firstName: string + @Field(() => String, { nullable: true }) + firstName: string | null - @Field(() => String) - lastName: string + @Field(() => String, { nullable: true }) + lastName: string | null - @Field(() => String) - username: string + @Field(() => Date, { nullable: true }) + deletedAt: Date | null - @Field(() => String) - description: string + // `password` bigint(20) unsigned DEFAULT 0, + // `email_hash` binary(32) DEFAULT NULL, - @Field(() => String) - pubkey: string - /* - @Field(() => String) - pubkey: string - - // not sure about the type here. Maybe better to have a string - @Field(() => number) - created: number - - @Field(() =>>> Boolean) - emailChecked: boolean + @Field(() => Date) + createdAt: Date @Field(() => Boolean) - passphraseShown: boolean - */ + emailChecked: boolean @Field(() => String) language: string - /* - @Field(() => Boolean) - disabled: boolean - */ + // This is not the users publisherId, but the one of the users who recommend him + @Field(() => Number, { nullable: true }) + publisherId: number | null - /* I suggest to have a group as type here - @Field(() => ID) - groupId: number -*/ - // what is publisherId? - @Field(() => Int, { nullable: true }) - publisherId?: number + // `passphrase` text COLLATE utf8mb4_unicode_ci DEFAULT NULL, - @Field(() => Boolean) - isAdmin: boolean - - @Field(() => Boolean) - coinanimation: boolean - - @Field(() => KlickTipp) - klickTipp: KlickTipp + // TODO this is a bit inconsistent with what we query from the database + // therefore all those fields are now nullable with default value null + @Field(() => Boolean, { nullable: true }) + isAdmin: boolean | null @Field(() => Boolean, { nullable: true }) - hasElopage?: boolean + coinanimation: boolean | null + + @Field(() => KlickTipp, { nullable: true }) + klickTipp: KlickTipp | null + + @Field(() => Boolean, { nullable: true }) + hasElopage: boolean | null } diff --git a/backend/src/graphql/model/UserAdmin.ts b/backend/src/graphql/model/UserAdmin.ts index befc203a5..1d418c66c 100644 --- a/backend/src/graphql/model/UserAdmin.ts +++ b/backend/src/graphql/model/UserAdmin.ts @@ -1,7 +1,20 @@ -import { ObjectType, Field } from 'type-graphql' +import { User } from '@entity/User' +import { ObjectType, Field, Int } from 'type-graphql' @ObjectType() export class UserAdmin { + constructor(user: User, creation: number[], hasElopage: boolean, emailConfirmationSend: string) { + this.userId = user.id + this.email = user.email + this.firstName = user.firstName + this.lastName = user.lastName + this.creation = creation + this.emailChecked = user.emailChecked + this.hasElopage = hasElopage + this.deletedAt = user.deletedAt + this.emailConfirmationSend = emailConfirmationSend + } + @Field(() => Number) userId: number @@ -19,4 +32,22 @@ export class UserAdmin { @Field(() => Boolean) emailChecked: boolean + + @Field(() => Boolean) + hasElopage: boolean + + @Field(() => Date, { nullable: true }) + deletedAt?: Date | null + + @Field(() => String, { nullable: true }) + emailConfirmationSend?: string +} + +@ObjectType() +export class SearchUsersResult { + @Field(() => Int) + userCount: number + + @Field(() => [UserAdmin]) + userList: UserAdmin[] } diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 12a07d51d..d98b38b7f 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -1,45 +1,163 @@ -import { Resolver, Query, Arg, Args, Authorized, Mutation, Ctx } from 'type-graphql' -import { getCustomRepository, Raw } from 'typeorm' -import { UserAdmin } from '../model/UserAdmin' -import { PendingCreation } from '../model/PendingCreation' -import { CreatePendingCreations } from '../model/CreatePendingCreations' -import { UpdatePendingCreation } from '../model/UpdatePendingCreation' -import { RIGHTS } from '../../auth/RIGHTS' -import { TransactionRepository } from '../../typeorm/repository/Transaction' -import { TransactionCreationRepository } from '../../typeorm/repository/TransactionCreation' -import { LoginPendingTasksAdminRepository } from '../../typeorm/repository/LoginPendingTasksAdmin' -import { UserRepository } from '../../typeorm/repository/User' -import CreatePendingCreationArgs from '../arg/CreatePendingCreationArgs' -import UpdatePendingCreationArgs from '../arg/UpdatePendingCreationArgs' -import moment from 'moment' -import { Transaction } from '@entity/Transaction' -import { TransactionCreation } from '@entity/TransactionCreation' -import { UserTransaction } from '@entity/UserTransaction' -import { UserTransactionRepository } from '../../typeorm/repository/UserTransaction' -import { BalanceRepository } from '../../typeorm/repository/Balance' -import { calculateDecay } from '../../util/decay' -import { LoginUserRepository } from '../../typeorm/repository/LoginUser' +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + +import { Resolver, Query, Arg, Args, Authorized, Mutation, Ctx, Int } from 'type-graphql' +import { + getCustomRepository, + IsNull, + Not, + ObjectLiteral, + getConnection, + In, +} from '@dbTools/typeorm' +import { UserAdmin, SearchUsersResult } from '@model/UserAdmin' +import { PendingCreation } from '@model/PendingCreation' +import { CreatePendingCreations } from '@model/CreatePendingCreations' +import { UpdatePendingCreation } from '@model/UpdatePendingCreation' +import { RIGHTS } from '@/auth/RIGHTS' +import { UserRepository } from '@repository/User' +import CreatePendingCreationArgs from '@arg/CreatePendingCreationArgs' +import UpdatePendingCreationArgs from '@arg/UpdatePendingCreationArgs' +import SearchUsersArgs from '@arg/SearchUsersArgs' +import { Transaction as DbTransaction } from '@entity/Transaction' +import { Transaction } from '@model/Transaction' +import { TransactionRepository } from '@repository/Transaction' +import { calculateDecay } from '@/util/decay' +import { AdminPendingCreation } from '@entity/AdminPendingCreation' +import { hasElopageBuys } from '@/util/hasElopageBuys' +import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' +import { User as dbUser } from '@entity/User' +import { User } from '@model/User' +import { TransactionTypeId } from '@enum/TransactionTypeId' +import Decimal from 'decimal.js-light' +import { Decay } from '@model/Decay' +import Paginated from '@arg/Paginated' +import { Order } from '@enum/Order' +import { communityUser } from '@/util/communityUser' + +// const EMAIL_OPT_IN_REGISTER = 1 +// const EMAIL_OPT_UNKNOWN = 3 // elopage? +const MAX_CREATION_AMOUNT = 1000 +const FULL_CREATION_AVAILABLE = [MAX_CREATION_AMOUNT, MAX_CREATION_AMOUNT, MAX_CREATION_AMOUNT] @Resolver() export class AdminResolver { @Authorized([RIGHTS.SEARCH_USERS]) - @Query(() => [UserAdmin]) - async searchUsers(@Arg('searchText') searchText: string): Promise { + @Query(() => SearchUsersResult) + async searchUsers( + @Args() + { + searchText, + currentPage = 1, + pageSize = 25, + notActivated = false, + isDeleted = false, + }: SearchUsersArgs, + ): Promise { const userRepository = getCustomRepository(UserRepository) - const users = await userRepository.findBySearchCriteria(searchText) + + const filterCriteria: ObjectLiteral[] = [] + if (notActivated) { + filterCriteria.push({ emailChecked: false }) + } + + if (isDeleted) { + filterCriteria.push({ deletedAt: Not(IsNull()) }) + } + + const userFields = ['id', 'firstName', 'lastName', 'email', 'emailChecked', 'deletedAt'] + const [users, count] = await userRepository.findBySearchCriteriaPagedFiltered( + userFields.map((fieldName) => { + return 'user.' + fieldName + }), + searchText, + filterCriteria, + currentPage, + pageSize, + ) + + if (users.length === 0) { + return { + userCount: 0, + userList: [], + } + } + + const creations = await getUserCreations(users.map((u) => u.id)) + const adminUsers = await Promise.all( users.map(async (user) => { - const adminUser = new UserAdmin() - adminUser.userId = user.id - adminUser.firstName = user.firstName - adminUser.lastName = user.lastName - adminUser.email = user.email - adminUser.creation = await getUserCreations(user.id) - adminUser.emailChecked = await hasActivatedEmail(user.email) + let emailConfirmationSend = '' + if (!user.emailChecked) { + const emailOptIn = await LoginEmailOptIn.findOne( + { + userId: user.id, + }, + { + order: { + updatedAt: 'DESC', + createdAt: 'DESC', + }, + select: ['updatedAt', 'createdAt'], + }, + ) + if (emailOptIn) { + if (emailOptIn.updatedAt) { + emailConfirmationSend = emailOptIn.updatedAt.toISOString() + } else { + emailConfirmationSend = emailOptIn.createdAt.toISOString() + } + } + } + const userCreations = creations.find((c) => c.id === user.id) + const adminUser = new UserAdmin( + user, + userCreations ? userCreations.creations : FULL_CREATION_AVAILABLE, + await hasElopageBuys(user.email), + emailConfirmationSend, + ) return adminUser }), ) - return adminUsers + return { + userCount: count, + userList: adminUsers, + } + } + + @Authorized([RIGHTS.DELETE_USER]) + @Mutation(() => Date, { nullable: true }) + async deleteUser( + @Arg('userId', () => Int) userId: number, + @Ctx() context: any, + ): Promise { + const user = await dbUser.findOne({ id: userId }) + // user exists ? + if (!user) { + throw new Error(`Could not find user with userId: ${userId}`) + } + // moderator user disabled own account? + const moderatorUser = context.user + if (moderatorUser.id === userId) { + throw new Error('Moderator can not delete his own account!') + } + // soft-delete user + await user.softRemove() + const newUser = await dbUser.findOne({ id: userId }, { withDeleted: true }) + return newUser ? newUser.deletedAt : null + } + + @Authorized([RIGHTS.UNDELETE_USER]) + @Mutation(() => Date, { nullable: true }) + async unDeleteUser(@Arg('userId', () => Int) userId: number): Promise { + const user = await dbUser.findOne({ id: userId }, { withDeleted: true }) + // user exists ? + if (!user) { + throw new Error(`Could not find user with userId: ${userId}`) + } + // recover user account + await user.recover() + return null } @Authorized([RIGHTS.CREATE_PENDING_CREATION]) @@ -47,24 +165,30 @@ export class AdminResolver { async createPendingCreation( @Args() { email, amount, memo, creationDate, moderator }: CreatePendingCreationArgs, ): Promise { - const userRepository = getCustomRepository(UserRepository) - const user = await userRepository.findByEmail(email) - - const creations = await getUserCreations(user.id) + const user = await dbUser.findOne({ email }, { withDeleted: true }) + if (!user) { + throw new Error(`Could not find user with email: ${email}`) + } + if (user.deletedAt) { + throw new Error('This user was deleted. Cannot make a creation.') + } + if (!user.emailChecked) { + throw new Error('Creation could not be saved, Email is not activated') + } + const creations = await getUserCreation(user.id) const creationDateObj = new Date(creationDate) if (isCreationValid(creations, amount, creationDateObj)) { - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const loginPendingTaskAdmin = loginPendingTasksAdminRepository.create() - loginPendingTaskAdmin.userId = user.id - loginPendingTaskAdmin.amount = BigInt(amount * 10000) - loginPendingTaskAdmin.created = new Date() - loginPendingTaskAdmin.date = creationDateObj - loginPendingTaskAdmin.memo = memo - loginPendingTaskAdmin.moderator = moderator + const adminPendingCreation = AdminPendingCreation.create() + adminPendingCreation.userId = user.id + adminPendingCreation.amount = BigInt(amount) + adminPendingCreation.created = new Date() + adminPendingCreation.date = creationDateObj + adminPendingCreation.memo = memo + adminPendingCreation.moderator = moderator - loginPendingTasksAdminRepository.save(loginPendingTaskAdmin) + await AdminPendingCreation.save(adminPendingCreation) } - return await getUserCreations(user.id) + return getUserCreation(user.id) } @Authorized([RIGHTS.CREATE_PENDING_CREATION]) @@ -98,27 +222,42 @@ export class AdminResolver { async updatePendingCreation( @Args() { id, email, amount, memo, creationDate, moderator }: UpdatePendingCreationArgs, ): Promise { - const userRepository = getCustomRepository(UserRepository) - const user = await userRepository.findByEmail(email) + const user = await dbUser.findOne({ email }, { withDeleted: true }) + if (!user) { + throw new Error(`Could not find user with email: ${email}`) + } + if (user.deletedAt) { + throw new Error(`User was deleted (${email})`) + } - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const updatedCreation = await loginPendingTasksAdminRepository.findOneOrFail({ id }) + const pendingCreationToUpdate = await AdminPendingCreation.findOneOrFail({ id }) - if (updatedCreation.userId !== user.id) + if (pendingCreationToUpdate.userId !== user.id) { throw new Error('user of the pending creation and send user does not correspond') + } - updatedCreation.amount = BigInt(amount * 10000) - updatedCreation.memo = memo - updatedCreation.date = new Date(creationDate) - updatedCreation.moderator = moderator + const creationDateObj = new Date(creationDate) + let creations = await getUserCreation(user.id) + if (pendingCreationToUpdate.date.getMonth() === creationDateObj.getMonth()) { + creations = updateCreations(creations, pendingCreationToUpdate) + } - await loginPendingTasksAdminRepository.save(updatedCreation) + if (!isCreationValid(creations, amount, creationDateObj)) { + throw new Error('Creation is not valid') + } + pendingCreationToUpdate.amount = BigInt(amount) + pendingCreationToUpdate.memo = memo + pendingCreationToUpdate.date = new Date(creationDate) + pendingCreationToUpdate.moderator = moderator + + await AdminPendingCreation.save(pendingCreationToUpdate) const result = new UpdatePendingCreation() result.amount = parseInt(amount.toString()) - result.memo = updatedCreation.memo - result.date = updatedCreation.date - result.moderator = updatedCreation.moderator - result.creation = await getUserCreations(user.id) + result.memo = pendingCreationToUpdate.memo + result.date = pendingCreationToUpdate.date + result.moderator = pendingCreationToUpdate.moderator + + result.creation = await getUserCreation(user.id) return result } @@ -126,220 +265,200 @@ export class AdminResolver { @Authorized([RIGHTS.SEARCH_PENDING_CREATION]) @Query(() => [PendingCreation]) async getPendingCreations(): Promise { - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const pendingCreations = await loginPendingTasksAdminRepository.find() + const pendingCreations = await AdminPendingCreation.find() + if (pendingCreations.length === 0) { + return [] + } - const pendingCreationsPromise = await Promise.all( - pendingCreations.map(async (pendingCreation) => { - const userRepository = getCustomRepository(UserRepository) - const user = await userRepository.findOneOrFail({ id: pendingCreation.userId }) + const userIds = pendingCreations.map((p) => p.userId) + const userCreations = await getUserCreations(userIds) + const users = await dbUser.find({ where: { id: In(userIds) }, withDeleted: true }) - const parsedAmount = Number(parseInt(pendingCreation.amount.toString()) / 10000) - // pendingCreation.amount = parsedAmount - const newPendingCreation = { - ...pendingCreation, - amount: parsedAmount, - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - creation: await getUserCreations(user.id), - } + return pendingCreations.map((pendingCreation) => { + const user = users.find((u) => u.id === pendingCreation.userId) + const creation = userCreations.find((c) => c.id === pendingCreation.userId) - return newPendingCreation - }), - ) - return pendingCreationsPromise.reverse() + return { + ...pendingCreation, + amount: Number(pendingCreation.amount.toString()), + firstName: user ? user.firstName : '', + lastName: user ? user.lastName : '', + email: user ? user.email : '', + creation: creation ? creation.creations : FULL_CREATION_AVAILABLE, + } + }) } @Authorized([RIGHTS.DELETE_PENDING_CREATION]) @Mutation(() => Boolean) - async deletePendingCreation(@Arg('id') id: number): Promise { - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const entity = await loginPendingTasksAdminRepository.findOneOrFail(id) - const res = await loginPendingTasksAdminRepository.delete(entity) + async deletePendingCreation(@Arg('id', () => Int) id: number): Promise { + const entity = await AdminPendingCreation.findOneOrFail(id) + const res = await AdminPendingCreation.delete(entity) return !!res } @Authorized([RIGHTS.CONFIRM_PENDING_CREATION]) @Mutation(() => Boolean) - async confirmPendingCreation(@Arg('id') id: number, @Ctx() context: any): Promise { - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const pendingCreation = await loginPendingTasksAdminRepository.findOneOrFail(id) - - const userRepository = getCustomRepository(UserRepository) - const moderatorUser = await userRepository.findByPubkeyHex(context.pubKey) + async confirmPendingCreation( + @Arg('id', () => Int) id: number, + @Ctx() context: any, + ): Promise { + const pendingCreation = await AdminPendingCreation.findOneOrFail(id) + const moderatorUser = context.user if (moderatorUser.id === pendingCreation.userId) throw new Error('Moderator can not confirm own pending creation') - const transactionRepository = getCustomRepository(TransactionRepository) - const receivedCallDate = new Date() - let transaction = new Transaction() - transaction.transactionTypeId = 1 - transaction.memo = pendingCreation.memo - transaction.received = receivedCallDate - transaction.blockchainTypeId = 1 - transaction = await transactionRepository.save(transaction) - if (!transaction) throw new Error('Could not create transaction') + const user = await dbUser.findOneOrFail({ id: pendingCreation.userId }, { withDeleted: true }) + if (user.deletedAt) throw new Error('This user was deleted. Cannot confirm a creation.') - const transactionCreationRepository = getCustomRepository(TransactionCreationRepository) - let transactionCreation = new TransactionCreation() - transactionCreation.transactionId = transaction.id - transactionCreation.userId = pendingCreation.userId - transactionCreation.amount = parseInt(pendingCreation.amount.toString()) - transactionCreation.targetDate = pendingCreation.date - transactionCreation = await transactionCreationRepository.save(transactionCreation) - if (!transactionCreation) throw new Error('Could not create transactionCreation') - - const userTransactionRepository = getCustomRepository(UserTransactionRepository) - const lastUserTransaction = await userTransactionRepository.findLastForUser( - pendingCreation.userId, - ) - let newBalance = 0 - if (!lastUserTransaction) { - newBalance = 0 - } else { - newBalance = await calculateDecay( - lastUserTransaction.balance, - lastUserTransaction.balanceDate, - receivedCallDate, - ) + const creations = await getUserCreation(pendingCreation.userId, false) + if (!isCreationValid(creations, Number(pendingCreation.amount), pendingCreation.date)) { + throw new Error('Creation is not valid!!') } - newBalance = Number(newBalance) + Number(parseInt(pendingCreation.amount.toString())) - const newUserTransaction = new UserTransaction() - newUserTransaction.userId = pendingCreation.userId - newUserTransaction.transactionId = transaction.id - newUserTransaction.transactionTypeId = transaction.transactionTypeId - newUserTransaction.balance = Number(newBalance) - newUserTransaction.balanceDate = transaction.received + const receivedCallDate = new Date() - await userTransactionRepository.save(newUserTransaction).catch((error) => { - throw new Error('Error saving user transaction: ' + error) - }) + const transactionRepository = getCustomRepository(TransactionRepository) + const lastTransaction = await transactionRepository.findLastForUser(pendingCreation.userId) - const balanceRepository = getCustomRepository(BalanceRepository) - let userBalance = await balanceRepository.findByUser(pendingCreation.userId) + let newBalance = new Decimal(0) + let decay: Decay | null = null + if (lastTransaction) { + decay = calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, receivedCallDate) + newBalance = decay.balance + } + // TODO pending creations decimal + newBalance = newBalance.add(new Decimal(Number(pendingCreation.amount)).toString()) - if (!userBalance) userBalance = balanceRepository.create() - userBalance.userId = pendingCreation.userId - userBalance.amount = Number(newBalance) - userBalance.modified = receivedCallDate - userBalance.recordDate = receivedCallDate - await balanceRepository.save(userBalance) - await loginPendingTasksAdminRepository.delete(pendingCreation) + const transaction = new DbTransaction() + transaction.typeId = TransactionTypeId.CREATION + transaction.memo = pendingCreation.memo + transaction.userId = pendingCreation.userId + transaction.previous = lastTransaction ? lastTransaction.id : null + // TODO pending creations decimal + transaction.amount = new Decimal(Number(pendingCreation.amount)) + transaction.creationDate = pendingCreation.date + transaction.balance = newBalance + transaction.balanceDate = receivedCallDate + transaction.decay = decay ? decay.decay : new Decimal(0) + transaction.decayStart = decay ? decay.start : null + await transaction.save() + + await AdminPendingCreation.delete(pendingCreation) return true } + + @Authorized([RIGHTS.CREATION_TRANSACTION_LIST]) + @Query(() => [Transaction]) + async creationTransactionList( + @Args() + { currentPage = 1, pageSize = 25, order = Order.DESC }: Paginated, + @Arg('userId', () => Int) userId: number, + ): Promise { + const offset = (currentPage - 1) * pageSize + const transactionRepository = getCustomRepository(TransactionRepository) + const [userTransactions] = await transactionRepository.findByUserPaged( + userId, + pageSize, + offset, + order, + true, + ) + + const user = await dbUser.findOneOrFail({ id: userId }) + return userTransactions.map((t) => new Transaction(t, new User(user), communityUser)) + } } -async function getUserCreations(id: number): Promise { - const dateNextMonth = moment().add(1, 'month').format('YYYY-MM') + '-01' - const dateBeforeLastMonth = moment().subtract(2, 'month').format('YYYY-MM') + '-01' - const beforeLastMonthNumber = moment().subtract(2, 'month').format('M') - const lastMonthNumber = moment().subtract(1, 'month').format('M') - const currentMonthNumber = moment().format('M') +interface CreationMap { + id: number + creations: number[] +} - const transactionCreationRepository = getCustomRepository(TransactionCreationRepository) - const createdAmountsQuery = await transactionCreationRepository - .createQueryBuilder('transaction_creations') - .select('MONTH(transaction_creations.target_date)', 'target_month') - .addSelect('SUM(transaction_creations.amount)', 'sum') - .where('transaction_creations.state_user_id = :id', { id }) - .andWhere({ - targetDate: Raw((alias) => `${alias} >= :date and ${alias} < :endDate`, { - date: dateBeforeLastMonth, - endDate: dateNextMonth, +async function getUserCreation(id: number, includePending = true): Promise { + const creations = await getUserCreations([id], includePending) + return creations[0] ? creations[0].creations : FULL_CREATION_AVAILABLE +} + +async function getUserCreations(ids: number[], includePending = true): Promise { + const months = getCreationMonths() + + const queryRunner = getConnection().createQueryRunner() + await queryRunner.connect() + + const dateFilter = 'last_day(curdate() - interval 3 month) + interval 1 day' + + const unionString = includePending + ? ` + UNION + SELECT date AS date, amount AS amount, userId AS userId FROM admin_pending_creations + WHERE userId IN (${ids.toString()}) + AND date >= ${dateFilter}` + : '' + + const unionQuery = await queryRunner.manager.query(` + SELECT MONTH(date) AS month, sum(amount) AS sum, userId AS id FROM + (SELECT creation_date AS date, amount AS amount, user_id AS userId FROM transactions + WHERE user_id IN (${ids.toString()}) + AND type_id = ${TransactionTypeId.CREATION} + AND creation_date >= ${dateFilter} + ${unionString}) AS result + GROUP BY month, userId + ORDER BY date DESC + `) + + await queryRunner.release() + + return ids.map((id) => { + return { + id, + creations: months.map((month) => { + const creation = unionQuery.find( + (raw: { month: string; id: string; creation: number[] }) => + parseInt(raw.month) === month && parseInt(raw.id) === id, + ) + return MAX_CREATION_AMOUNT - (creation ? Number(creation.sum) : 0) }), - }) - .groupBy('target_month') - .orderBy('target_month', 'ASC') - .getRawMany() + } + }) +} - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const pendingAmountsQuery = await loginPendingTasksAdminRepository - .createQueryBuilder('login_pending_tasks_admin') - .select('MONTH(login_pending_tasks_admin.date)', 'target_month') - .addSelect('SUM(login_pending_tasks_admin.amount)', 'sum') - .where('login_pending_tasks_admin.userId = :id', { id }) - .andWhere({ - date: Raw((alias) => `${alias} >= :date and ${alias} < :endDate`, { - date: dateBeforeLastMonth, - endDate: dateNextMonth, - }), - }) - .groupBy('target_month') - .orderBy('target_month', 'ASC') - .getRawMany() +function updateCreations(creations: number[], pendingCreation: AdminPendingCreation): number[] { + const index = getCreationIndex(pendingCreation.date.getMonth()) - const map = new Map() - if (Array.isArray(createdAmountsQuery) && createdAmountsQuery.length > 0) { - createdAmountsQuery.forEach((createdAmount) => { - if (!map.has(createdAmount.target_month)) { - map.set(createdAmount.target_month, createdAmount.sum) - } else { - const store = map.get(createdAmount.target_month) - map.set(createdAmount.target_month, Number(store) + Number(createdAmount.sum)) - } - }) + if (index < 0) { + throw new Error('You cannot create GDD for a month older than the last three months.') } - - if (Array.isArray(pendingAmountsQuery) && pendingAmountsQuery.length > 0) { - pendingAmountsQuery.forEach((pendingAmount) => { - if (!map.has(pendingAmount.target_month)) { - map.set(pendingAmount.target_month, pendingAmount.sum) - } else { - const store = map.get(pendingAmount.target_month) - map.set(pendingAmount.target_month, Number(store) + Number(pendingAmount.sum)) - } - }) - } - const usedCreationBeforeLastMonth = map.get(Number(beforeLastMonthNumber)) - ? Number(map.get(Number(beforeLastMonthNumber))) / 10000 - : 0 - const usedCreationLastMonth = map.get(Number(lastMonthNumber)) - ? Number(map.get(Number(lastMonthNumber))) / 10000 - : 0 - - const usedCreationCurrentMonth = map.get(Number(currentMonthNumber)) - ? Number(map.get(Number(currentMonthNumber))) / 10000 - : 0 - - return [ - 1000 - usedCreationBeforeLastMonth, - 1000 - usedCreationLastMonth, - 1000 - usedCreationCurrentMonth, - ] + creations[index] += parseInt(pendingCreation.amount.toString()) + return creations } function isCreationValid(creations: number[], amount: number, creationDate: Date) { - const dateMonth = moment().format('YYYY-MM') - const dateLastMonth = moment().subtract(1, 'month').format('YYYY-MM') - const dateBeforeLastMonth = moment().subtract(2, 'month').format('YYYY-MM') - const creationDateMonth = moment(creationDate).format('YYYY-MM') + const index = getCreationIndex(creationDate.getMonth()) - let openCreation - switch (creationDateMonth) { - case dateMonth: - openCreation = creations[2] - break - case dateLastMonth: - openCreation = creations[1] - break - case dateBeforeLastMonth: - openCreation = creations[0] - break - default: - throw new Error('CreationDate is not in last three months') + if (index < 0) { + throw new Error(`No Creation found!`) } - if (openCreation < amount) { - throw new Error(`Open creation (${openCreation}) is less than amount (${amount})`) + if (amount > creations[index]) { + throw new Error( + `The amount (${amount} GDD) to be created exceeds the available amount (${creations[index]} GDD) for this month.`, + ) } + return true } -async function hasActivatedEmail(email: string): Promise { - const repository = getCustomRepository(LoginUserRepository) - const user = await repository.findByEmail(email) - return user ? user.emailChecked : false +const getCreationMonths = (): number[] => { + const now = new Date(Date.now()) + return [ + now.getMonth() + 1, + new Date(now.getFullYear(), now.getMonth() - 1, 1).getMonth() + 1, + new Date(now.getFullYear(), now.getMonth() - 2, 1).getMonth() + 1, + ].reverse() +} + +const getCreationIndex = (month: number): number => { + return getCreationMonths().findIndex((el) => el === month + 1) } diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index e368c4dc2..09d2fdc92 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -2,13 +2,11 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Resolver, Query, Ctx, Authorized } from 'type-graphql' -import { getCustomRepository } from 'typeorm' -import { Balance } from '../model/Balance' -import { BalanceRepository } from '../../typeorm/repository/Balance' -import { UserRepository } from '../../typeorm/repository/User' -import { calculateDecay } from '../../util/decay' -import { roundFloorFrom4 } from '../../util/round' -import { RIGHTS } from '../../auth/RIGHTS' +import { Balance } from '@model/Balance' +import { calculateDecay } from '@/util/decay' +import { RIGHTS } from '@/auth/RIGHTS' +import { Transaction } from '@entity/Transaction' +import Decimal from 'decimal.js-light' @Resolver() export class BalanceResolver { @@ -16,27 +14,26 @@ export class BalanceResolver { @Query(() => Balance) async balance(@Ctx() context: any): Promise { // load user and balance - const balanceRepository = getCustomRepository(BalanceRepository) - const userRepository = getCustomRepository(UserRepository) - - const userEntity = await userRepository.findByPubkeyHex(context.pubKey) - const balanceEntity = await balanceRepository.findByUser(userEntity.id) + const { user } = context const now = new Date() + const lastTransaction = await Transaction.findOne( + { userId: user.id }, + { order: { balanceDate: 'DESC' } }, + ) + // No balance found - if (!balanceEntity) { + if (!lastTransaction) { return new Balance({ - balance: 0, - decay: 0, + balance: new Decimal(0), + decay: new Decimal(0), decay_date: now.toString(), }) } return new Balance({ - balance: roundFloorFrom4(balanceEntity.amount), - decay: roundFloorFrom4( - await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), - ), + balance: lastTransaction.balance, + decay: calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now).balance, decay_date: now.toString(), }) } diff --git a/backend/src/graphql/resolver/CommunityResolver.test.ts b/backend/src/graphql/resolver/CommunityResolver.test.ts index afc6decec..cb916e47c 100644 --- a/backend/src/graphql/resolver/CommunityResolver.test.ts +++ b/backend/src/graphql/resolver/CommunityResolver.test.ts @@ -2,10 +2,10 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { createTestClient } from 'apollo-server-testing' -import createServer from '../../server/createServer' -import CONFIG from '../../config' +import createServer from '@/server/createServer' +import CONFIG from '@/config' -jest.mock('../../config') +jest.mock('@/config') let query: any @@ -53,8 +53,8 @@ describe('CommunityResolver', () => { getCommunityInfo: { name: 'Gradido Entwicklung', description: 'Die lokale Entwicklungsumgebung von Gradido.', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register', + url: 'http://localhost/', + registerUrl: 'http://localhost/register', }, }, }) @@ -75,22 +75,22 @@ describe('CommunityResolver', () => { id: 1, name: 'Gradido Entwicklung', description: 'Die lokale Entwicklungsumgebung von Gradido.', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register-community', + url: 'http://localhost/', + registerUrl: 'http://localhost/register-community', }, { id: 2, name: 'Gradido Staging', description: 'Der Testserver der Gradido-Akademie.', - url: 'https://stage1.gradido.net/vue/', - registerUrl: 'https://stage1.gradido.net/vue/register-community', + url: 'https://stage1.gradido.net/', + registerUrl: 'https://stage1.gradido.net/register-community', }, { id: 3, name: 'Gradido-Akademie', description: 'Freies Institut für Wirtschaftsbionik.', url: 'https://gradido.net', - registerUrl: 'https://gdd1.gradido.com/vue/register-community', + registerUrl: 'https://gdd1.gradido.com/register-community', }, ], }, @@ -112,7 +112,7 @@ describe('CommunityResolver', () => { name: 'Gradido-Akademie', description: 'Freies Institut für Wirtschaftsbionik.', url: 'https://gradido.net', - registerUrl: 'https://gdd1.gradido.com/vue/register-community', + registerUrl: 'https://gdd1.gradido.com/register-community', }, ], }, diff --git a/backend/src/graphql/resolver/CommunityResolver.ts b/backend/src/graphql/resolver/CommunityResolver.ts index 5c9d46f34..1693574cb 100644 --- a/backend/src/graphql/resolver/CommunityResolver.ts +++ b/backend/src/graphql/resolver/CommunityResolver.ts @@ -2,9 +2,9 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Resolver, Query, Authorized } from 'type-graphql' -import { RIGHTS } from '../../auth/RIGHTS' -import CONFIG from '../../config' -import { Community } from '../model/Community' +import { RIGHTS } from '@/auth/RIGHTS' +import CONFIG from '@/config' +import { Community } from '@model/Community' @Resolver() export class CommunityResolver { @@ -29,7 +29,7 @@ export class CommunityResolver { name: 'Gradido-Akademie', description: 'Freies Institut für Wirtschaftsbionik.', url: 'https://gradido.net', - registerUrl: 'https://gdd1.gradido.com/vue/register-community', + registerUrl: 'https://gdd1.gradido.com/register-community', }), ] return [ @@ -37,22 +37,22 @@ export class CommunityResolver { id: 1, name: 'Gradido Entwicklung', description: 'Die lokale Entwicklungsumgebung von Gradido.', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register-community', + url: 'http://localhost/', + registerUrl: 'http://localhost/register-community', }), new Community({ id: 2, name: 'Gradido Staging', description: 'Der Testserver der Gradido-Akademie.', - url: 'https://stage1.gradido.net/vue/', - registerUrl: 'https://stage1.gradido.net/vue/register-community', + url: 'https://stage1.gradido.net/', + registerUrl: 'https://stage1.gradido.net/register-community', }), new Community({ id: 3, name: 'Gradido-Akademie', description: 'Freies Institut für Wirtschaftsbionik.', url: 'https://gradido.net', - registerUrl: 'https://gdd1.gradido.com/vue/register-community', + registerUrl: 'https://gdd1.gradido.com/register-community', }), ] } diff --git a/backend/src/graphql/resolver/GdtResolver.ts b/backend/src/graphql/resolver/GdtResolver.ts index 9110eb76b..26ae9b210 100644 --- a/backend/src/graphql/resolver/GdtResolver.ts +++ b/backend/src/graphql/resolver/GdtResolver.ts @@ -2,14 +2,12 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Resolver, Query, Args, Ctx, Authorized, Arg } from 'type-graphql' -import { getCustomRepository } from 'typeorm' -import CONFIG from '../../config' -import { GdtEntryList } from '../model/GdtEntryList' -import Paginated from '../arg/Paginated' -import { apiGet } from '../../apis/HttpRequest' -import { UserRepository } from '../../typeorm/repository/User' -import { Order } from '../enum/Order' -import { RIGHTS } from '../../auth/RIGHTS' +import CONFIG from '@/config' +import { GdtEntryList } from '@model/GdtEntryList' +import Paginated from '@arg/Paginated' +import { apiGet } from '@/apis/HttpRequest' +import { Order } from '@enum/Order' +import { RIGHTS } from '@/auth/RIGHTS' @Resolver() export class GdtResolver { @@ -22,16 +20,19 @@ export class GdtResolver { @Ctx() context: any, ): Promise { // load user - const userRepository = getCustomRepository(UserRepository) - const userEntity = await userRepository.findByPubkeyHex(context.pubKey) + const userEntity = context.user - const resultGDT = await apiGet( - `${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.email}/${currentPage}/${pageSize}/${order}`, - ) - if (!resultGDT.success) { - throw new Error(resultGDT.data) + try { + const resultGDT = await apiGet( + `${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.email}/${currentPage}/${pageSize}/${order}`, + ) + if (!resultGDT.success) { + throw new Error(resultGDT.data) + } + return new GdtEntryList(resultGDT.data) + } catch (err: any) { + throw new Error('GDT Server is not reachable.') } - return new GdtEntryList(resultGDT.data) } @Authorized([RIGHTS.EXIST_PID]) diff --git a/backend/src/graphql/resolver/KlicktippResolver.ts b/backend/src/graphql/resolver/KlicktippResolver.ts index fdffb940a..d13f1dd8e 100644 --- a/backend/src/graphql/resolver/KlicktippResolver.ts +++ b/backend/src/graphql/resolver/KlicktippResolver.ts @@ -6,10 +6,10 @@ import { getKlickTippUser, getKlicktippTagMap, unsubscribe, - signIn, -} from '../../apis/KlicktippController' -import { RIGHTS } from '../../auth/RIGHTS' -import SubscribeNewsletterArgs from '../arg/SubscribeNewsletterArgs' + klicktippSignIn, +} from '@/apis/KlicktippController' +import { RIGHTS } from '@/auth/RIGHTS' +import SubscribeNewsletterArgs from '@arg/SubscribeNewsletterArgs' @Resolver() export class KlicktippResolver { @@ -36,6 +36,6 @@ export class KlicktippResolver { async subscribeNewsletter( @Args() { email, language }: SubscribeNewsletterArgs, ): Promise { - return await signIn(email, language) + return await klicktippSignIn(email, language) } } diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts new file mode 100644 index 000000000..5a1a39dca --- /dev/null +++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts @@ -0,0 +1,14 @@ +import { transactionLinkCode } from './TransactionLinkResolver' + +describe('transactionLinkCode', () => { + const date = new Date() + + it('returns a string of length 24', () => { + expect(transactionLinkCode(date)).toHaveLength(24) + }) + + it('returns a string that ends with the hex value of date', () => { + const regexp = new RegExp(date.getTime().toString(16) + '$') + expect(transactionLinkCode(date)).toEqual(expect.stringMatching(regexp)) + }) +}) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts new file mode 100644 index 000000000..646a7c296 --- /dev/null +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -0,0 +1,169 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + +import { Resolver, Args, Arg, Authorized, Ctx, Mutation, Query, Int } from 'type-graphql' +import { TransactionLink } from '@model/TransactionLink' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import { User as dbUser } from '@entity/User' +import TransactionLinkArgs from '@arg/TransactionLinkArgs' +import Paginated from '@arg/Paginated' +import { calculateBalance } from '@/util/validate' +import { RIGHTS } from '@/auth/RIGHTS' +import { randomBytes } from 'crypto' +import { User } from '@model/User' +import { calculateDecay } from '@/util/decay' +import { executeTransaction } from './TransactionResolver' +import { Order } from '@enum/Order' + +// TODO: do not export, test it inside the resolver +export const transactionLinkCode = (date: Date): string => { + const time = date.getTime().toString(16) + return ( + randomBytes(12) + .toString('hex') + .substring(0, 24 - time.length) + time + ) +} + +const CODE_VALID_DAYS_DURATION = 14 + +export const transactionLinkExpireDate = (date: Date): Date => { + const validUntil = new Date(date) + return new Date(validUntil.setDate(date.getDate() + CODE_VALID_DAYS_DURATION)) +} + +@Resolver() +export class TransactionLinkResolver { + @Authorized([RIGHTS.CREATE_TRANSACTION_LINK]) + @Mutation(() => TransactionLink) + async createTransactionLink( + @Args() { amount, memo }: TransactionLinkArgs, + @Ctx() context: any, + ): Promise { + const { user } = context + + const createdDate = new Date() + const validUntil = transactionLinkExpireDate(createdDate) + + const holdAvailableAmount = amount.minus(calculateDecay(amount, createdDate, validUntil).decay) + + // validate amount + const sendBalance = await calculateBalance(user.id, holdAvailableAmount.mul(-1), createdDate) + if (!sendBalance) { + throw new Error("user hasn't enough GDD or amount is < 0") + } + + const transactionLink = dbTransactionLink.create() + transactionLink.userId = user.id + transactionLink.amount = amount + transactionLink.memo = memo + transactionLink.holdAvailableAmount = holdAvailableAmount + transactionLink.code = transactionLinkCode(createdDate) + transactionLink.createdAt = createdDate + transactionLink.validUntil = validUntil + await dbTransactionLink.save(transactionLink).catch(() => { + throw new Error('Unable to save transaction link') + }) + + return new TransactionLink(transactionLink, new User(user)) + } + + @Authorized([RIGHTS.DELETE_TRANSACTION_LINK]) + @Mutation(() => Boolean) + async deleteTransactionLink( + @Arg('id', () => Int) id: number, + @Ctx() context: any, + ): Promise { + const { user } = context + + const transactionLink = await dbTransactionLink.findOne({ id }) + if (!transactionLink) { + throw new Error('Transaction Link not found!') + } + + if (transactionLink.userId !== user.id) { + throw new Error('Transaction Link cannot be deleted!') + } + + if (transactionLink.redeemedBy) { + throw new Error('Transaction Link already redeemed!') + } + + await transactionLink.softRemove().catch(() => { + throw new Error('Transaction Link could not be deleted!') + }) + + return true + } + + @Authorized([RIGHTS.QUERY_TRANSACTION_LINK]) + @Query(() => TransactionLink) + async queryTransactionLink(@Arg('code') code: string): Promise { + const transactionLink = await dbTransactionLink.findOneOrFail({ code }, { withDeleted: true }) + const user = await dbUser.findOneOrFail({ id: transactionLink.userId }) + let redeemedBy: User | null = null + if (transactionLink && transactionLink.redeemedBy) { + redeemedBy = new User(await dbUser.findOneOrFail({ id: transactionLink.redeemedBy })) + } + return new TransactionLink(transactionLink, new User(user), redeemedBy) + } + + @Authorized([RIGHTS.LIST_TRANSACTION_LINKS]) + @Query(() => [TransactionLink]) + async listTransactionLinks( + @Args() + { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, + @Ctx() context: any, + ): Promise { + const { user } = context + // const now = new Date() + const transactionLinks = await dbTransactionLink.find({ + where: { + userId: user.id, + redeemedBy: null, + // validUntil: MoreThan(now), + }, + order: { + createdAt: order, + }, + skip: (currentPage - 1) * pageSize, + take: pageSize, + }) + return transactionLinks.map((tl) => new TransactionLink(tl, new User(user))) + } + + @Authorized([RIGHTS.REDEEM_TRANSACTION_LINK]) + @Mutation(() => Boolean) + async redeemTransactionLink( + @Arg('code', () => String) code: string, + @Ctx() context: any, + ): Promise { + const { user } = context + const transactionLink = await dbTransactionLink.findOneOrFail({ code }) + const linkedUser = await dbUser.findOneOrFail({ id: transactionLink.userId }) + + const now = new Date() + + if (user.id === linkedUser.id) { + throw new Error('Cannot redeem own transaction link.') + } + + if (transactionLink.validUntil.getTime() < now.getTime()) { + throw new Error('Transaction Link is not valid anymore.') + } + + if (transactionLink.redeemedBy) { + throw new Error('Transaction Link already redeemed.') + } + + await executeTransaction( + transactionLink.amount, + transactionLink.memo, + linkedUser, + user, + transactionLink, + ) + + return true + } +} diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index d8ef1fb0f..ed9528b48 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -1,469 +1,128 @@ /* eslint-disable new-cap */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Resolver, Query, Args, Authorized, Ctx, Mutation } from 'type-graphql' -import { getCustomRepository, getConnection, QueryRunner } from 'typeorm' +import { getCustomRepository, getConnection } from '@dbTools/typeorm' -import CONFIG from '../../config' -import { sendEMail } from '../../util/sendEMail' +import CONFIG from '@/config' +import { sendTransactionReceivedEmail } from '@/mailer/sendTransactionReceivedEmail' -import { Transaction } from '../model/Transaction' -import { TransactionList } from '../model/TransactionList' +import { Transaction } from '@model/Transaction' +import { TransactionList } from '@model/TransactionList' -import TransactionSendArgs from '../arg/TransactionSendArgs' -import Paginated from '../arg/Paginated' +import TransactionSendArgs from '@arg/TransactionSendArgs' +import Paginated from '@arg/Paginated' -import { Order } from '../enum/Order' +import { Order } from '@enum/Order' -import { BalanceRepository } from '../../typeorm/repository/Balance' -import { UserRepository } from '../../typeorm/repository/User' -import { UserTransactionRepository } from '../../typeorm/repository/UserTransaction' -import { TransactionRepository } from '../../typeorm/repository/Transaction' +import { TransactionRepository } from '@repository/Transaction' +import { TransactionLinkRepository } from '@repository/TransactionLink' import { User as dbUser } from '@entity/User' -import { UserTransaction as dbUserTransaction } from '@entity/UserTransaction' import { Transaction as dbTransaction } from '@entity/Transaction' -import { TransactionSendCoin as dbTransactionSendCoin } from '@entity/TransactionSendCoin' -import { Balance as dbBalance } from '@entity/Balance' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' -import { apiPost } from '../../apis/HttpRequest' -import { roundFloorFrom4, roundCeilFrom4 } from '../../util/round' -import { calculateDecay, calculateDecayWithInterval } from '../../util/decay' -import { TransactionTypeId } from '../enum/TransactionTypeId' -import { TransactionType } from '../enum/TransactionType' -import { hasUserAmount, isHexPublicKey } from '../../util/validate' -import { LoginUserRepository } from '../../typeorm/repository/LoginUser' -import { RIGHTS } from '../../auth/RIGHTS' +import { apiPost } from '@/apis/HttpRequest' +import { TransactionTypeId } from '@enum/TransactionTypeId' +import { calculateBalance, isHexPublicKey } from '@/util/validate' +import { RIGHTS } from '@/auth/RIGHTS' +import { User } from '@model/User' +import { communityUser } from '@/util/communityUser' +import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions' +import Decimal from 'decimal.js-light' +import { calculateDecay } from '@/util/decay' -/* -# Test +export const executeTransaction = async ( + amount: Decimal, + memo: string, + sender: dbUser, + recipient: dbUser, + transactionLink?: dbTransactionLink | null, +): Promise => { + if (sender.id === recipient.id) { + throw new Error('Sender and Recipient are the same.') + } -## Prepare -> sudo systemctl start docker -> docker-compose up mariadb -> DROP all databases -> docker-compose down -> docker compose up mariadb database -> verify there is exactly one database `gradido_community` + // validate amount + const receivedCallDate = new Date() + const sendBalance = await calculateBalance(sender.id, amount.mul(-1), receivedCallDate) + if (!sendBalance) { + throw new Error("user hasn't enough GDD or amount is < 0") + } -TODO: -INSERT INTO `login_groups` (`id`, `alias`, `name`, `url`, `host`, `home`, `description`) VALUES - (1, 'docker', 'docker gradido group', 'localhost', 'nginx', '/', 'gradido test group for docker and stage2 with blockchain db'); + const queryRunner = getConnection().createQueryRunner() + await queryRunner.connect() + await queryRunner.startTransaction('READ UNCOMMITTED') + try { + // transaction + const transactionSend = new dbTransaction() + transactionSend.typeId = TransactionTypeId.SEND + transactionSend.memo = memo + transactionSend.userId = sender.id + transactionSend.linkedUserId = recipient.id + transactionSend.amount = amount.mul(-1) + transactionSend.balance = sendBalance.balance + transactionSend.balanceDate = receivedCallDate + transactionSend.decay = sendBalance.decay.decay + transactionSend.decayStart = sendBalance.decay.start + transactionSend.previous = sendBalance.lastTransactionId + transactionSend.transactionLinkId = transactionLink ? transactionLink.id : null + await queryRunner.manager.insert(dbTransaction, transactionSend) ->> Database is cool + const transactionReceive = new dbTransaction() + transactionReceive.typeId = TransactionTypeId.RECEIVE + transactionReceive.memo = memo + transactionReceive.userId = recipient.id + transactionReceive.linkedUserId = sender.id + transactionReceive.amount = amount + const receiveBalance = await calculateBalance(recipient.id, amount, receivedCallDate) + transactionReceive.balance = receiveBalance ? receiveBalance.balance : amount + transactionReceive.balanceDate = receivedCallDate + transactionReceive.decay = receiveBalance ? receiveBalance.decay.decay : new Decimal(0) + transactionReceive.decayStart = receiveBalance ? receiveBalance.decay.start : null + transactionReceive.previous = receiveBalance ? receiveBalance.lastTransactionId : null + transactionReceive.linkedTransactionId = transactionSend.id + transactionReceive.transactionLinkId = transactionLink ? transactionLink.id : null + await queryRunner.manager.insert(dbTransaction, transactionReceive) -### Start login server -> docker-compose up login-server community-server nginx ->> Login & community servers and nginx proxy are up and running + // Save linked transaction id for send + transactionSend.linkedTransactionId = transactionReceive.id + await queryRunner.manager.update(dbTransaction, { id: transactionSend.id }, transactionSend) -## Build database -> cd database -> yarn -> yarn build -> cd .. ->> Database has been built successful - -### Start backend (no docker for debugging) -> cd backend -> yarn -> yarn dev ->> Backend is up and running - -### Create users -> chromium http://localhost:4000/graphql -> mutation{createUser(email: "receiver@user.net", firstName: "Receiver", lastName: "user", password: "123!AAAb", language: "de")} -> mutation{createUser(email: "sender@user.net", firstName: "Sender", lastName: "user", password: "123!AAAb", language: "de")} -> mutation{createUser(email: "creator@user.net", firstName: "Creator", lastName: "user", password: "123!AAAb", language: "de")} ->> Verify you have 3 entries in `login_users`, `login_user_backups` and `state_users` - -### make creator an admin -> INSERT INTO login_user_roles (id, user_id, role_id) VALUES (NULL, '3', '1'); -> UPDATE login_users SET email_checked = 1 WHERE id = 3; -> uncomment line: 19 in community_server/src/Controller/ServerUsersController.php -> chromium http://localhost/server-users/add -> create user `creator` `123` `creator@different.net` ->> verify you have 1 entry in `server_users` -> login with user on http://localhost/server-users -> activate server user by changing the corresponding flag in the interface -> navigate to http://localhost/transaction-creations/create-multi -> create 1000GDD for user sender@user.net -> navigate to http://localhost -> login with `creator@user.net` `123!AAAb` -> confirm transaction (top right corner - click the thingy, click the green button `Transaktion abschließen`) - -### the test: -> chromium http://localhost:4000/graphql -> query{login(email: "sender@user.net", password: "123!AAAb"){pubkey}} ->> copy token from network tab (inspect) -> mutation{sendCoins(email: "receiver@user.net", amount: 10.0, memo: "Hier!")} -> mutation{sendCoins(email: "receiver@user.net", amount: 10.0, memo: "Hier!")} -> Headers: {"Authorization": "Bearer ${token}"} ->> Verify via Database that stuff is as it should see `state_balance` & `transaction_send_coins` - -### create decay block -> chromium http://localhost/transactions/add -> login with `creator` `123` -> select `decay start` -> press submit -> wait for at least 0.02 display of decay on user sender@user.net on old frontend, this should be aprox 10min -> chromium http://localhost:4000/graphql -> query{login(email: "sender@user.net", password: "123!AAAb"){pubkey}} ->> copy token from network tab (inspect) -> mutation{sendCoins(email: "receiver@user.net", amount: 10.0, memo: "Hier!")} ->> verify in `transaction_send_coins` that a decay was taken into account ->> same in `state_balances` ->> now check the old frontend ->>> sender@user.net should have a decay of 0.02 ->>> while receiver@user.net should have zero decay on anything (old frontend) - -### Export data -> docker-compose up phpmyadmin -> chromium http://localhost:8074/ -> select gradido_community -> export -> select custom -> untick structure -> ok - -## Results -NOTE: We decided not to write the `transaction_signatures` since its unused. This is the main difference. -NOTE: We fixed a bug in the `state_user_transactions code` with the new implementation of apollo - - -Master: - --- --- Dumping data for table `state_user_transactions` --- - -INSERT INTO `state_user_transactions` (`id`, `state_user_id`, `transaction_id`, `transaction_type_id`, `balance`, `balance_date`) VALUES -(1, 2, 1, 1, 10000000, '2021-11-05 12:45:18'), -(2, 2, 2, 2, 9900000, '2021-11-05 12:48:35'), -(3, 1, 2, 2, 100000, '2021-11-05 12:48:35'), -(4, 2, 3, 2, 9800000, '2021-11-05 12:49:07'), -(5, 1, 3, 2, 200000, '2021-11-05 12:49:07'), -(6, 2, 5, 2, 9699845, '2021-11-05 13:03:50'), -(7, 1, 5, 2, 99996, '2021-11-05 13:03:50'); - --- --- Dumping data for table `transactions` --- - -INSERT INTO `transactions` (`id`, `state_group_id`, `transaction_type_id`, `tx_hash`, `memo`, `received`, `blockchain_type_id`) VALUES -(1, NULL, 1, 0x9ccdcd01ccb6320c09c2d1da2f0bf735a95ece0e7c1df6bbff51918fbaec061700000000000000000000000000000000, '', '2021-11-05 12:45:18', 1), -(2, NULL, 2, 0x58d7706a67fa4ff4b8038168c6be39a2963d7e28e9d3872759ad09c519fe093700000000000000000000000000000000, 'Hier!', '2021-11-05 12:48:35', 1), -(3, NULL, 2, 0x427cd214f92ef35af671129d50edc5a478c53d1e464f285b7615d9794a69f69b00000000000000000000000000000000, 'Hier!', '2021-11-05 12:49:07', 1), -(4, NULL, 9, 0x32807368f0906a21b94c072599795bc9eeab88fb565df82e85cc62a4fdcde48500000000000000000000000000000000, '', '2021-11-05 12:51:51', 1), -(5, NULL, 2, 0x75eb729e0f60a1c8cead1342955853d2440d7a2ea57dfef6d4a18bff0d94491e00000000000000000000000000000000, 'Hier!', '2021-11-05 13:03:50', 1); - --- --- Dumping data for table `transaction_signatures` --- - -INSERT INTO `transaction_signatures` (`id`, `transaction_id`, `signature`, `pubkey`) VALUES -(1, 1, 0x5888edcdcf77aaadad6d321882903bc831d7416f17213fd5020a764365b5fcb336e4c7917385a1278ea44ccdb31eac4a09e448053b5e3f8f1fe5da3baf53c008, 0xd5b20f8dee415038bfa2b6b0e1b40ff54850351109444863b04d6d28825b7b7d), -(2, 2, 0xf6fef428f8f22faf7090f7d740e6088d1d90c58ae92d757117d7d91d799e659f3a3a0c65a3fd97cbde798e761f9d23eff13e8810779a184c97c411f28e7c4608, 0xdc74a589004377ab14836dce68ce2ca34e5b17147cd78ad4b3afe8137524ae8a), -(3, 3, 0x8ebe9730c6cf61f56ef401d6f2bd229f3c298ca3c2791ee9137e4827b7af6c6d6566fca616eb1fe7adc2e4d56b5c7350ae3990c9905580630fa75ecffca8e001, 0xdc74a589004377ab14836dce68ce2ca34e5b17147cd78ad4b3afe8137524ae8a), -(4, 5, 0x50cf418f7e217391e89ab9c2879ae68d7c7c597d846b4fe1c082b5b16e5d0c85c328fbf48ad3490bcfe94f446700ae0a4b0190e76d26cc752abced58f480c80f, 0xdc74a589004377ab14836dce68ce2ca34e5b17147cd78ad4b3afe8137524ae8a); - -This Feature Branch: - - --- --- Dumping data for table `state_user_transactions` --- - -INSERT INTO `state_user_transactions` (`id`, `state_user_id`, `transaction_id`, `transaction_type_id`, `balance`, `balance_date`) VALUES -(1, 2, 1, 1, 10000000, '2021-11-05 00:25:46'), -(12, 2, 7, 2, 9900000, '2021-11-05 00:55:37'), -(13, 1, 7, 2, 100000, '2021-11-05 00:55:37'), -(14, 2, 8, 2, 9800000, '2021-11-05 01:00:04'), -(15, 1, 8, 2, 200000, '2021-11-05 01:00:04'), -(16, 2, 10, 2, 9699772, '2021-11-05 01:17:41'), -(17, 1, 10, 2, 299995, '2021-11-05 01:17:41'); - --- --- Dumping data for table `transactions` --- - -INSERT INTO `transactions` (`id`, `state_group_id`, `transaction_type_id`, `tx_hash`, `memo`, `received`, `blockchain_type_id`) VALUES -(1, NULL, 1, 0xdd030d475479877587d927ed9024784ba62266cf1f3d87862fc98ad68f7b26e400000000000000000000000000000000, '', '2021-11-05 00:25:46', 1), -(7, NULL, 2, NULL, 'Hier!', '2021-11-05 00:55:37', 1), -(8, NULL, 2, NULL, 'Hier!', '2021-11-05 01:00:04', 1), -(9, NULL, 9, 0xb1cbedbf126aa35f5edbf06e181c415361d05228ab4da9d19a4595285a673dfa00000000000000000000000000000000, '', '2021-11-05 01:05:34', 1), -(10, NULL, 2, NULL, 'Hier!', '2021-11-05 01:17:41', 1); - --- --- Dumping data for table `transaction_signatures` --- - -INSERT INTO `transaction_signatures` (`id`, `transaction_id`, `signature`, `pubkey`) VALUES -(1, 1, 0x60d632479707e5d01cdc32c3326b5a5bae11173a0c06b719ee7b552f9fd644de1a0cd4afc207253329081d39dac1a63421f51571d836995c649fc39afac7480a, 0x48c45cb4fea925e83850f68f2fa8f27a1a4ed1bcba68cdb59fcd86adef3f52ee); -*/ - -// Helper function -async function calculateAndAddDecayTransactions( - userTransactions: dbUserTransaction[], - user: dbUser, - decay: boolean, - skipFirstTransaction: boolean, -): Promise { - const finalTransactions: Transaction[] = [] - const transactionIds: number[] = [] - const involvedUserIds: number[] = [] - - userTransactions.forEach((userTransaction: dbUserTransaction) => { - transactionIds.push(userTransaction.transactionId) - }) - - const transactionRepository = getCustomRepository(TransactionRepository) - const transactions = await transactionRepository.joinFullTransactionsByIds(transactionIds) - - const transactionIndiced: dbTransaction[] = [] - transactions.forEach((transaction: dbTransaction) => { - transactionIndiced[transaction.id] = transaction - if (transaction.transactionTypeId === TransactionTypeId.SEND) { - involvedUserIds.push(transaction.transactionSendCoin.userId) - involvedUserIds.push(transaction.transactionSendCoin.recipiantUserId) - } - }) - // remove duplicates - // https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates - const involvedUsersUnique = involvedUserIds.filter((v, i, a) => a.indexOf(v) === i) - const userRepository = getCustomRepository(UserRepository) - const userIndiced = await userRepository.getUsersIndiced(involvedUsersUnique) - - const decayStartTransaction = await transactionRepository.findDecayStartBlock() - - for (let i = 0; i < userTransactions.length; i++) { - const userTransaction = userTransactions[i] - const transaction = transactionIndiced[userTransaction.transactionId] - const finalTransaction = new Transaction() - finalTransaction.transactionId = transaction.id - finalTransaction.date = transaction.received.toISOString() - finalTransaction.memo = transaction.memo - finalTransaction.totalBalance = roundFloorFrom4(userTransaction.balance) - const previousTransaction = i > 0 ? userTransactions[i - 1] : null - - if (previousTransaction) { - const currentTransaction = userTransaction - const decay = await calculateDecayWithInterval( - previousTransaction.balance, - previousTransaction.balanceDate, - currentTransaction.balanceDate, + if (transactionLink) { + transactionLink.redeemedAt = receivedCallDate + transactionLink.redeemedBy = recipient.id + await queryRunner.manager.update( + dbTransactionLink, + { id: transactionLink.id }, + transactionLink, ) - const balance = previousTransaction.balance - decay.balance - - if ( - decayStartTransaction && - decayStartTransaction.received < currentTransaction.balanceDate - ) { - finalTransaction.decay = decay - finalTransaction.decay.balance = roundFloorFrom4(balance) - if ( - decayStartTransaction && - previousTransaction.transactionId < decayStartTransaction.id && - currentTransaction.transactionId > decayStartTransaction.id - ) { - finalTransaction.decay.decayStartBlock = ( - decayStartTransaction.received.getTime() / 1000 - ).toString() - } - } } - // sender or receiver when user has sent money - // group name if creation - // type: gesendet / empfangen / geschöpft - // transaktion nr / id - // date - // balance - if (userTransaction.transactionTypeId === TransactionTypeId.CREATION) { - // creation - const creation = transaction.transactionCreation - - finalTransaction.name = 'Gradido Akademie' - finalTransaction.type = TransactionType.CREATION - // finalTransaction.targetDate = creation.targetDate - finalTransaction.balance = roundFloorFrom4(creation.amount) - } else if (userTransaction.transactionTypeId === TransactionTypeId.SEND) { - // send coin - const sendCoin = transaction.transactionSendCoin - let otherUser: dbUser | undefined - finalTransaction.balance = roundFloorFrom4(sendCoin.amount) - if (sendCoin.userId === user.id) { - finalTransaction.type = TransactionType.SEND - otherUser = userIndiced[sendCoin.recipiantUserId] - // finalTransaction.pubkey = sendCoin.recipiantPublic - } else if (sendCoin.recipiantUserId === user.id) { - finalTransaction.type = TransactionType.RECIEVE - otherUser = userIndiced[sendCoin.userId] - // finalTransaction.pubkey = sendCoin.senderPublic - } else { - throw new Error('invalid transaction') - } - if (otherUser) { - finalTransaction.name = otherUser.firstName + ' ' + otherUser.lastName - finalTransaction.email = otherUser.email - } - } - if (i > 0 || !skipFirstTransaction) { - finalTransactions.push(finalTransaction) - } - - if (i === userTransactions.length - 1 && decay) { - const now = new Date() - const decay = await calculateDecayWithInterval( - userTransaction.balance, - userTransaction.balanceDate, - now.getTime(), - ) - const balance = userTransaction.balance - decay.balance - - const decayTransaction = new Transaction() - decayTransaction.type = 'decay' - decayTransaction.balance = roundCeilFrom4(balance) - decayTransaction.decayDuration = decay.decayDuration - decayTransaction.decayStart = decay.decayStart - decayTransaction.decayEnd = decay.decayEnd - finalTransactions.push(decayTransaction) - } + await queryRunner.commitTransaction() + } catch (e) { + await queryRunner.rollbackTransaction() + throw new Error(`Transaction was not successful: ${e}`) + } finally { + await queryRunner.release() } - return finalTransactions -} - -// Helper function -async function listTransactions( - currentPage: number, - pageSize: number, - order: Order, - user: dbUser, - onlyCreations: boolean, -): Promise { - let limit = pageSize - let offset = 0 - let skipFirstTransaction = false - if (currentPage > 1) { - offset = (currentPage - 1) * pageSize - 1 - limit++ - } - - if (offset && order === Order.ASC) { - offset-- - } - const userTransactionRepository = getCustomRepository(UserTransactionRepository) - let [userTransactions, userTransactionsCount] = await userTransactionRepository.findByUserPaged( - user.id, - limit, - offset, - order, - onlyCreations, - ) - skipFirstTransaction = userTransactionsCount > offset + limit - const decay = !(currentPage > 1) - let transactions: Transaction[] = [] - if (userTransactions.length) { - if (order === Order.DESC) { - userTransactions = userTransactions.reverse() - } - transactions = await calculateAndAddDecayTransactions( - userTransactions, - user, - decay, - skipFirstTransaction, - ) - if (order === Order.DESC) { - transactions = transactions.reverse() - } - } - - const transactionList = new TransactionList() - transactionList.count = userTransactionsCount - transactionList.transactions = transactions - return transactionList -} - -// helper helper function -async function updateStateBalance( - user: dbUser, - centAmount: number, - received: Date, - queryRunner: QueryRunner, -): Promise { - const balanceRepository = getCustomRepository(BalanceRepository) - let balance = await balanceRepository.findByUser(user.id) - if (!balance) { - balance = new dbBalance() - balance.userId = user.id - balance.amount = centAmount - balance.modified = received - } else { - const decaiedBalance = await calculateDecay(balance.amount, balance.recordDate, received).catch( - () => { - throw new Error('error by calculating decay') - }, - ) - balance.amount = Number(decaiedBalance) + centAmount - balance.modified = new Date() - } - if (balance.amount <= 0) { - throw new Error('error new balance <= 0') - } - balance.recordDate = received - return queryRunner.manager.save(balance).catch((error) => { - throw new Error('error saving balance:' + error) + // send notification email + // TODO: translate + await sendTransactionReceivedEmail({ + senderFirstName: sender.firstName, + senderLastName: sender.lastName, + recipientFirstName: recipient.firstName, + recipientLastName: recipient.lastName, + email: recipient.email, + senderEmail: sender.email, + amount, + memo, }) -} -// helper helper function -async function addUserTransaction( - user: dbUser, - transaction: dbTransaction, - centAmount: number, - queryRunner: QueryRunner, -): Promise { - let newBalance = centAmount - const userTransactionRepository = getCustomRepository(UserTransactionRepository) - const lastUserTransaction = await userTransactionRepository.findLastForUser(user.id) - if (lastUserTransaction) { - newBalance += Number( - await calculateDecay( - Number(lastUserTransaction.balance), - lastUserTransaction.balanceDate, - transaction.received, - ).catch(() => { - throw new Error('error by calculating decay') - }), - ) - } - - if (newBalance <= 0) { - throw new Error('error new balance <= 0') - } - - const newUserTransaction = new dbUserTransaction() - newUserTransaction.userId = user.id - newUserTransaction.transactionId = transaction.id - newUserTransaction.transactionTypeId = transaction.transactionTypeId - newUserTransaction.balance = newBalance - newUserTransaction.balanceDate = transaction.received - - return queryRunner.manager.save(newUserTransaction).catch((error) => { - throw new Error('Error saving user transaction: ' + error) - }) -} - -async function getPublicKey(email: string): Promise { - const loginUserRepository = getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findOne({ email: email }) - // User not found - if (!loginUser) { - return null - } - - return loginUser.pubKey.toString('hex') + return true } @Resolver() @@ -472,52 +131,110 @@ export class TransactionResolver { @Query(() => TransactionList) async transactionList( @Args() - { - currentPage = 1, - pageSize = 25, - order = Order.DESC, - onlyCreations = false, - userId, - }: Paginated, + { currentPage = 1, pageSize = 25, order = Order.DESC }: Paginated, @Ctx() context: any, ): Promise { - // load user - const userRepository = getCustomRepository(UserRepository) - let userEntity: dbUser | undefined - if (userId) { - userEntity = await userRepository.findOneOrFail({ id: userId }) - } else { - userEntity = await userRepository.findByPubkeyHex(context.pubKey) - } + const now = new Date() + const user = context.user - const transactions = await listTransactions( - currentPage, - pageSize, - order, - userEntity, - onlyCreations, + // find current balance + const lastTransaction = await dbTransaction.findOne( + { userId: user.id }, + { order: { balanceDate: 'DESC' } }, ) - // get gdt sum - const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { - email: userEntity.email, - }) - if (!resultGDTSum.success) throw new Error(resultGDTSum.data) - transactions.gdtSum = resultGDTSum.data.sum || 0 - - // get balance - const balanceRepository = getCustomRepository(BalanceRepository) - const balanceEntity = await balanceRepository.findByUser(userEntity.id) - if (balanceEntity) { - const now = new Date() - transactions.balance = roundFloorFrom4(balanceEntity.amount) - transactions.decay = roundFloorFrom4( - await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), - ) - transactions.decayDate = now.toString() + // get GDT + let balanceGDT = null + try { + const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { + email: user.email, + }) + if (!resultGDTSum.success) { + throw new Error('Call not successful') + } + balanceGDT = Number(resultGDTSum.data.sum) || 0 + } catch (err: any) { + // eslint-disable-next-line no-console + console.log('Could not query GDT Server', err) } - return transactions + if (!lastTransaction) { + return new TransactionList(new Decimal(0), [], 0, 0, balanceGDT) + } + + // find transactions + // first page can contain 26 due to virtual decay transaction + const offset = (currentPage - 1) * pageSize + const transactionRepository = getCustomRepository(TransactionRepository) + const [userTransactions, userTransactionsCount] = await transactionRepository.findByUserPaged( + user.id, + pageSize, + offset, + order, + ) + + // find involved users; I am involved + const involvedUserIds: number[] = [user.id] + userTransactions.forEach((transaction: dbTransaction) => { + if (transaction.linkedUserId && !involvedUserIds.includes(transaction.linkedUserId)) { + involvedUserIds.push(transaction.linkedUserId) + } + }) + // We need to show the name for deleted users for old transactions + const involvedDbUsers = await dbUser + .createQueryBuilder() + .withDeleted() + .where('id IN (:...userIds)', { userIds: involvedUserIds }) + .getMany() + const involvedUsers = involvedDbUsers.map((u) => new User(u)) + + const self = new User(user) + const transactions: Transaction[] = [] + + const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) + const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate, transactionLinkcount } = + await transactionLinkRepository.summary(user.id, now) + + // decay & link transactions + if (currentPage === 1 && order === Order.DESC) { + transactions.push( + virtualDecayTransaction(lastTransaction.balance, lastTransaction.balanceDate, now, self), + ) + // virtual transaction for pending transaction-links sum + if (sumHoldAvailableAmount.greaterThan(0)) { + transactions.push( + virtualLinkTransaction( + lastTransaction.balance.minus(sumHoldAvailableAmount.toString()), + sumAmount.mul(-1), + sumHoldAvailableAmount.mul(-1), + sumHoldAvailableAmount.minus(sumAmount.toString()).mul(-1), + firstDate || now, + lastDate || now, + self, + ), + ) + } + } + + // transactions + userTransactions.forEach((userTransaction) => { + const linkedUser = + userTransaction.typeId === TransactionTypeId.CREATION + ? communityUser + : involvedUsers.find((u) => u.id === userTransaction.linkedUserId) + transactions.push(new Transaction(userTransaction, self, linkedUser)) + }) + + // Construct Result + return new TransactionList( + calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now).balance.minus( + sumHoldAvailableAmount.toString(), + ), + transactions, + userTransactionsCount, + transactionLinkcount, + balanceGDT, + ) } @Authorized([RIGHTS.SEND_COINS]) @@ -525,149 +242,27 @@ export class TransactionResolver { async sendCoins( @Args() { email, amount, memo }: TransactionSendArgs, @Ctx() context: any, - ): Promise { + ): Promise { // TODO this is subject to replay attacks - // validate sender user (logged in) - const userRepository = getCustomRepository(UserRepository) - const senderUser = await userRepository.findByPubkeyHex(context.pubKey) - if (senderUser.pubkey.length !== 32) { + const senderUser = context.user + if (senderUser.pubKey.length !== 32) { throw new Error('invalid sender public key') } - if (!hasUserAmount(senderUser, amount)) { - throw new Error("user hasn't enough GDD") - } // validate recipient user - // TODO: the detour over the public key is unnecessary - const recipiantPublicKey = await getPublicKey(email) - if (!recipiantPublicKey) { - throw new Error('recipiant not known') + const recipientUser = await dbUser.findOne({ email: email }, { withDeleted: true }) + if (!recipientUser) { + throw new Error('recipient not known') } - if (!isHexPublicKey(recipiantPublicKey)) { - throw new Error('invalid recipiant public key') + if (recipientUser.deletedAt) { + throw new Error('The recipient account was deleted') } - const recipiantUser = await userRepository.findByPubkeyHex(recipiantPublicKey) - if (!recipiantUser) { - throw new Error('Cannot find recipiant user by local send coins transaction') - } else if (recipiantUser.disabled) { - throw new Error('recipiant user account is disabled') + if (!isHexPublicKey(recipientUser.pubKey.toString('hex'))) { + throw new Error('invalid recipient public key') } - // validate amount - if (amount <= 0) { - throw new Error('invalid amount') - } + await executeTransaction(amount, memo, senderUser, recipientUser) - const centAmount = Math.trunc(amount * 10000) - - const queryRunner = getConnection().createQueryRunner() - await queryRunner.connect() - await queryRunner.startTransaction('READ UNCOMMITTED') - try { - // transaction - let transaction = new dbTransaction() - transaction.transactionTypeId = TransactionTypeId.SEND - transaction.memo = memo - - // TODO: NO! this is problematic in its construction - const insertResult = await queryRunner.manager.insert(dbTransaction, transaction) - transaction = await queryRunner.manager - .findOneOrFail(dbTransaction, insertResult.generatedMaps[0].id) - .catch((error) => { - throw new Error('error loading saved transaction: ' + error) - }) - - // Insert Transaction: sender - amount - const senderUserTransactionBalance = await addUserTransaction( - senderUser, - transaction, - -centAmount, - queryRunner, - ) - // Insert Transaction: recipient + amount - const recipiantUserTransactionBalance = await addUserTransaction( - recipiantUser, - transaction, - centAmount, - queryRunner, - ) - - // Update Balance: sender - amount - const senderStateBalance = await updateStateBalance( - senderUser, - -centAmount, - transaction.received, - queryRunner, - ) - // Update Balance: recipiant + amount - const recipiantStateBalance = await updateStateBalance( - recipiantUser, - centAmount, - transaction.received, - queryRunner, - ) - - if (senderStateBalance.amount !== senderUserTransactionBalance.balance) { - throw new Error('db data corrupted, sender') - } - if (recipiantStateBalance.amount !== recipiantUserTransactionBalance.balance) { - throw new Error('db data corrupted, recipiant') - } - - // transactionSendCoin - const transactionSendCoin = new dbTransactionSendCoin() - transactionSendCoin.transactionId = transaction.id - transactionSendCoin.userId = senderUser.id - transactionSendCoin.senderPublic = senderUser.pubkey - transactionSendCoin.recipiantUserId = recipiantUser.id - transactionSendCoin.recipiantPublic = Buffer.from(recipiantPublicKey, 'hex') - transactionSendCoin.amount = centAmount - transactionSendCoin.senderFinalBalance = senderStateBalance.amount - await queryRunner.manager.save(transactionSendCoin).catch((error) => { - throw new Error('error saving transaction send coin: ' + error) - }) - - await queryRunner.manager.save(transaction).catch((error) => { - throw new Error('error saving transaction with tx hash: ' + error) - }) - - await queryRunner.commitTransaction() - } catch (e) { - await queryRunner.rollbackTransaction() - // TODO: This is broken code - we should never correct an autoincrement index in production - // according to dario it is required tho to properly work. The index of the table is used as - // index for the transaction which requires a chain without gaps - const count = await queryRunner.manager.count(dbTransaction) - // fix autoincrement value which seems not effected from rollback - await queryRunner - .query('ALTER TABLE `transactions` auto_increment = ?', [count]) - .catch((error) => { - // eslint-disable-next-line no-console - console.log('problems with reset auto increment: %o', error) - }) - throw e - } finally { - await queryRunner.release() - } - // send notification email - // TODO: translate - await sendEMail({ - from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, - to: `${recipiantUser.firstName} ${recipiantUser.lastName} <${recipiantUser.email}>`, - subject: 'Gradido Überweisung', - text: `Hallo ${recipiantUser.firstName} ${recipiantUser.lastName} - - Du hast soeben ${amount} GDD von ${senderUser.firstName} ${senderUser.lastName} erhalten. - ${senderUser.firstName} ${senderUser.lastName} schreibt: - - ${memo} - - Bitte antworte nicht auf diese E-Mail! - - Mit freundlichen Grüßen, - dein Gradido-Team`, - }) - - return 'success' + return true } } diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index d0c144e22..53f39668e 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -1,35 +1,49 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { createTestClient } from 'apollo-server-testing' -import gql from 'graphql-tag' +import { testEnvironment, headerPushMock, resetToken, cleanDB } from '@test/helpers' +import { userFactory } from '@/seeds/factory/user' +import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' +import { createUser, setPassword } from '@/seeds/graphql/mutations' +import { login, logout } from '@/seeds/graphql/queries' import { GraphQLError } from 'graphql' -import createServer from '../../server/createServer' -import { resetDB, initialize } from '@dbTools/helpers' -import { getRepository } from 'typeorm' -import { LoginUser } from '@entity/LoginUser' -import { LoginUserBackup } from '@entity/LoginUserBackup' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { User } from '@entity/User' -import CONFIG from '../../config' -import { sendEMail } from '../../util/sendEMail' +import CONFIG from '@/config' +import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' -jest.mock('../../util/sendEMail', () => { +// import { klicktippSignIn } from '@/apis/KlicktippController' + +jest.mock('@/mailer/sendAccountActivationEmail', () => { return { __esModule: true, - sendEMail: jest.fn(), + sendAccountActivationEmail: jest.fn(), } }) -let mutate: any -let con: any +/* +jest.mock('@/apis/KlicktippController', () => { + return { + __esModule: true, + klicktippSignIn: jest.fn(), + } +}) +*/ + +let mutate: any, query: any, con: any +let testEnv: any beforeAll(async () => { - const server = await createServer({}) - con = server.con - mutate = createTestClient(server.apollo).mutate - await initialize() - await resetDB() + testEnv = await testEnvironment() + mutate = testEnv.mutate + query = testEnv.query + con = testEnv.con + await cleanDB() +}) + +afterAll(async () => { + await cleanDB() + await con.close() }) describe('UserResolver', () => { @@ -42,106 +56,52 @@ describe('UserResolver', () => { publisherId: 1234, } - const mutation = gql` - mutation ( - $email: String! - $firstName: String! - $lastName: String! - $language: String! - $publisherId: Int - ) { - createUser( - email: $email - firstName: $firstName - lastName: $lastName - language: $language - publisherId: $publisherId - ) - } - ` - let result: any let emailOptIn: string - let newUser: User beforeAll(async () => { - result = await mutate({ mutation, variables }) + jest.clearAllMocks() + result = await mutate({ mutation: createUser, variables }) }) afterAll(async () => { - await resetDB() + await cleanDB() }) it('returns success', () => { - expect(result).toEqual(expect.objectContaining({ data: { createUser: 'success' } })) + expect(result).toEqual( + expect.objectContaining({ data: { createUser: { id: expect.any(Number) } } }), + ) }) describe('valid input data', () => { - let loginUser: LoginUser[] let user: User[] - let loginUserBackup: LoginUserBackup[] let loginEmailOptIn: LoginEmailOptIn[] beforeAll(async () => { - loginUser = await getRepository(LoginUser).createQueryBuilder('login_user').getMany() - user = await getRepository(User).createQueryBuilder('state_user').getMany() - loginUserBackup = await getRepository(LoginUserBackup) - .createQueryBuilder('login_user_backup') - .getMany() - loginEmailOptIn = await getRepository(LoginEmailOptIn) - .createQueryBuilder('login_email_optin') - .getMany() - newUser = user[0] + user = await User.find() + loginEmailOptIn = await LoginEmailOptIn.find() emailOptIn = loginEmailOptIn[0].verificationCode.toString() }) describe('filling all tables', () => { it('saves the user in login_user table', () => { - expect(loginUser).toEqual([ + expect(user).toEqual([ { id: expect.any(Number), email: 'peter@lustig.de', firstName: 'Peter', lastName: 'Lustig', - username: '', - description: '', password: '0', pubKey: null, privKey: null, emailHash: expect.any(Buffer), createdAt: expect.any(Date), emailChecked: false, - passphraseShown: false, - language: 'de', - disabled: false, - groupId: 1, - publisherId: 1234, - }, - ]) - }) - - it('saves the user in state_user table', () => { - expect(user).toEqual([ - { - id: expect.any(Number), - indexId: 0, - groupId: 0, - pubkey: expect.any(Buffer), - email: 'peter@lustig.de', - firstName: 'Peter', - lastName: 'Lustig', - username: '', - disabled: false, - }, - ]) - }) - - it('saves the user in login_user_backup table', () => { - expect(loginUserBackup).toEqual([ - { - id: expect.any(Number), passphrase: expect.any(String), - userId: loginUser[0].id, - mnemonicType: 2, + language: 'de', + deletedAt: null, + publisherId: 1234, + referrerId: null, }, ]) }) @@ -150,7 +110,7 @@ describe('UserResolver', () => { expect(loginEmailOptIn).toEqual([ { id: expect.any(Number), - userId: loginUser[0].id, + userId: user[0].id, verificationCode: expect.any(String), emailOptInTypeId: 1, createdAt: expect.any(Date), @@ -164,21 +124,22 @@ describe('UserResolver', () => { describe('account activation email', () => { it('sends an account activation email', () => { - const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace(/\$1/g, emailOptIn) - expect(sendEMail).toBeCalledWith({ - from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, - to: `${newUser.firstName} ${newUser.lastName} <${newUser.email}>`, - subject: 'Gradido: E-Mail Überprüfung', - text: - expect.stringContaining(`Hallo ${newUser.firstName} ${newUser.lastName},`) && - expect.stringContaining(activationLink), + const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( + /{optin}/g, + emailOptIn, + ).replace(/{code}/g, '') + expect(sendAccountActivationEmail).toBeCalledWith({ + link: activationLink, + firstName: 'Peter', + lastName: 'Lustig', + email: 'peter@lustig.de', }) }) }) describe('email already exists', () => { it('throws an error', async () => { - await expect(mutate({ mutation, variables })).resolves.toEqual( + await expect(mutate({ mutation: createUser, variables })).resolves.toEqual( expect.objectContaining({ errors: [new GraphQLError('User already exists.')], }), @@ -189,12 +150,10 @@ describe('UserResolver', () => { describe('unknown language', () => { it('sets "de" as default language', async () => { await mutate({ - mutation, + mutation: createUser, variables: { ...variables, email: 'bibi@bloxberg.de', language: 'es' }, }) - await expect( - getRepository(LoginUser).createQueryBuilder('login_user').getMany(), - ).resolves.toEqual( + await expect(User.find()).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ email: 'bibi@bloxberg.de', @@ -208,12 +167,10 @@ describe('UserResolver', () => { describe('no publisher id', () => { it('sets publisher id to null', async () => { await mutate({ - mutation, + mutation: createUser, variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined }, }) - await expect( - getRepository(LoginUser).createQueryBuilder('login_user').getMany(), - ).resolves.toEqual( + await expect(User.find()).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ email: 'raeuber@hotzenplotz.de', @@ -224,9 +181,237 @@ describe('UserResolver', () => { }) }) }) -}) -afterAll(async () => { - await resetDB(true) - await con.close() + describe('setPassword', () => { + const createUserVariables = { + email: 'peter@lustig.de', + firstName: 'Peter', + lastName: 'Lustig', + language: 'de', + publisherId: 1234, + } + + let result: any + let emailOptIn: string + + describe('valid optin code and valid password', () => { + let newUser: any + + beforeAll(async () => { + await mutate({ mutation: createUser, variables: createUserVariables }) + const loginEmailOptIn = await LoginEmailOptIn.find() + emailOptIn = loginEmailOptIn[0].verificationCode.toString() + result = await mutate({ + mutation: setPassword, + variables: { code: emailOptIn, password: 'Aa12345_' }, + }) + newUser = await User.find() + }) + + afterAll(async () => { + await cleanDB() + }) + + it('sets email checked to true', () => { + expect(newUser[0].emailChecked).toBeTruthy() + }) + + it('updates the password', () => { + expect(newUser[0].password).toEqual('3917921995996627700') + }) + + it('removes the optin', async () => { + await expect(LoginEmailOptIn.find()).resolves.toHaveLength(0) + }) + + /* + it('calls the klicktipp API', () => { + expect(klicktippSignIn).toBeCalledWith( + user[0].email, + user[0].language, + user[0].firstName, + user[0].lastName, + ) + }) + */ + + it('returns true', () => { + expect(result).toBeTruthy() + }) + }) + + describe('no valid password', () => { + beforeAll(async () => { + await mutate({ mutation: createUser, variables: createUserVariables }) + const loginEmailOptIn = await LoginEmailOptIn.find() + emailOptIn = loginEmailOptIn[0].verificationCode.toString() + result = await mutate({ + mutation: setPassword, + variables: { code: emailOptIn, password: 'not-valid' }, + }) + }) + + afterAll(async () => { + await cleanDB() + }) + + it('throws an error', () => { + expect(result).toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError( + 'Please enter a valid password with at least 8 characters, upper and lower case letters, at least one number and one special character!', + ), + ], + }), + ) + }) + }) + + describe('no valid optin code', () => { + beforeAll(async () => { + await mutate({ mutation: createUser, variables: createUserVariables }) + result = await mutate({ + mutation: setPassword, + variables: { code: 'not valid', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + }) + + it('throws an error', () => { + expect(result).toEqual( + expect.objectContaining({ + errors: [new GraphQLError('Could not login with emailVerificationCode')], + }), + ) + }) + }) + }) + + describe('login', () => { + const variables = { + email: 'bibi@bloxberg.de', + password: 'Aa12345_', + publisherId: 1234, + } + + let result: User + + afterAll(async () => { + await cleanDB() + }) + + describe('no users in database', () => { + beforeAll(async () => { + result = await query({ query: login, variables }) + }) + + it('throws an error', () => { + expect(result).toEqual( + expect.objectContaining({ + errors: [new GraphQLError('No user with this credentials')], + }), + ) + }) + }) + + describe('user is in database and correct login data', () => { + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + result = await query({ query: login, variables }) + }) + + afterAll(async () => { + await cleanDB() + }) + + it('returns the user object', () => { + expect(result).toEqual( + expect.objectContaining({ + data: { + login: { + coinanimation: true, + email: 'bibi@bloxberg.de', + firstName: 'Bibi', + hasElopage: false, + id: expect.any(Number), + isAdmin: false, + klickTipp: { + newsletterState: false, + }, + language: 'de', + lastName: 'Bloxberg', + publisherId: 1234, + }, + }, + }), + ) + }) + + it('sets the token in the header', () => { + expect(headerPushMock).toBeCalledWith({ key: 'token', value: expect.any(String) }) + }) + }) + + describe('user is in database and wrong password', () => { + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + }) + + afterAll(async () => { + await cleanDB() + }) + + it('returns an error', () => { + expect( + query({ query: login, variables: { ...variables, password: 'wrong' } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('No user with this credentials')], + }), + ) + }) + }) + }) + + describe('logout', () => { + describe('unauthenticated', () => { + it('throws an error', async () => { + resetToken() + await expect(query({ query: logout })).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + const variables = { + email: 'bibi@bloxberg.de', + password: 'Aa12345_', + } + + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + await query({ query: login, variables }) + }) + + afterAll(async () => { + await cleanDB() + }) + + it('returns true', async () => { + await expect(query({ query: logout })).resolves.toEqual( + expect.objectContaining({ + data: { logout: 'true' }, + errors: undefined, + }), + ) + }) + }) + }) }) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 2f98a2f6f..b24aa1b58 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -3,30 +3,26 @@ import fs from 'fs' import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql' -import { getConnection, getCustomRepository, getRepository, QueryRunner } from 'typeorm' -import CONFIG from '../../config' -import { User } from '../model/User' +import { getConnection, getCustomRepository, QueryRunner } from '@dbTools/typeorm' +import CONFIG from '@/config' +import { User } from '@model/User' import { User as DbUser } from '@entity/User' -import { encode } from '../../auth/JWT' -import CheckUsernameArgs from '../arg/CheckUsernameArgs' -import CreateUserArgs from '../arg/CreateUserArgs' -import UnsecureLoginArgs from '../arg/UnsecureLoginArgs' -import UpdateUserInfosArgs from '../arg/UpdateUserInfosArgs' -import { klicktippNewsletterStateMiddleware } from '../../middleware/klicktippMiddleware' -import { UserSettingRepository } from '../../typeorm/repository/UserSettingRepository' -import { LoginUserRepository } from '../../typeorm/repository/LoginUser' -import { Setting } from '../enum/Setting' -import { UserRepository } from '../../typeorm/repository/User' -import { LoginUser } from '@entity/LoginUser' -import { LoginUserBackup } from '@entity/LoginUserBackup' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import { encode } from '@/auth/JWT' +import CreateUserArgs from '@arg/CreateUserArgs' +import UnsecureLoginArgs from '@arg/UnsecureLoginArgs' +import UpdateUserInfosArgs from '@arg/UpdateUserInfosArgs' +import { klicktippNewsletterStateMiddleware } from '@/middleware/klicktippMiddleware' +import { UserSettingRepository } from '@repository/UserSettingRepository' +import { Setting } from '@enum/Setting' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' -import { sendEMail } from '../../util/sendEMail' -import { LoginElopageBuysRepository } from '../../typeorm/repository/LoginElopageBuys' -import { signIn } from '../../apis/KlicktippController' -import { RIGHTS } from '../../auth/RIGHTS' -import { ServerUserRepository } from '../../typeorm/repository/ServerUser' -import { ROLE_ADMIN } from '../../auth/ROLES' -import { randomBytes } from 'crypto' +import { sendResetPasswordEmail } from '@/mailer/sendResetPasswordEmail' +import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' +import { klicktippSignIn } from '@/apis/KlicktippController' +import { RIGHTS } from '@/auth/RIGHTS' +import { ROLE_ADMIN } from '@/auth/ROLES' +import { hasElopageBuys } from '@/util/hasElopageBuys' +import { ServerUser } from '@entity/ServerUser' const EMAIL_OPT_IN_RESET_PASSWORD = 2 const EMAIL_OPT_IN_REGISTER = 1 @@ -48,7 +44,10 @@ const isLanguage = (language: string): boolean => { } const PHRASE_WORD_COUNT = 24 -const WORDS = fs.readFileSync('src/config/mnemonic.english.txt').toString().split('\n') +const WORDS = fs + .readFileSync('src/config/mnemonic.uncompressed_buffer13116.txt') + .toString() + .split(',') const PassphraseGenerate = (): string[] => { const result = [] for (let i = 0; i < PHRASE_WORD_COUNT; i++) { @@ -153,21 +152,16 @@ const createEmailOptIn = async ( loginUserId: number, queryRunner: QueryRunner, ): Promise => { - const loginEmailOptInRepository = await getRepository(LoginEmailOptIn) - let emailOptIn = await loginEmailOptInRepository.findOne({ + let emailOptIn = await LoginEmailOptIn.findOne({ userId: loginUserId, emailOptInTypeId: EMAIL_OPT_IN_REGISTER, }) if (emailOptIn) { - const timeElapsed = Date.now() - new Date(emailOptIn.updatedAt).getTime() - if (timeElapsed <= parseInt(CONFIG.RESEND_TIME.toString()) * 60 * 1000) { - throw new Error( - 'email already sent less than ' + parseInt(CONFIG.RESEND_TIME.toString()) + ' minutes ago', - ) - } else { - emailOptIn.updatedAt = new Date() - emailOptIn.resendCount++ + if (isOptInCodeValid(emailOptIn)) { + throw new Error(`email already sent less than $(CONFIG.EMAIL_CODE_VALID_TIME} minutes ago`) } + emailOptIn.updatedAt = new Date() + emailOptIn.resendCount++ } else { emailOptIn = new LoginEmailOptIn() emailOptIn.verificationCode = random(64) @@ -182,31 +176,26 @@ const createEmailOptIn = async ( return emailOptIn } -const getOptInCode = async (loginUser: LoginUser): Promise => { - const loginEmailOptInRepository = await getRepository(LoginEmailOptIn) - let optInCode = await loginEmailOptInRepository.findOne({ - userId: loginUser.id, +const getOptInCode = async (loginUserId: number): Promise => { + let optInCode = await LoginEmailOptIn.findOne({ + userId: loginUserId, emailOptInTypeId: EMAIL_OPT_IN_RESET_PASSWORD, }) - // Check for 10 minute delay + // Check for `CONFIG.EMAIL_CODE_VALID_TIME` minute delay if (optInCode) { - const timeElapsed = Date.now() - new Date(optInCode.updatedAt).getTime() - if (timeElapsed <= parseInt(CONFIG.RESEND_TIME.toString()) * 60 * 1000) { - throw new Error( - 'email already sent less than ' + parseInt(CONFIG.RESEND_TIME.toString()) + ' minutes ago', - ) - } else { - optInCode.updatedAt = new Date() - optInCode.resendCount++ + if (isOptInCodeValid(optInCode)) { + throw new Error(`email already sent less than $(CONFIG.EMAIL_CODE_VALID_TIME} minutes ago`) } + optInCode.updatedAt = new Date() + optInCode.resendCount++ } else { optInCode = new LoginEmailOptIn() optInCode.verificationCode = random(64) - optInCode.userId = loginUser.id + optInCode.userId = loginUserId optInCode.emailOptInTypeId = EMAIL_OPT_IN_RESET_PASSWORD } - await loginEmailOptInRepository.save(optInCode) + await LoginEmailOptIn.save(optInCode) return optInCode } @@ -217,20 +206,9 @@ export class UserResolver { @UseMiddleware(klicktippNewsletterStateMiddleware) async verifyLogin(@Ctx() context: any): Promise { // TODO refactor and do not have duplicate code with login(see below) - const userRepository = getCustomRepository(UserRepository) - const userEntity = await userRepository.findByPubkeyHex(context.pubKey) - const loginUserRepository = getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findByEmail(userEntity.email) - const user = new User() - user.id = userEntity.id - user.email = userEntity.email - user.firstName = userEntity.firstName - user.lastName = userEntity.lastName - user.username = userEntity.username - user.description = loginUser.description - user.pubkey = userEntity.pubkey.toString('hex') - user.language = loginUser.language - + const userEntity = context.user + const user = new User(userEntity) + // user.pubkey = userEntity.pubKey.toString('hex') // Elopage Status & Stored PublisherId user.hasElopage = await this.hasElopage(context) @@ -255,89 +233,60 @@ export class UserResolver { @Ctx() context: any, ): Promise { email = email.trim().toLowerCase() - const loginUserRepository = getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findByEmail(email).catch(() => { + const dbUser = await DbUser.findOneOrFail({ email }, { withDeleted: true }).catch(() => { throw new Error('No user with this credentials') }) - if (!loginUser.emailChecked) { + if (dbUser.deletedAt) { + throw new Error('This user was permanently deleted. Contact support for questions.') + } + if (!dbUser.emailChecked) { throw new Error('User email not validated') } - if (loginUser.password === BigInt(0)) { + if (dbUser.password === BigInt(0)) { // TODO we want to catch this on the frontend and ask the user to check his emails or resend code throw new Error('User has no password set yet') } - if (!loginUser.pubKey || !loginUser.privKey) { + if (!dbUser.pubKey || !dbUser.privKey) { // TODO we want to catch this on the frontend and ask the user to check his emails or resend code throw new Error('User has no private or publicKey') } const passwordHash = SecretKeyCryptographyCreateKey(email, password) // return short and long hash - const loginUserPassword = BigInt(loginUser.password.toString()) + const loginUserPassword = BigInt(dbUser.password.toString()) if (loginUserPassword !== passwordHash[0].readBigUInt64LE()) { throw new Error('No user with this credentials') } - // TODO: If user has no pubKey Create it again and update user. - const userRepository = getCustomRepository(UserRepository) - let userEntity: void | DbUser - const loginUserPubKey = loginUser.pubKey - const loginUserPubKeyString = loginUserPubKey.toString('hex') - userEntity = await userRepository.findByPubkeyHex(loginUserPubKeyString).catch(() => { - // User not stored in state_users - // TODO: Check with production data - email is unique which can cause problems - userEntity = new DbUser() - userEntity.firstName = loginUser.firstName - userEntity.lastName = loginUser.lastName - userEntity.username = loginUser.username - userEntity.email = loginUser.email - userEntity.pubkey = loginUser.pubKey - - userRepository.save(userEntity).catch(() => { - throw new Error('error by save userEntity') - }) - }) - if (!userEntity) { - throw new Error('error with cannot happen') - } - - const user = new User() - user.id = userEntity.id - user.email = email - user.firstName = loginUser.firstName - user.lastName = loginUser.lastName - user.username = loginUser.username - user.description = loginUser.description - user.pubkey = loginUserPubKeyString - user.language = loginUser.language + const user = new User(dbUser) + // user.email = email + // user.pubkey = dbUser.pubKey.toString('hex') + user.language = dbUser.language // Elopage Status & Stored PublisherId - user.hasElopage = await this.hasElopage({ pubKey: loginUserPubKeyString }) + user.hasElopage = await this.hasElopage({ pubKey: dbUser.pubKey.toString('hex') }) if (!user.hasElopage && publisherId) { user.publisherId = publisherId // TODO: Check if we can use updateUserInfos // await this.updateUserInfos({ publisherId }, { pubKey: loginUser.pubKey }) - const loginUserRepository = getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findOneOrFail({ email: userEntity.email }) - loginUser.publisherId = publisherId - loginUserRepository.save(loginUser) + dbUser.publisherId = publisherId + DbUser.save(dbUser) } // coinAnimation const userSettingRepository = getCustomRepository(UserSettingRepository) const coinanimation = await userSettingRepository - .readBoolean(userEntity.id, Setting.COIN_ANIMATION) + .readBoolean(dbUser.id, Setting.COIN_ANIMATION) .catch((error) => { throw new Error(error) }) user.coinanimation = coinanimation // context.role is not set to the actual role yet on login - const serverUserRepository = await getCustomRepository(ServerUserRepository) - const countServerUsers = await serverUserRepository.count({ email: user.email }) + const countServerUsers = await ServerUser.count({ email: user.email }) user.isAdmin = countServerUsers > 0 context.setHeaders.push({ key: 'token', - value: encode(loginUser.pubKey), + value: encode(dbUser.pubKey), }) return user @@ -355,10 +304,11 @@ export class UserResolver { } @Authorized([RIGHTS.CREATE_USER]) - @Mutation(() => String) + @Mutation(() => User) async createUser( - @Args() { email, firstName, lastName, language, publisherId }: CreateUserArgs, - ): Promise { + @Args() + { email, firstName, lastName, language, publisherId, redeemCode = null }: CreateUserArgs, + ): Promise { // TODO: wrong default value (should be null), how does graphql work here? Is it an required field? // default int publisher_id = 0; @@ -367,18 +317,11 @@ export class UserResolver { language = DEFAULT_LANGUAGE } - // Validate username - // TODO: never true - const username = '' - if (username.length > 3 && !this.checkUsername({ username })) { - throw new Error('Username already in use') - } - // Validate email unique - // TODO: i can register an email in upper/lower case twice - const userRepository = getCustomRepository(UserRepository) - const usersFound = await userRepository.count({ email }) - if (usersFound !== 0) { + email = email.trim().toLowerCase() + // TODO we cannot use repository.count(), since it does not allow to specify if you want to include the soft deletes + const userFound = await DbUser.findOne({ email }, { withDeleted: true }) + if (userFound) { // TODO: this is unsecure, but the current implementation of the login server. This way it can be queried if the user with given EMail is existent. throw new Error(`User already exists.`) } @@ -389,18 +332,24 @@ export class UserResolver { // const encryptedPrivkey = SecretKeyCryptographyEncrypt(keyPair[1], passwordHash[1]) const emailHash = getEmailHash(email) - // Table: login_users - const loginUser = new LoginUser() - loginUser.email = email - loginUser.firstName = firstName - loginUser.lastName = lastName - loginUser.username = username - loginUser.description = '' + const dbUser = new DbUser() + dbUser.email = email + dbUser.firstName = firstName + dbUser.lastName = lastName + dbUser.emailHash = emailHash + dbUser.language = language + dbUser.publisherId = publisherId + dbUser.passphrase = passphrase.join(' ') + if (redeemCode) { + const transactionLink = await dbTransactionLink.findOne({ code: redeemCode }) + if (transactionLink) { + dbUser.referrerId = transactionLink.userId + } + } + // TODO this field has no null allowed unlike the loginServer table + // dbUser.pubKey = Buffer.from(randomBytes(32)) // Buffer.alloc(32, 0) default to 0000... + // dbUser.pubkey = keyPair[0] // loginUser.password = passwordHash[0].readBigUInt64LE() // using the shorthash - loginUser.emailHash = emailHash - loginUser.language = language - loginUser.groupId = 1 - loginUser.publisherId = publisherId // loginUser.pubKey = keyPair[0] // loginUser.privKey = encryptedPrivkey @@ -408,60 +357,37 @@ export class UserResolver { await queryRunner.connect() await queryRunner.startTransaction('READ UNCOMMITTED') try { - const { id: loginUserId } = await queryRunner.manager.save(loginUser).catch((error) => { + await queryRunner.manager.save(dbUser).catch((error) => { // eslint-disable-next-line no-console - console.log('insert LoginUser failed', error) - throw new Error('insert user failed') - }) - - // Table: login_user_backups - const loginUserBackup = new LoginUserBackup() - loginUserBackup.userId = loginUserId - loginUserBackup.passphrase = passphrase.join(' ') + ' ' // login server saves trailing space - loginUserBackup.mnemonicType = 2 // ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER; - - await queryRunner.manager.save(loginUserBackup).catch((error) => { - // eslint-disable-next-line no-console - console.log('insert LoginUserBackup failed', error) - throw new Error('insert user backup failed') - }) - - // Table: state_users - const dbUser = new DbUser() - dbUser.email = email - dbUser.firstName = firstName - dbUser.lastName = lastName - dbUser.username = username - // TODO this field has no null allowed unlike the loginServer table - dbUser.pubkey = Buffer.from(randomBytes(32)) // Buffer.alloc(32, 0) default to 0000... - // dbUser.pubkey = keyPair[0] - - await queryRunner.manager.save(dbUser).catch((er) => { - // eslint-disable-next-line no-console - console.log('Error while saving dbUser', er) + console.log('Error while saving dbUser', error) throw new Error('error saving user') }) // Store EmailOptIn in DB // TODO: this has duplicate code with sendResetPasswordEmail - const emailOptIn = await createEmailOptIn(loginUserId, queryRunner) + const emailOptIn = await createEmailOptIn(dbUser.id, queryRunner) const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( - /\$1/g, + /{optin}/g, emailOptIn.verificationCode.toString(), - ) - const emailSent = await this.sendAccountActivationEmail( - activationLink, + ).replace(/{code}/g, redeemCode ? '/' + redeemCode : '') + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const emailSent = await sendAccountActivationEmail({ + link: activationLink, firstName, lastName, email, - ) + }) + /* uncomment this, when you need the activation link on the console // In case EMails are disabled log the activation link for the user if (!emailSent) { // eslint-disable-next-line no-console console.log(`Account confirmation link: ${activationLink}`) } + */ + await queryRunner.commitTransaction() } catch (e) { await queryRunner.rollbackTransaction() @@ -469,61 +395,43 @@ export class UserResolver { } finally { await queryRunner.release() } - return 'success' - } - - private sendAccountActivationEmail( - activationLink: string, - firstName: string, - lastName: string, - email: string, - ): Promise { - return sendEMail({ - from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, - to: `${firstName} ${lastName} <${email}>`, - subject: 'Gradido: E-Mail Überprüfung', - text: `Hallo ${firstName} ${lastName}, - - Deine EMail wurde soeben bei Gradido registriert. - - Klicke bitte auf diesen Link, um die Registrierung abzuschließen und dein Gradido-Konto zu aktivieren: - ${activationLink} - oder kopiere den obigen Link in dein Browserfenster. - - Mit freundlichen Grüßen, - dein Gradido-Team`, - }) + return new User(dbUser) } + // THis is used by the admin only - should we move it to the admin resolver? + @Authorized([RIGHTS.SEND_ACTIVATION_EMAIL]) @Mutation(() => Boolean) async sendActivationEmail(@Arg('email') email: string): Promise { - const loginUserRepository = getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findOneOrFail({ email: email }) + email = email.trim().toLowerCase() + const user = await DbUser.findOneOrFail({ email: email }) const queryRunner = getConnection().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('READ UNCOMMITTED') try { - const emailOptIn = await createEmailOptIn(loginUser.id, queryRunner) + const emailOptIn = await createEmailOptIn(user.id, queryRunner) const activationLink = CONFIG.EMAIL_LINK_VERIFICATION.replace( - /\$1/g, + /{optin}/g, emailOptIn.verificationCode.toString(), ) - const emailSent = await this.sendAccountActivationEmail( - activationLink, - loginUser.firstName, - loginUser.lastName, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const emailSent = await sendAccountActivationEmail({ + link: activationLink, + firstName: user.firstName, + lastName: user.lastName, email, - ) + }) + /* uncomment this, when you need the activation link on the console // In case EMails are disabled log the activation link for the user if (!emailSent) { // eslint-disable-next-line no-console console.log(`Account confirmation link: ${activationLink}`) } + */ await queryRunner.commitTransaction() } catch (e) { await queryRunner.rollbackTransaction() @@ -538,36 +446,31 @@ export class UserResolver { @Query(() => Boolean) async sendResetPasswordEmail(@Arg('email') email: string): Promise { // TODO: this has duplicate code with createUser + email = email.trim().toLowerCase() + const user = await DbUser.findOneOrFail({ email }) - const loginUserRepository = await getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findOneOrFail({ email }) - - const optInCode = await getOptInCode(loginUser) + const optInCode = await getOptInCode(user.id) const link = CONFIG.EMAIL_LINK_SETPASSWORD.replace( - /\$1/g, + /{optin}/g, optInCode.verificationCode.toString(), ) - const emailSent = await sendEMail({ - from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, - to: `${loginUser.firstName} ${loginUser.lastName} <${email}>`, - subject: 'Gradido: Reset Password', - text: `Hallo ${loginUser.firstName} ${loginUser.lastName}, - - Du oder jemand anderes hat für dieses Konto ein Zurücksetzen des Passworts angefordert. - Wenn du es warst, klicke bitte auf den Link: ${link} - oder kopiere den obigen Link in Dein Browserfenster. - - Mit freundlichen Grüßen, - dein Gradido-Team`, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const emailSent = await sendResetPasswordEmail({ + link, + firstName: user.firstName, + lastName: user.lastName, + email, }) + /* uncomment this, when you need the activation link on the console // In case EMails are disabled log the activation link for the user if (!emailSent) { // eslint-disable-next-line no-console console.log(`Reset password link: ${link}`) } + */ return true } @@ -586,70 +489,52 @@ export class UserResolver { } // Load code - const loginEmailOptInRepository = await getRepository(LoginEmailOptIn) - const optInCode = await loginEmailOptInRepository - .findOneOrFail({ verificationCode: code }) - .catch(() => { - throw new Error('Could not login with emailVerificationCode') - }) - - // Code is only valid for 10minutes - const timeElapsed = Date.now() - new Date(optInCode.updatedAt).getTime() - if (timeElapsed > 10 * 60 * 1000) { - throw new Error('Code is older than 10 minutes') - } - - // load loginUser - const loginUserRepository = await getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository - .findOneOrFail({ id: optInCode.userId }) - .catch(() => { - throw new Error('Could not find corresponding Login User') - }) - - // load user - const dbUserRepository = await getCustomRepository(UserRepository) - const dbUser = await dbUserRepository.findOneOrFail({ email: loginUser.email }).catch(() => { - throw new Error('Could not find corresponding User') + const optInCode = await LoginEmailOptIn.findOneOrFail({ verificationCode: code }).catch(() => { + throw new Error('Could not login with emailVerificationCode') }) - const loginUserBackupRepository = await getRepository(LoginUserBackup) - const loginUserBackup = await loginUserBackupRepository - .findOneOrFail({ userId: loginUser.id }) - .catch(() => { - throw new Error('Could not find corresponding BackupUser') - }) + // Code is only valid for `CONFIG.EMAIL_CODE_VALID_TIME` minutes + if (!isOptInCodeValid(optInCode)) { + throw new Error(`email already more than $(CONFIG.EMAIL_CODE_VALID_TIME} minutes ago`) + } - const passphrase = loginUserBackup.passphrase.slice(0, -1).split(' ') + // load user + const user = await DbUser.findOneOrFail({ id: optInCode.userId }).catch(() => { + throw new Error('Could not find corresponding Login User') + }) + + // Generate Passphrase if needed + if (!user.passphrase) { + const passphrase = PassphraseGenerate() + user.passphrase = passphrase.join(' ') + } + + const passphrase = user.passphrase.split(' ') if (passphrase.length < PHRASE_WORD_COUNT) { // TODO if this can happen we cannot recover from that + // this seem to be good on production data, if we dont + // make a coding mistake we do not have a problem here throw new Error('Could not load a correct passphrase') } // Activate EMail - loginUser.emailChecked = true + user.emailChecked = true // Update Password - const passwordHash = SecretKeyCryptographyCreateKey(loginUser.email, password) // return short and long hash + const passwordHash = SecretKeyCryptographyCreateKey(user.email, password) // return short and long hash const keyPair = KeyPairEd25519Create(passphrase) // return pub, priv Key const encryptedPrivkey = SecretKeyCryptographyEncrypt(keyPair[1], passwordHash[1]) - loginUser.password = passwordHash[0].readBigUInt64LE() // using the shorthash - loginUser.pubKey = keyPair[0] - loginUser.privKey = encryptedPrivkey - dbUser.pubkey = keyPair[0] + user.password = passwordHash[0].readBigUInt64LE() // using the shorthash + user.pubKey = keyPair[0] + user.privKey = encryptedPrivkey const queryRunner = getConnection().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('READ UNCOMMITTED') try { - // Save loginUser - await queryRunner.manager.save(loginUser).catch((error) => { - throw new Error('error saving loginUser: ' + error) - }) - // Save user - await queryRunner.manager.save(dbUser).catch((error) => { + await queryRunner.manager.save(user).catch((error) => { throw new Error('error saving user: ' + error) }) @@ -670,17 +555,30 @@ export class UserResolver { // TODO do we always signUp the user? How to handle things with old users? if (optInCode.emailOptInTypeId === EMAIL_OPT_IN_REGISTER) { try { - await signIn(loginUser.email, loginUser.language, loginUser.firstName, loginUser.lastName) + await klicktippSignIn(user.email, user.language, user.firstName, user.lastName) } catch { // TODO is this a problem? // eslint-disable-next-line no-console + /* uncomment this, when you need the activation link on the console console.log('Could not subscribe to klicktipp') + */ } } return true } + @Authorized([RIGHTS.QUERY_OPT_IN]) + @Query(() => Boolean) + async queryOptIn(@Arg('optIn') optIn: string): Promise { + const optInCode = await LoginEmailOptIn.findOneOrFail({ verificationCode: optIn }) + // Code is only valid for `CONFIG.EMAIL_CODE_VALID_TIME` minutes + if (!isOptInCodeValid(optInCode)) { + throw new Error(`email was sent more than $(CONFIG.EMAIL_CODE_VALID_TIME} minutes ago`) + } + return true + } + @Authorized([RIGHTS.UPDATE_USER_INFOS]) @Mutation(() => Boolean) async updateUserInfos( @@ -688,8 +586,6 @@ export class UserResolver { { firstName, lastName, - description, - username, language, publisherId, password, @@ -698,63 +594,50 @@ export class UserResolver { }: UpdateUserInfosArgs, @Ctx() context: any, ): Promise { - const userRepository = getCustomRepository(UserRepository) - const userEntity = await userRepository.findByPubkeyHex(context.pubKey) - const loginUserRepository = getCustomRepository(LoginUserRepository) - const loginUser = await loginUserRepository.findOneOrFail({ email: userEntity.email }) - - if (username) { - throw new Error('change username currently not supported!') - // TODO: this error was thrown on login_server whenever you tried to change the username - // to anything except "" which is an exception to the rules below. Those were defined - // aswell, even tho never used. - // ^[a-zA-Z][a-zA-Z0-9_-]*$ - // username must start with [a-z] or [A-Z] and than can contain also [0-9], - and _ - // username already used - // userEntity.username = username - } + const userEntity = context.user if (firstName) { - loginUser.firstName = firstName userEntity.firstName = firstName } if (lastName) { - loginUser.lastName = lastName userEntity.lastName = lastName } - if (description) { - loginUser.description = description - } - if (language) { if (!isLanguage(language)) { throw new Error(`"${language}" isn't a valid language`) } - loginUser.language = language + userEntity.language = language } if (password && passwordNew) { + // Validate Password + if (!isPassword(passwordNew)) { + throw new Error( + 'Please enter a valid password with at least 8 characters, upper and lower case letters, at least one number and one special character!', + ) + } + // TODO: This had some error cases defined - like missing private key. This is no longer checked. - const oldPasswordHash = SecretKeyCryptographyCreateKey(loginUser.email, password) - if (loginUser.password !== oldPasswordHash[0].readBigUInt64LE()) { + const oldPasswordHash = SecretKeyCryptographyCreateKey(userEntity.email, password) + if (BigInt(userEntity.password.toString()) !== oldPasswordHash[0].readBigUInt64LE()) { throw new Error(`Old password is invalid`) } - const privKey = SecretKeyCryptographyDecrypt(loginUser.privKey, oldPasswordHash[1]) + const privKey = SecretKeyCryptographyDecrypt(userEntity.privKey, oldPasswordHash[1]) - const newPasswordHash = SecretKeyCryptographyCreateKey(loginUser.email, passwordNew) // return short and long hash + const newPasswordHash = SecretKeyCryptographyCreateKey(userEntity.email, passwordNew) // return short and long hash const encryptedPrivkey = SecretKeyCryptographyEncrypt(privKey, newPasswordHash[1]) // Save new password hash and newly encrypted private key - loginUser.password = newPasswordHash[0].readBigInt64LE() - loginUser.privKey = encryptedPrivkey + userEntity.password = newPasswordHash[0].readBigUInt64LE() + userEntity.privKey = encryptedPrivkey } // Save publisherId only if Elopage is not yet registered if (publisherId && !(await this.hasElopage(context))) { - loginUser.publisherId = publisherId + userEntity.publisherId = publisherId } const queryRunner = getConnection().createQueryRunner() @@ -771,10 +654,6 @@ export class UserResolver { }) } - await queryRunner.manager.save(loginUser).catch((error) => { - throw new Error('error saving loginUser: ' + error) - }) - await queryRunner.manager.save(userEntity).catch((error) => { throw new Error('error saving user: ' + error) }) @@ -790,41 +669,18 @@ export class UserResolver { return true } - @Authorized([RIGHTS.CHECK_USERNAME]) - @Query(() => Boolean) - async checkUsername(@Args() { username }: CheckUsernameArgs): Promise { - // Username empty? - if (username === '') { - throw new Error('Username must be set.') - } - - // Do we fullfil the minimum character length? - const MIN_CHARACTERS_USERNAME = 2 - if (username.length < MIN_CHARACTERS_USERNAME) { - throw new Error(`Username must be at minimum ${MIN_CHARACTERS_USERNAME} characters long.`) - } - - const usersFound = await LoginUser.count({ username }) - - // Username already present? - if (usersFound !== 0) { - throw new Error(`Username "${username}" already taken.`) - } - - return true - } - @Authorized([RIGHTS.HAS_ELOPAGE]) @Query(() => Boolean) async hasElopage(@Ctx() context: any): Promise { - const userRepository = getCustomRepository(UserRepository) - const userEntity = await userRepository.findByPubkeyHex(context.pubKey).catch() + const userEntity = context.user if (!userEntity) { return false } - const loginElopageBuysRepository = getCustomRepository(LoginElopageBuysRepository) - const elopageBuyCount = await loginElopageBuysRepository.count({ payerEmail: userEntity.email }) - return elopageBuyCount > 0 + return hasElopageBuys(userEntity.email) } } +function isOptInCodeValid(optInCode: LoginEmailOptIn) { + const timeElapsed = Date.now() - new Date(optInCode.updatedAt).getTime() + return timeElapsed <= CONFIG.EMAIL_CODE_VALID_TIME * 60 * 1000 +} diff --git a/backend/src/graphql/scalar/Decimal.ts b/backend/src/graphql/scalar/Decimal.ts new file mode 100644 index 000000000..da5a99e0c --- /dev/null +++ b/backend/src/graphql/scalar/Decimal.ts @@ -0,0 +1,23 @@ +import { GraphQLScalarType, Kind } from 'graphql' +import Decimal from 'decimal.js-light' + +export default new GraphQLScalarType({ + name: 'Decimal', + description: 'The `Decimal` scalar type to represent currency values', + + serialize(value: Decimal) { + return value.toString() + }, + + parseValue(value) { + return new Decimal(value) + }, + + parseLiteral(ast) { + if (ast.kind !== Kind.STRING) { + throw new TypeError(`${String(ast)} is not a valid decimal value.`) + } + + return new Decimal(ast.value) + }, +}) diff --git a/backend/src/graphql/schema.ts b/backend/src/graphql/schema.ts index 02caf2784..f14f45efa 100644 --- a/backend/src/graphql/schema.ts +++ b/backend/src/graphql/schema.ts @@ -3,11 +3,14 @@ import { buildSchema } from 'type-graphql' import path from 'path' import isAuthorized from './directive/isAuthorized' +import DecimalScalar from './scalar/Decimal' +import Decimal from 'decimal.js-light' const schema = async (): Promise => { return buildSchema({ resolvers: [path.join(__dirname, 'resolver', `!(*.test).{js,ts}`)], authChecker: isAuthorized, + scalarsMap: [{ type: Decimal, scalar: DecimalScalar }], }) } diff --git a/backend/src/index.ts b/backend/src/index.ts index a2e533e34..4c08b422d 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -13,7 +13,7 @@ async function main() { console.log(`Server is running at http://localhost:${CONFIG.PORT}`) if (CONFIG.GRAPHIQL) { // eslint-disable-next-line no-console - console.log(`GraphIQL available at http://localhost:${CONFIG.PORT}/graphql`) + console.log(`GraphIQL available at http://localhost:${CONFIG.PORT}`) } }) } diff --git a/backend/src/mailer/sendAccountActivationEmail.test.ts b/backend/src/mailer/sendAccountActivationEmail.test.ts new file mode 100644 index 000000000..c53fc0994 --- /dev/null +++ b/backend/src/mailer/sendAccountActivationEmail.test.ts @@ -0,0 +1,29 @@ +import { sendAccountActivationEmail } from './sendAccountActivationEmail' +import { sendEMail } from './sendEMail' + +jest.mock('./sendEMail', () => { + return { + __esModule: true, + sendEMail: jest.fn(), + } +}) + +describe('sendAccountActivationEmail', () => { + beforeEach(async () => { + await sendAccountActivationEmail({ + link: 'activationLink', + firstName: 'Peter', + lastName: 'Lustig', + email: 'peter@lustig.de', + }) + }) + + it('calls sendEMail', () => { + expect(sendEMail).toBeCalledWith({ + to: `Peter Lustig `, + subject: 'Gradido: E-Mail Überprüfung', + text: + expect.stringContaining('Hallo Peter Lustig') && expect.stringContaining('activationLink'), + }) + }) +}) diff --git a/backend/src/mailer/sendAccountActivationEmail.ts b/backend/src/mailer/sendAccountActivationEmail.ts new file mode 100644 index 000000000..05c3104cb --- /dev/null +++ b/backend/src/mailer/sendAccountActivationEmail.ts @@ -0,0 +1,15 @@ +import { sendEMail } from './sendEMail' +import { accountActivation } from './text/accountActivation' + +export const sendAccountActivationEmail = (data: { + link: string + firstName: string + lastName: string + email: string +}): Promise => { + return sendEMail({ + to: `${data.firstName} ${data.lastName} <${data.email}>`, + subject: accountActivation.de.subject, + text: accountActivation.de.text(data), + }) +} diff --git a/backend/src/mailer/sendEMail.test.ts b/backend/src/mailer/sendEMail.test.ts new file mode 100644 index 000000000..b7cc06a60 --- /dev/null +++ b/backend/src/mailer/sendEMail.test.ts @@ -0,0 +1,92 @@ +import { sendEMail } from './sendEMail' +import { createTransport } from 'nodemailer' +import CONFIG from '@/config' + +CONFIG.EMAIL = false +CONFIG.EMAIL_SMTP_URL = 'EMAIL_SMTP_URL' +CONFIG.EMAIL_SMTP_PORT = '1234' +CONFIG.EMAIL_USERNAME = 'user' +CONFIG.EMAIL_PASSWORD = 'pwd' + +jest.mock('nodemailer', () => { + return { + __esModule: true, + createTransport: jest.fn(() => { + return { + sendMail: jest.fn(() => { + return { + messageId: 'message', + } + }), + } + }), + } +}) + +describe('sendEMail', () => { + let result: boolean + describe('config email is false', () => { + // eslint-disable-next-line no-console + const consoleLog = console.log + const consoleLogMock = jest.fn() + // eslint-disable-next-line no-console + console.log = consoleLogMock + beforeEach(async () => { + result = await sendEMail({ + to: 'receiver@mail.org', + subject: 'Subject', + text: 'Text text text', + }) + }) + + afterAll(() => { + // eslint-disable-next-line no-console + console.log = consoleLog + }) + + it('logs warining to console', () => { + expect(consoleLogMock).toBeCalledWith('Emails are disabled via config') + }) + + it('returns false', () => { + expect(result).toBeFalsy() + }) + }) + + describe('config email is true', () => { + beforeEach(async () => { + CONFIG.EMAIL = true + result = await sendEMail({ + to: 'receiver@mail.org', + subject: 'Subject', + text: 'Text text text', + }) + }) + + it('calls the transporter', () => { + expect(createTransport).toBeCalledWith({ + host: 'EMAIL_SMTP_URL', + port: 1234, + secure: false, + requireTLS: true, + auth: { + user: 'user', + pass: 'pwd', + }, + }) + }) + + it('calls sendMail of transporter', () => { + expect((createTransport as jest.Mock).mock.results[0].value.sendMail).toBeCalledWith({ + from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, + to: 'receiver@mail.org', + subject: 'Subject', + text: 'Text text text', + }) + }) + + it('returns true', () => { + expect(result).toBeTruthy() + }) + }) +}) diff --git a/backend/src/util/sendEMail.ts b/backend/src/mailer/sendEMail.ts similarity index 81% rename from backend/src/util/sendEMail.ts rename to backend/src/mailer/sendEMail.ts index 4c239980d..13c28996b 100644 --- a/backend/src/util/sendEMail.ts +++ b/backend/src/mailer/sendEMail.ts @@ -1,9 +1,8 @@ import { createTransport } from 'nodemailer' -import CONFIG from '../config' +import CONFIG from '@/config' export const sendEMail = async (emailDef: { - from: string to: string subject: string text: string @@ -23,7 +22,10 @@ export const sendEMail = async (emailDef: { pass: CONFIG.EMAIL_PASSWORD, }, }) - const info = await transporter.sendMail(emailDef) + const info = await transporter.sendMail({ + ...emailDef, + from: `Gradido (nicht antworten) <${CONFIG.EMAIL_SENDER}>`, + }) if (!info.messageId) { throw new Error('error sending notification email, but transaction succeed') } diff --git a/backend/src/mailer/sendResetPasswordEmail.test.ts b/backend/src/mailer/sendResetPasswordEmail.test.ts new file mode 100644 index 000000000..4bc8ceba0 --- /dev/null +++ b/backend/src/mailer/sendResetPasswordEmail.test.ts @@ -0,0 +1,28 @@ +import { sendResetPasswordEmail } from './sendResetPasswordEmail' +import { sendEMail } from './sendEMail' + +jest.mock('./sendEMail', () => { + return { + __esModule: true, + sendEMail: jest.fn(), + } +}) + +describe('sendResetPasswordEmail', () => { + beforeEach(async () => { + await sendResetPasswordEmail({ + link: 'resetLink', + firstName: 'Peter', + lastName: 'Lustig', + email: 'peter@lustig.de', + }) + }) + + it('calls sendEMail', () => { + expect(sendEMail).toBeCalledWith({ + to: `Peter Lustig `, + subject: 'Gradido: Passwort zurücksetzen', + text: expect.stringContaining('Hallo Peter Lustig') && expect.stringContaining('resetLink'), + }) + }) +}) diff --git a/backend/src/mailer/sendResetPasswordEmail.ts b/backend/src/mailer/sendResetPasswordEmail.ts new file mode 100644 index 000000000..c9f5b23e9 --- /dev/null +++ b/backend/src/mailer/sendResetPasswordEmail.ts @@ -0,0 +1,15 @@ +import { sendEMail } from './sendEMail' +import { resetPassword } from './text/resetPassword' + +export const sendResetPasswordEmail = (data: { + link: string + firstName: string + lastName: string + email: string +}): Promise => { + return sendEMail({ + to: `${data.firstName} ${data.lastName} <${data.email}>`, + subject: resetPassword.de.subject, + text: resetPassword.de.text(data), + }) +} diff --git a/backend/src/mailer/sendTransactionReceivedEmail.test.ts b/backend/src/mailer/sendTransactionReceivedEmail.test.ts new file mode 100644 index 000000000..1ebc9dae3 --- /dev/null +++ b/backend/src/mailer/sendTransactionReceivedEmail.test.ts @@ -0,0 +1,38 @@ +import { sendTransactionReceivedEmail } from './sendTransactionReceivedEmail' +import { sendEMail } from './sendEMail' +import Decimal from 'decimal.js-light' + +jest.mock('./sendEMail', () => { + return { + __esModule: true, + sendEMail: jest.fn(), + } +}) + +describe('sendTransactionReceivedEmail', () => { + beforeEach(async () => { + await sendTransactionReceivedEmail({ + senderFirstName: 'Bibi', + senderLastName: 'Bloxberg', + recipientFirstName: 'Peter', + recipientLastName: 'Lustig', + email: 'peter@lustig.de', + senderEmail: 'bibi@bloxberg.de', + amount: new Decimal(42.0), + memo: 'Vielen herzlichen Dank für den neuen Hexenbesen!', + }) + }) + + it('calls sendEMail', () => { + expect(sendEMail).toBeCalledWith({ + to: `Peter Lustig `, + subject: 'Gradido Überweisung', + text: + expect.stringContaining('Hallo Peter Lustig') && + expect.stringContaining('42,00 GDD') && + expect.stringContaining('Bibi Bloxberg') && + expect.stringContaining('(bibi@bloxberg.de)') && + expect.stringContaining('Vielen herzlichen Dank für den neuen Hexenbesen!'), + }) + }) +}) diff --git a/backend/src/mailer/sendTransactionReceivedEmail.ts b/backend/src/mailer/sendTransactionReceivedEmail.ts new file mode 100644 index 000000000..934783449 --- /dev/null +++ b/backend/src/mailer/sendTransactionReceivedEmail.ts @@ -0,0 +1,20 @@ +import Decimal from 'decimal.js-light' +import { sendEMail } from './sendEMail' +import { transactionReceived } from './text/transactionReceived' + +export const sendTransactionReceivedEmail = (data: { + senderFirstName: string + senderLastName: string + recipientFirstName: string + recipientLastName: string + email: string + senderEmail: string + amount: Decimal + memo: string +}): Promise => { + return sendEMail({ + to: `${data.recipientFirstName} ${data.recipientLastName} <${data.email}>`, + subject: transactionReceived.de.subject, + text: transactionReceived.de.text(data), + }) +} diff --git a/backend/src/mailer/text/accountActivation.ts b/backend/src/mailer/text/accountActivation.ts new file mode 100644 index 000000000..bf5d1a2e9 --- /dev/null +++ b/backend/src/mailer/text/accountActivation.ts @@ -0,0 +1,16 @@ +export const accountActivation = { + de: { + subject: 'Gradido: E-Mail Überprüfung', + text: (data: { link: string; firstName: string; lastName: string; email: string }): string => + `Hallo ${data.firstName} ${data.lastName}, + +Deine E-Mail-Adresse wurde soeben bei Gradido registriert. + +Klicke bitte auf diesen Link, um die Registrierung abzuschließen und dein Gradido-Konto zu aktivieren: +${data.link} +oder kopiere den obigen Link in dein Browserfenster. + +Mit freundlichen Grüßen, +dein Gradido-Team`, + }, +} diff --git a/backend/src/mailer/text/resetPassword.ts b/backend/src/mailer/text/resetPassword.ts new file mode 100644 index 000000000..58b13cbcd --- /dev/null +++ b/backend/src/mailer/text/resetPassword.ts @@ -0,0 +1,14 @@ +export const resetPassword = { + de: { + subject: 'Gradido: Passwort zurücksetzen', + text: (data: { link: string; firstName: string; lastName: string; email: string }): string => + `Hallo ${data.firstName} ${data.lastName}, + +Du oder jemand anderes hat für dieses Konto ein Zurücksetzen des Passworts angefordert. +Wenn du es warst, klicke bitte auf den Link: ${data.link} +oder kopiere den obigen Link in Dein Browserfenster. + +Mit freundlichen Grüßen, +dein Gradido-Team`, + }, +} diff --git a/backend/src/mailer/text/transactionReceived.ts b/backend/src/mailer/text/transactionReceived.ts new file mode 100644 index 000000000..520ee43bf --- /dev/null +++ b/backend/src/mailer/text/transactionReceived.ts @@ -0,0 +1,30 @@ +import Decimal from 'decimal.js-light' + +export const transactionReceived = { + de: { + subject: 'Gradido Überweisung', + text: (data: { + senderFirstName: string + senderLastName: string + recipientFirstName: string + recipientLastName: string + email: string + senderEmail: string + amount: Decimal + memo: string + }): string => + `Hallo ${data.recipientFirstName} ${data.recipientLastName} + +Du hast soeben ${data.amount.toFixed(2).replace('.', ',')} GDD von ${data.senderFirstName} ${ + data.senderLastName + } (${data.senderEmail}) erhalten. +${data.senderFirstName} ${data.senderLastName} schreibt: + +${data.memo} + +Bitte antworte nicht auf diese E-Mail! + +Mit freundlichen Grüßen, +dein Gradido-Team`, + }, +} diff --git a/backend/src/middleware/klicktippMiddleware.ts b/backend/src/middleware/klicktippMiddleware.ts index 69a74480d..b3699f29b 100644 --- a/backend/src/middleware/klicktippMiddleware.ts +++ b/backend/src/middleware/klicktippMiddleware.ts @@ -1,7 +1,7 @@ import { MiddlewareFn } from 'type-graphql' -import { /* signIn, */ getKlickTippUser } from '../apis/KlicktippController' -import { KlickTipp } from '../graphql/model/KlickTipp' -import CONFIG from '../config/index' +import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController' +import { KlickTipp } from '@model/KlickTipp' +import CONFIG from '@/config' // export const klicktippRegistrationMiddleware: MiddlewareFn = async ( // // Only for demo @@ -12,7 +12,7 @@ import CONFIG from '../config/index' // // Do Something here before resolver is called // const result = await next() // // Do Something here after resolver is completed -// await signIn(result.email, result.language, result.firstName, result.lastName) +// await klicktippSignIn(result.email, result.language, result.firstName, result.lastName) // return result // } diff --git a/backend/src/seeds/creation/CreationInterface.ts b/backend/src/seeds/creation/CreationInterface.ts new file mode 100644 index 000000000..8723f441d --- /dev/null +++ b/backend/src/seeds/creation/CreationInterface.ts @@ -0,0 +1,7 @@ +export interface CreationInterface { + email: string + amount: number + memo: string + creationDate: string + confirmed?: boolean +} diff --git a/backend/src/seeds/creation/index.ts b/backend/src/seeds/creation/index.ts new file mode 100644 index 000000000..7396a7ec8 --- /dev/null +++ b/backend/src/seeds/creation/index.ts @@ -0,0 +1,29 @@ +import { CreationInterface } from './CreationInterface' + +const lastMonth = (date: Date): string => { + return new Date(date.getFullYear(), date.getMonth() - 1, 1).toISOString() +} + +export const creations: CreationInterface[] = [ + { + email: 'bibi@bloxberg.de', + amount: 1000, + memo: 'Herzlich Willkommen bei Gradido!', + creationDate: lastMonth(new Date()), + confirmed: true, + }, + { + email: 'bob@baumeister.de', + amount: 1000, + memo: 'Herzlich Willkommen bei Gradido!', + creationDate: lastMonth(new Date()), + confirmed: true, + }, + { + email: 'raeuber@hotzenplotz.de', + amount: 1000, + memo: 'Herzlich Willkommen bei Gradido!', + creationDate: lastMonth(new Date()), + confirmed: true, + }, +] diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts new file mode 100644 index 000000000..d4d4c8101 --- /dev/null +++ b/backend/src/seeds/factory/creation.ts @@ -0,0 +1,38 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + +import { createPendingCreation, confirmPendingCreation } from '@/seeds/graphql/mutations' +import { login } from '@/seeds/graphql/queries' +import { CreationInterface } from '@/seeds/creation/CreationInterface' +import { ApolloServerTestClient } from 'apollo-server-testing' +import { User } from '@entity/User' +import { AdminPendingCreation } from '@entity/AdminPendingCreation' +// import CONFIG from '@/config/index' + +export const creationFactory = async ( + client: ApolloServerTestClient, + creation: CreationInterface, +): Promise => { + const { mutate, query } = client + + // login as Peter Lustig (admin) and get his user ID + const { + data: { + login: { id }, + }, + } = await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } }) + + await mutate({ mutation: createPendingCreation, variables: { ...creation, moderator: id } }) + + // get User + const user = await User.findOneOrFail({ where: { email: creation.email } }) + + if (creation.confirmed) { + const pendingCreation = await AdminPendingCreation.findOneOrFail({ + where: { userId: user.id }, + order: { created: 'DESC' }, + }) + + await mutate({ mutation: confirmPendingCreation, variables: { id: pendingCreation.id } }) + } +} diff --git a/backend/src/seeds/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts new file mode 100644 index 000000000..2f54dc70c --- /dev/null +++ b/backend/src/seeds/factory/transactionLink.ts @@ -0,0 +1,43 @@ +import { ApolloServerTestClient } from 'apollo-server-testing' +import { createTransactionLink } from '@/seeds/graphql/mutations' +import { login } from '@/seeds/graphql/queries' +import { TransactionLinkInterface } from '@/seeds/transactionLink/TransactionLinkInterface' +import { transactionLinkExpireDate } from '@/graphql/resolver/TransactionLinkResolver' +import { TransactionLink } from '@entity/TransactionLink' + +export const transactionLinkFactory = async ( + client: ApolloServerTestClient, + transactionLink: TransactionLinkInterface, +): Promise => { + const { mutate, query } = client + + // login + await query({ query: login, variables: { email: transactionLink.email, password: 'Aa12345_' } }) + + const variables = { + amount: transactionLink.amount, + memo: transactionLink.memo, + } + + // get the transaction links's id + const { + data: { + createTransactionLink: { id }, + }, + } = await mutate({ mutation: createTransactionLink, variables }) + + if (transactionLink.createdAt || transactionLink.deletedAt) { + const dbTransactionLink = await TransactionLink.findOneOrFail({ id }) + + if (transactionLink.createdAt) { + dbTransactionLink.createdAt = transactionLink.createdAt + dbTransactionLink.validUntil = transactionLinkExpireDate(transactionLink.createdAt) + await dbTransactionLink.save() + } + + if (transactionLink.deletedAt) { + dbTransactionLink.deletedAt = new Date() + await dbTransactionLink.save() + } + } +} diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts new file mode 100644 index 000000000..ff4c1d6c9 --- /dev/null +++ b/backend/src/seeds/factory/user.ts @@ -0,0 +1,51 @@ +import { createUser, setPassword } from '@/seeds/graphql/mutations' +import { User } from '@entity/User' +import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' +import { ServerUser } from '@entity/ServerUser' +import { UserInterface } from '@/seeds/users/UserInterface' +import { ApolloServerTestClient } from 'apollo-server-testing' + +export const userFactory = async ( + client: ApolloServerTestClient, + user: UserInterface, +): Promise => { + const { mutate } = client + + const { + data: { + createUser: { id }, + }, + } = await mutate({ mutation: createUser, variables: user }) + + if (user.emailChecked) { + const optin = await LoginEmailOptIn.findOneOrFail({ userId: id }) + await mutate({ + mutation: setPassword, + variables: { password: 'Aa12345_', code: optin.verificationCode }, + }) + } + + if (user.createdAt || user.deletedAt || user.isAdmin) { + // get user from database + const dbUser = await User.findOneOrFail({ id }) + + if (user.createdAt || user.deletedAt) { + if (user.createdAt) dbUser.createdAt = user.createdAt + if (user.deletedAt) dbUser.deletedAt = user.deletedAt + await dbUser.save() + } + + if (user.isAdmin) { + const admin = new ServerUser() + admin.username = dbUser.firstName + admin.password = 'please_refactor' + admin.email = dbUser.email + admin.role = 'admin' + admin.activated = 1 + admin.lastLogin = new Date() + admin.created = dbUser.createdAt + admin.modified = dbUser.createdAt + await admin.save() + } + } +} diff --git a/backend/src/seeds/graphql/enums.ts b/backend/src/seeds/graphql/enums.ts new file mode 100644 index 000000000..6e40dd19c --- /dev/null +++ b/backend/src/seeds/graphql/enums.ts @@ -0,0 +1,9 @@ +export const GdtEntryType = { + FORM: 'FORM', + CVS: 'CVS', + ELOPAGE: 'ELOPAGE', + ELOPAGE_PUBLISHER: 'ELOPAGE_PUBLISHER', + DIGISTORE: 'DIGISTORE', + CVS2: 'CVS2', + GLOBAL_MODIFICATOR: 'GLOBAL_MODIFICATOR', +} diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts new file mode 100644 index 000000000..298d56bdb --- /dev/null +++ b/backend/src/seeds/graphql/mutations.ts @@ -0,0 +1,102 @@ +import gql from 'graphql-tag' + +export const subscribeNewsletter = gql` + mutation ($email: String!, $language: String!) { + subscribeNewsletter(email: $email, language: $language) + } +` + +export const unsubscribeNewsletter = gql` + mutation ($email: String!) { + unsubscribeNewsletter(email: $email) + } +` + +export const setPassword = gql` + mutation ($code: String!, $password: String!) { + setPassword(code: $code, password: $password) + } +` + +export const updateUserInfos = gql` + mutation ( + $firstName: String + $lastName: String + $password: String + $passwordNew: String + $locale: String + $coinanimation: Boolean + ) { + updateUserInfos( + firstName: $firstName + lastName: $lastName + password: $password + passwordNew: $passwordNew + language: $locale + coinanimation: $coinanimation + ) + } +` + +export const createUser = gql` + mutation ( + $firstName: String! + $lastName: String! + $email: String! + $language: String! + $publisherId: Int + $redeemCode: String + ) { + createUser( + email: $email + firstName: $firstName + lastName: $lastName + language: $language + publisherId: $publisherId + redeemCode: $redeemCode + ) { + id + } + } +` + +export const sendCoins = gql` + mutation ($email: String!, $amount: Decimal!, $memo: String!) { + sendCoins(email: $email, amount: $amount, memo: $memo) + } +` + +export const createTransactionLink = gql` + mutation ($amount: Decimal!, $memo: String!) { + createTransactionLink(amount: $amount, memo: $memo) { + id + code + } + } +` + +// from admin interface + +export const createPendingCreation = gql` + mutation ( + $email: String! + $amount: Float! + $memo: String! + $creationDate: String! + $moderator: Int! + ) { + createPendingCreation( + email: $email + amount: $amount + memo: $memo + creationDate: $creationDate + moderator: $moderator + ) + } +` + +export const confirmPendingCreation = gql` + mutation ($id: Int!) { + confirmPendingCreation(id: $id) + } +` diff --git a/backend/src/seeds/graphql/queries.ts b/backend/src/seeds/graphql/queries.ts new file mode 100644 index 000000000..04f849727 --- /dev/null +++ b/backend/src/seeds/graphql/queries.ts @@ -0,0 +1,145 @@ +import gql from 'graphql-tag' + +export const login = gql` + query ($email: String!, $password: String!, $publisherId: Int) { + login(email: $email, password: $password, publisherId: $publisherId) { + id + email + firstName + lastName + language + coinanimation + klickTipp { + newsletterState + } + hasElopage + publisherId + isAdmin + } + } +` + +export const verifyLogin = gql` + query { + verifyLogin { + email + firstName + lastName + language + coinanimation + klickTipp { + newsletterState + } + hasElopage + publisherId + isAdmin + } + } +` + +export const logout = gql` + query { + logout + } +` + +export const transactionsQuery = gql` + query ( + $currentPage: Int = 1 + $pageSize: Int = 25 + $order: Order = DESC + $onlyCreations: Boolean = false + ) { + transactionList( + currentPage: $currentPage + pageSize: $pageSize + order: $order + onlyCreations: $onlyCreations + ) { + balanceGDT + count + balance + decayStartBlock + transactions { + id + typeId + amount + balance + balanceDate + memo + linkedUser { + firstName + lastName + } + decay { + decay + start + end + duration + } + } + } + } +` + +export const sendResetPasswordEmail = gql` + query ($email: String!) { + sendResetPasswordEmail(email: $email) + } +` + +export const listGDTEntriesQuery = gql` + query ($currentPage: Int!, $pageSize: Int!) { + listGDTEntries(currentPage: $currentPage, pageSize: $pageSize) { + count + gdtEntries { + id + amount + date + comment + gdtEntryType + factor + gdt + } + gdtSum + } + } +` + +export const communityInfo = gql` + query { + getCommunityInfo { + name + description + registerUrl + url + } + } +` + +export const communities = gql` + query { + communities { + id + name + url + description + registerUrl + } + } +` + +export const queryTransactionLink = gql` + query ($code: String!) { + queryTransactionLink(code: $code) { + amount + memo + createdAt + validUntil + user { + firstName + publisherId + } + } + } +` diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts new file mode 100644 index 000000000..37c9992a7 --- /dev/null +++ b/backend/src/seeds/index.ts @@ -0,0 +1,77 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + +import createServer from '../server/createServer' +import { createTestClient } from 'apollo-server-testing' + +import { name, internet, random } from 'faker' + +import { users } from './users/index' +import { creations } from './creation/index' +import { transactionLinks } from './transactionLink/index' +import { userFactory } from './factory/user' +import { creationFactory } from './factory/creation' +import { transactionLinkFactory } from './factory/transactionLink' +import { entities } from '@entity/index' + +const context = { + token: '', + setHeaders: { + push: (value: { key: string; value: string }): void => { + context.token = value.value + }, + // eslint-disable-next-line @typescript-eslint/no-empty-function + forEach: (): void => {}, + }, +} + +export const cleanDB = async () => { + // this only works as lond we do not have foreign key constraints + for (let i = 0; i < entities.length; i++) { + await resetEntity(entities[i]) + } +} + +const resetEntity = async (entity: any) => { + const items = await entity.find({ withDeleted: true }) + if (items.length > 0) { + const ids = items.map((i: any) => i.id) + await entity.delete(ids) + } +} + +const run = async () => { + const server = await createServer(context) + const seedClient = createTestClient(server.apollo) + const { con } = server + await cleanDB() + + // seed the standard users + for (let i = 0; i < users.length; i++) { + await userFactory(seedClient, users[i]) + } + + // seed 100 random users + for (let i = 0; i < 100; i++) { + await userFactory(seedClient, { + firstName: name.firstName(), + lastName: name.lastName(), + email: internet.email(), + language: random.boolean() ? 'en' : 'de', + }) + } + + // create GDD + for (let i = 0; i < creations.length; i++) { + await creationFactory(seedClient, creations[i]) + } + + // create Transaction Links + for (let i = 0; i < transactionLinks.length; i++) { + await transactionLinkFactory(seedClient, transactionLinks[i]) + } + + await con.close() +} + +run() diff --git a/backend/src/seeds/transactionLink/TransactionLinkInterface.ts b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts new file mode 100644 index 000000000..ddc835b33 --- /dev/null +++ b/backend/src/seeds/transactionLink/TransactionLinkInterface.ts @@ -0,0 +1,7 @@ +export interface TransactionLinkInterface { + email: string + amount: number + memo: string + createdAt?: Date + deletedAt?: boolean +} diff --git a/backend/src/seeds/transactionLink/index.ts b/backend/src/seeds/transactionLink/index.ts new file mode 100644 index 000000000..25755c0f2 --- /dev/null +++ b/backend/src/seeds/transactionLink/index.ts @@ -0,0 +1,52 @@ +import { TransactionLinkInterface } from './TransactionLinkInterface' + +export const transactionLinks: TransactionLinkInterface[] = [ + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', + createdAt: new Date(2022, 0, 1), + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: `Kein Trick, keine Zauberrei, +bei Gradidio sei dabei!`, + }, + { + email: 'bibi@bloxberg.de', + amount: 19.99, + memo: 'Da habe ich mich wohl etwas übernommen.', + deletedAt: true, + }, +] diff --git a/backend/src/seeds/users/UserInterface.ts b/backend/src/seeds/users/UserInterface.ts new file mode 100644 index 000000000..08aa5d19d --- /dev/null +++ b/backend/src/seeds/users/UserInterface.ts @@ -0,0 +1,12 @@ +export interface UserInterface { + email?: string + firstName?: string + lastName?: string + // description?: string + createdAt?: Date + emailChecked?: boolean + language?: string + deletedAt?: Date + publisherId?: number + isAdmin?: boolean +} diff --git a/backend/src/seeds/users/bibi-bloxberg.ts b/backend/src/seeds/users/bibi-bloxberg.ts new file mode 100644 index 000000000..7c372848e --- /dev/null +++ b/backend/src/seeds/users/bibi-bloxberg.ts @@ -0,0 +1,11 @@ +import { UserInterface } from './UserInterface' + +export const bibiBloxberg: UserInterface = { + email: 'bibi@bloxberg.de', + firstName: 'Bibi', + lastName: 'Bloxberg', + // description: 'Hex Hex', + emailChecked: true, + language: 'de', + publisherId: 1234, +} diff --git a/backend/src/seeds/users/bob-baumeister.ts b/backend/src/seeds/users/bob-baumeister.ts new file mode 100644 index 000000000..ac88611b8 --- /dev/null +++ b/backend/src/seeds/users/bob-baumeister.ts @@ -0,0 +1,10 @@ +import { UserInterface } from './UserInterface' + +export const bobBaumeister: UserInterface = { + email: 'bob@baumeister.de', + firstName: 'Bob', + lastName: 'der Baumeister', + // description: 'Können wir das schaffen? Ja, wir schaffen das!', + emailChecked: true, + language: 'de', +} diff --git a/backend/src/seeds/users/garrick-ollivander.ts b/backend/src/seeds/users/garrick-ollivander.ts new file mode 100644 index 000000000..264a866bd --- /dev/null +++ b/backend/src/seeds/users/garrick-ollivander.ts @@ -0,0 +1,12 @@ +import { UserInterface } from './UserInterface' + +export const garrickOllivander: UserInterface = { + email: 'garrick@ollivander.com', + firstName: 'Garrick', + lastName: 'Ollivander', + // description: `Curious ... curious ... + // Renowned wandmaker Mr Ollivander owns the wand shop Ollivanders: Makers of Fine Wands Since 382 BC in Diagon Alley. His shop is widely considered the best place to purchase a wand.`, + createdAt: new Date('2022-01-10T10:23:17'), + emailChecked: false, + language: 'en', +} diff --git a/backend/src/seeds/users/index.ts b/backend/src/seeds/users/index.ts new file mode 100644 index 000000000..7a6dbe519 --- /dev/null +++ b/backend/src/seeds/users/index.ts @@ -0,0 +1,15 @@ +import { peterLustig } from './peter-lustig' +import { bibiBloxberg } from './bibi-bloxberg' +import { bobBaumeister } from './bob-baumeister' +import { raeuberHotzenplotz } from './raeuber-hotzenplotz' +import { stephenHawking } from './stephen-hawking' +import { garrickOllivander } from './garrick-ollivander' + +export const users = [ + peterLustig, + bibiBloxberg, + bobBaumeister, + raeuberHotzenplotz, + stephenHawking, + garrickOllivander, +] diff --git a/backend/src/seeds/users/peter-lustig.ts b/backend/src/seeds/users/peter-lustig.ts new file mode 100644 index 000000000..0cdc67829 --- /dev/null +++ b/backend/src/seeds/users/peter-lustig.ts @@ -0,0 +1,12 @@ +import { UserInterface } from './UserInterface' + +export const peterLustig: UserInterface = { + email: 'peter@lustig.de', + firstName: 'Peter', + lastName: 'Lustig', + // description: 'Latzhose und Nickelbrille', + createdAt: new Date('2020-11-25T10:48:43'), + emailChecked: true, + language: 'de', + isAdmin: true, +} diff --git a/backend/src/seeds/users/raeuber-hotzenplotz.ts b/backend/src/seeds/users/raeuber-hotzenplotz.ts new file mode 100644 index 000000000..62601efff --- /dev/null +++ b/backend/src/seeds/users/raeuber-hotzenplotz.ts @@ -0,0 +1,10 @@ +import { UserInterface } from './UserInterface' + +export const raeuberHotzenplotz: UserInterface = { + email: 'raeuber@hotzenplotz.de', + firstName: 'Räuber', + lastName: 'Hotzenplotz', + // description: 'Pfefferpistole', + emailChecked: true, + language: 'de', +} diff --git a/backend/src/seeds/users/stephen-hawking.ts b/backend/src/seeds/users/stephen-hawking.ts new file mode 100644 index 000000000..a683b7579 --- /dev/null +++ b/backend/src/seeds/users/stephen-hawking.ts @@ -0,0 +1,12 @@ +import { UserInterface } from './UserInterface' + +export const stephenHawking: UserInterface = { + email: 'stephen@hawking.uk', + firstName: 'Stephen', + lastName: 'Hawking', + // description: 'A Brief History of Time', + emailChecked: true, + createdAt: new Date('1942-01-08T09:17:52'), + deletedAt: new Date('2018-03-14T09:17:52'), + language: 'en', +} diff --git a/backend/src/server/createServer.ts b/backend/src/server/createServer.ts index 4ed20232d..8315fda58 100644 --- a/backend/src/server/createServer.ts +++ b/backend/src/server/createServer.ts @@ -1,16 +1,11 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ - import 'reflect-metadata' -import 'module-alias/register' import { ApolloServer } from 'apollo-server-express' -import express from 'express' -import bodyParser from 'body-parser' +import express, { Express } from 'express' // database -import connection from '../typeorm/connection' -import getDBVersion from '../typeorm/getDBVersion' +import connection from '@/typeorm/connection' +import { checkDBVersion } from '@/typeorm/DBVersion' // server import cors from './cors' @@ -18,34 +13,32 @@ import serverContext from './context' import plugins from './plugins' // config -import CONFIG from '../config' +import CONFIG from '@/config' // graphql -import schema from '../graphql/schema' +import schema from '@/graphql/schema' // webhooks -import { elopageWebhook } from '../webhook/elopage' +import { elopageWebhook } from '@/webhook/elopage' +import { Connection } from '@dbTools/typeorm' // TODO implement // import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity"; -const DB_VERSION = '0006-login_users_collation' +type ServerDef = { apollo: ApolloServer; app: Express; con: Connection } -const createServer = async (context: any = serverContext): Promise => { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const createServer = async (context: any = serverContext): Promise => { // open mysql connection const con = await connection() if (!con || !con.isConnected) { - throw new Error(`Couldn't open connection to database`) + throw new Error(`Fatal: Couldn't open connection to database`) } // check for correct database version - const dbVersion = await getDBVersion() - if (!dbVersion || dbVersion.indexOf(DB_VERSION) === -1) { - throw new Error( - `Wrong database version - the backend requires '${DB_VERSION}' but found '${ - dbVersion || 'None' - }'`, - ) + const dbVersion = await checkDBVersion(CONFIG.DB_VERSION) + if (!dbVersion) { + throw new Error('Fatal: Database Version incorrect') } // Express Server @@ -54,8 +47,10 @@ const createServer = async (context: any = serverContext): Promise => { // cors app.use(cors) - // bodyparser - app.use(bodyParser.json()) + // bodyparser json + app.use(express.json()) + // bodyparser urlencoded for elopage + app.use(express.urlencoded({ extended: true })) // Elopage Webhook app.post('/hook/elopage/' + CONFIG.WEBHOOK_ELOPAGE_SECRET, elopageWebhook) @@ -64,10 +59,11 @@ const createServer = async (context: any = serverContext): Promise => { const apollo = new ApolloServer({ schema: await schema(), playground: CONFIG.GRAPHIQL, + introspection: CONFIG.GRAPHIQL, context, plugins, }) - apollo.applyMiddleware({ app }) + apollo.applyMiddleware({ app, path: '/' }) return { apollo, app, con } } diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts index 5436d595b..a407135ea 100644 --- a/backend/src/server/plugins.ts +++ b/backend/src/server/plugins.ts @@ -1,20 +1,45 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -const plugins = [ - { - requestDidStart() { - return { - willSendResponse(requestContext: any) { - const { setHeaders = [] } = requestContext.context - setHeaders.forEach(({ key, value }: { [key: string]: string }) => { +import { ApolloLogPlugin, LogMutateData } from 'apollo-log' +import cloneDeep from 'lodash.clonedeep' + +const setHeadersPlugin = { + requestDidStart() { + return { + willSendResponse(requestContext: any) { + const { setHeaders = [] } = requestContext.context + setHeaders.forEach(({ key, value }: { [key: string]: string }) => { + if (requestContext.response.http.headers.get(key)) { + requestContext.response.http.headers.set(key, value) + } else { requestContext.response.http.headers.append(key, value) - }) - return requestContext - }, - } - }, + } + }) + return requestContext + }, + } }, -] +} + +const apolloLogPlugin = ApolloLogPlugin({ + mutate: (data: LogMutateData) => { + // We need to deep clone the object in order to not modify the actual request + const dataCopy = cloneDeep(data) + + // mask password if part of the query + if (dataCopy.context.request.variables && dataCopy.context.request.variables.password) { + dataCopy.context.request.variables.password = '***' + } + + // mask token at all times + dataCopy.context.context.token = '***' + + return dataCopy + }, +}) + +const plugins = + process.env.NODE_ENV === 'development' ? [setHeadersPlugin] : [setHeadersPlugin, apolloLogPlugin] export default plugins diff --git a/backend/src/typeorm/DBVersion.ts b/backend/src/typeorm/DBVersion.ts new file mode 100644 index 000000000..a8cb70489 --- /dev/null +++ b/backend/src/typeorm/DBVersion.ts @@ -0,0 +1,28 @@ +import { Migration } from '@entity/Migration' + +const getDBVersion = async (): Promise => { + try { + const dbVersion = await Migration.findOne({ order: { version: 'DESC' } }) + return dbVersion ? dbVersion.fileName : null + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + return null + } +} + +const checkDBVersion = async (DB_VERSION: string): Promise => { + const dbVersion = await getDBVersion() + if (!dbVersion || dbVersion.indexOf(DB_VERSION) === -1) { + // eslint-disable-next-line no-console + console.log( + `Wrong database version detected - the backend requires '${DB_VERSION}' but found '${ + dbVersion || 'None' + }`, + ) + return false + } + return true +} + +export { checkDBVersion, getDBVersion } diff --git a/backend/src/typeorm/connection.ts b/backend/src/typeorm/connection.ts index 5709c29b6..745b2da94 100644 --- a/backend/src/typeorm/connection.ts +++ b/backend/src/typeorm/connection.ts @@ -1,11 +1,12 @@ -import { createConnection, Connection } from 'typeorm' -import CONFIG from '../config' +// TODO This is super weird - since the entities are defined in another project they have their own globals. +// We cannot use our connection here, but must use the external typeorm installation +import { Connection, createConnection, FileLogger } from '@dbTools/typeorm' +import CONFIG from '@/config' import { entities } from '@entity/index' const connection = async (): Promise => { - let con = null try { - con = await createConnection({ + return createConnection({ name: 'default', type: 'mysql', host: CONFIG.DB_HOST, @@ -15,13 +16,16 @@ const connection = async (): Promise => { database: CONFIG.DB_DATABASE, entities, synchronize: false, + logging: true, + logger: new FileLogger('all', { + logPath: CONFIG.TYPEORM_LOGGING_RELATIVE_PATH, + }), }) } catch (error) { // eslint-disable-next-line no-console console.log(error) + return null } - - return con } export default connection diff --git a/backend/src/typeorm/getDBVersion.ts b/backend/src/typeorm/getDBVersion.ts deleted file mode 100644 index a64a6c2b7..000000000 --- a/backend/src/typeorm/getDBVersion.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { getRepository } from 'typeorm' -import { Migration } from '@entity/Migration' - -const getDBVersion = async (): Promise => { - try { - const dbVersion = await getRepository(Migration).findOne({ order: { version: 'DESC' } }) - return dbVersion ? dbVersion.fileName : null - } catch (error) { - // eslint-disable-next-line no-console - console.log(error) - return null - } -} - -export default getDBVersion diff --git a/backend/src/typeorm/repository/Balance.ts b/backend/src/typeorm/repository/Balance.ts deleted file mode 100644 index b7c20650f..000000000 --- a/backend/src/typeorm/repository/Balance.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { Balance } from '@entity/Balance' - -@EntityRepository(Balance) -export class BalanceRepository extends Repository { - findByUser(userId: number): Promise { - return this.createQueryBuilder('balance').where('balance.userId = :userId', { userId }).getOne() - } -} diff --git a/backend/src/typeorm/repository/LoginElopageBuys.ts b/backend/src/typeorm/repository/LoginElopageBuys.ts deleted file mode 100644 index 15f2a8492..000000000 --- a/backend/src/typeorm/repository/LoginElopageBuys.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { LoginElopageBuys } from '@entity/LoginElopageBuys' - -@EntityRepository(LoginElopageBuys) -export class LoginElopageBuysRepository extends Repository {} diff --git a/backend/src/typeorm/repository/LoginEmailOptIn.ts b/backend/src/typeorm/repository/LoginEmailOptIn.ts deleted file mode 100644 index cb486d922..000000000 --- a/backend/src/typeorm/repository/LoginEmailOptIn.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' - -@EntityRepository(LoginEmailOptIn) -export class LoginEmailOptInRepository extends Repository {} diff --git a/backend/src/typeorm/repository/LoginPendingTasksAdmin.ts b/backend/src/typeorm/repository/LoginPendingTasksAdmin.ts deleted file mode 100644 index b5c55fcd2..000000000 --- a/backend/src/typeorm/repository/LoginPendingTasksAdmin.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { LoginPendingTasksAdmin } from '@entity/LoginPendingTasksAdmin' - -@EntityRepository(LoginPendingTasksAdmin) -export class LoginPendingTasksAdminRepository extends Repository {} diff --git a/backend/src/typeorm/repository/LoginUser.ts b/backend/src/typeorm/repository/LoginUser.ts deleted file mode 100644 index ac7ff31b6..000000000 --- a/backend/src/typeorm/repository/LoginUser.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { LoginUser } from '@entity/LoginUser' - -@EntityRepository(LoginUser) -export class LoginUserRepository extends Repository { - async findByEmail(email: string): Promise { - return this.createQueryBuilder('loginUser') - .where('loginUser.email = :email', { email }) - .getOneOrFail() - } - - async findBySearchCriteria(searchCriteria: string): Promise { - return await this.createQueryBuilder('user') - .where( - 'user.firstName like :name or user.lastName like :lastName or user.email like :email', - { - name: `%${searchCriteria}%`, - lastName: `%${searchCriteria}%`, - email: `%${searchCriteria}%`, - }, - ) - .getMany() - } -} diff --git a/backend/src/typeorm/repository/LoginUserBackup.ts b/backend/src/typeorm/repository/LoginUserBackup.ts deleted file mode 100644 index 8c729139a..000000000 --- a/backend/src/typeorm/repository/LoginUserBackup.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { LoginUserBackup } from '@entity/LoginUserBackup' - -@EntityRepository(LoginUserBackup) -export class LoginUserBackupRepository extends Repository {} diff --git a/backend/src/typeorm/repository/ServerUser.ts b/backend/src/typeorm/repository/ServerUser.ts deleted file mode 100644 index 59d7a09f4..000000000 --- a/backend/src/typeorm/repository/ServerUser.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { ServerUser } from '@entity/ServerUser' - -@EntityRepository(ServerUser) -export class ServerUserRepository extends Repository {} diff --git a/backend/src/typeorm/repository/Transaction.ts b/backend/src/typeorm/repository/Transaction.ts index ab4e301c7..f84b57626 100644 --- a/backend/src/typeorm/repository/Transaction.ts +++ b/backend/src/typeorm/repository/Transaction.ts @@ -1,28 +1,40 @@ -import { EntityRepository, Repository } from 'typeorm' +import { EntityRepository, Repository } from '@dbTools/typeorm' import { Transaction } from '@entity/Transaction' +import { Order } from '@enum/Order' +import { TransactionTypeId } from '@enum/TransactionTypeId' @EntityRepository(Transaction) export class TransactionRepository extends Repository { - async findDecayStartBlock(): Promise { - return this.createQueryBuilder('transaction') - .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: 9 }) - .orderBy('received', 'ASC') - .getOne() + findByUserPaged( + userId: number, + limit: number, + offset: number, + order: Order, + onlyCreation?: boolean, + ): Promise<[Transaction[], number]> { + if (onlyCreation) { + return this.createQueryBuilder('userTransaction') + .where('userTransaction.userId = :userId', { userId }) + .andWhere('userTransaction.typeId = :typeId', { + typeId: TransactionTypeId.CREATION, + }) + .orderBy('userTransaction.balanceDate', order) + .limit(limit) + .offset(offset) + .getManyAndCount() + } + return this.createQueryBuilder('userTransaction') + .where('userTransaction.userId = :userId', { userId }) + .orderBy('userTransaction.balanceDate', order) + .limit(limit) + .offset(offset) + .getManyAndCount() } - async joinFullTransactionsByIds(transactionIds: number[]): Promise { - return this.createQueryBuilder('transaction') - .where('transaction.id IN (:...transactions)', { transactions: transactionIds }) - .leftJoinAndSelect( - 'transaction.transactionSendCoin', - 'transactionSendCoin', - // 'transactionSendCoin.transaction_id = transaction.id', - ) - .leftJoinAndSelect( - 'transaction.transactionCreation', - 'transactionCreation', - // 'transactionSendCoin.transaction_id = transaction.id', - ) - .getMany() + findLastForUser(userId: number): Promise { + return this.createQueryBuilder('userTransaction') + .where('userTransaction.userId = :userId', { userId }) + .orderBy('userTransaction.balanceDate', 'DESC') + .getOne() } } diff --git a/backend/src/typeorm/repository/TransactionCreation.ts b/backend/src/typeorm/repository/TransactionCreation.ts deleted file mode 100644 index 89266838a..000000000 --- a/backend/src/typeorm/repository/TransactionCreation.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { TransactionCreation } from '@entity/TransactionCreation' - -@EntityRepository(TransactionCreation) -export class TransactionCreationRepository extends Repository {} diff --git a/backend/src/typeorm/repository/TransactionLink.ts b/backend/src/typeorm/repository/TransactionLink.ts new file mode 100644 index 000000000..46926673a --- /dev/null +++ b/backend/src/typeorm/repository/TransactionLink.ts @@ -0,0 +1,39 @@ +import { Repository, EntityRepository } from '@dbTools/typeorm' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import Decimal from 'decimal.js-light' + +@EntityRepository(dbTransactionLink) +export class TransactionLinkRepository extends Repository { + async summary( + userId: number, + date: Date, + ): Promise<{ + sumHoldAvailableAmount: Decimal + sumAmount: Decimal + lastDate: Date | null + firstDate: Date | null + transactionLinkcount: number + }> { + const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate, count } = + await this.createQueryBuilder('transactionLinks') + .select('SUM(transactionLinks.holdAvailableAmount)', 'sumHoldAvailableAmount') + .addSelect('SUM(transactionLinks.amount)', 'sumAmount') + .addSelect('MAX(transactionLinks.validUntil)', 'lastDate') + .addSelect('MIN(transactionLinks.createdAt)', 'firstDate') + .addSelect('COUNT(*)', 'count') + .where('transactionLinks.userId = :userId', { userId }) + .andWhere('transactionLinks.redeemedAt is NULL') + .andWhere('transactionLinks.validUntil > :date', { date }) + .orderBy('transactionLinks.createdAt', 'DESC') + .getRawOne() + return { + sumHoldAvailableAmount: sumHoldAvailableAmount + ? new Decimal(sumHoldAvailableAmount) + : new Decimal(0), + sumAmount: sumAmount ? new Decimal(sumAmount) : new Decimal(0), + lastDate: lastDate || null, + firstDate: firstDate || null, + transactionLinkcount: count || 0, + } + } +} diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index cf67c837b..01f61dcbc 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -1,46 +1,42 @@ -import { EntityRepository, Repository } from 'typeorm' +import { Brackets, EntityRepository, ObjectLiteral, Repository } from '@dbTools/typeorm' import { User } from '@entity/User' @EntityRepository(User) export class UserRepository extends Repository { async findByPubkeyHex(pubkeyHex: string): Promise { return this.createQueryBuilder('user') - .where('hex(user.pubkey) = :pubkeyHex', { pubkeyHex }) + .where('hex(user.pubKey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() } - async findByPubkeyHexBuffer(pubkeyHexBuffer: Buffer): Promise { - const pubKeyString = pubkeyHexBuffer.toString('hex') - return await this.findByPubkeyHex(pubKeyString) - } - - async findByEmail(email: string): Promise { - return this.createQueryBuilder('user').where('user.email = :email', { email }).getOneOrFail() - } - - async getUsersIndiced(userIds: number[]): Promise { - if (!userIds.length) return [] - const users = await this.createQueryBuilder('user') - .select(['user.id', 'user.firstName', 'user.lastName', 'user.email']) - .where('user.id IN (:...users)', { users: userIds }) - .getMany() - const usersIndiced: User[] = [] - users.forEach((value) => { - usersIndiced[value.id] = value - }) - return usersIndiced - } - - async findBySearchCriteria(searchCriteria: string): Promise { - return await this.createQueryBuilder('user') + async findBySearchCriteriaPagedFiltered( + select: string[], + searchCriteria: string, + filterCriteria: ObjectLiteral[], + currentPage: number, + pageSize: number, + ): Promise<[User[], number]> { + const query = await this.createQueryBuilder('user') + .select(select) + .withDeleted() .where( - 'user.firstName like :name or user.lastName like :lastName or user.email like :email', - { - name: `%${searchCriteria}%`, - lastName: `%${searchCriteria}%`, - email: `%${searchCriteria}%`, - }, + new Brackets((qb) => { + qb.where( + 'user.firstName like :name or user.lastName like :lastName or user.email like :email', + { + name: `%${searchCriteria}%`, + lastName: `%${searchCriteria}%`, + email: `%${searchCriteria}%`, + }, + ) + }), ) - .getMany() + filterCriteria.forEach((filter) => { + query.andWhere(filter) + }) + return query + .take(pageSize) + .skip((currentPage - 1) * pageSize) + .getManyAndCount() } } diff --git a/backend/src/typeorm/repository/UserSettingRepository.ts b/backend/src/typeorm/repository/UserSettingRepository.ts index 80c44802b..528090ff2 100644 --- a/backend/src/typeorm/repository/UserSettingRepository.ts +++ b/backend/src/typeorm/repository/UserSettingRepository.ts @@ -1,7 +1,7 @@ -import { EntityRepository, Repository } from 'typeorm' +import { EntityRepository, Repository } from '@dbTools/typeorm' import { UserSetting } from '@entity/UserSetting' -import { Setting } from '../../graphql/enum/Setting' -import { isStringBoolean } from '../../util/validate' +import { Setting } from '@enum/Setting' +import { isStringBoolean } from '@/util/validate' @EntityRepository(UserSetting) export class UserSettingRepository extends Repository { diff --git a/backend/src/typeorm/repository/UserTransaction.ts b/backend/src/typeorm/repository/UserTransaction.ts deleted file mode 100644 index 57f89d5a5..000000000 --- a/backend/src/typeorm/repository/UserTransaction.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm' -import { Order } from '../../graphql/enum/Order' -import { UserTransaction } from '@entity/UserTransaction' - -@EntityRepository(UserTransaction) -export class UserTransactionRepository extends Repository { - findByUserPaged( - userId: number, - limit: number, - offset: number, - order: Order, - onlyCreation?: boolean, - ): Promise<[UserTransaction[], number]> { - if (onlyCreation) { - return this.createQueryBuilder('userTransaction') - .where('userTransaction.userId = :userId', { userId }) - .andWhere('userTransaction.type = "creation"') - .orderBy('userTransaction.balanceDate', order) - .limit(limit) - .offset(offset) - .getManyAndCount() - } - return this.createQueryBuilder('userTransaction') - .where('userTransaction.userId = :userId', { userId }) - .orderBy('userTransaction.balanceDate', order) - .limit(limit) - .offset(offset) - .getManyAndCount() - } - - findLastForUser(userId: number): Promise { - return this.createQueryBuilder('userTransaction') - .where('userTransaction.userId = :userId', { userId }) - .orderBy('userTransaction.transactionId', 'DESC') - .getOne() - } -} diff --git a/backend/src/util/communityUser.ts b/backend/src/util/communityUser.ts new file mode 100644 index 000000000..33ac2fad2 --- /dev/null +++ b/backend/src/util/communityUser.ts @@ -0,0 +1,44 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { SaveOptions, RemoveOptions } from '@dbTools/typeorm' +import { User as dbUser } from '@entity/User' +import { User } from '@model/User' + +const communityDbUser: dbUser = { + id: -1, + email: 'support@gradido.net', + firstName: 'Gradido', + lastName: 'Akademie', + pubKey: Buffer.from(''), + privKey: Buffer.from(''), + deletedAt: null, + password: BigInt(0), + emailHash: Buffer.from(''), + createdAt: new Date(), + emailChecked: false, + language: '', + publisherId: 0, + passphrase: '', + settings: [], + hasId: function (): boolean { + throw new Error('Function not implemented.') + }, + save: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + remove: function (options?: RemoveOptions): Promise { + throw new Error('Function not implemented.') + }, + softRemove: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + recover: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + reload: function (): Promise { + throw new Error('Function not implemented.') + }, +} +const communityUser = new User(communityDbUser) + +export { communityDbUser, communityUser } diff --git a/backend/src/util/decay.test.ts b/backend/src/util/decay.test.ts index e34d8b58b..f1111fab4 100644 --- a/backend/src/util/decay.test.ts +++ b/backend/src/util/decay.test.ts @@ -1,40 +1,41 @@ +import Decimal from 'decimal.js-light' +import 'reflect-metadata' // This might be wise to load in a test setup file import { decayFormula, calculateDecay } from './decay' describe('utils/decay', () => { describe('decayFormula', () => { it('has base 0.99999997802044727', () => { - const amount = 1.0 + const amount = new Decimal(1.0) const seconds = 1 - expect(decayFormula(amount, seconds)).toBe(0.99999997802044727) - }) - // Not sure if the following skiped tests make sence!? - it('has negative decay?', async () => { - const amount = -1.0 - const seconds = 1 - expect(await decayFormula(amount, seconds)).toBe(-0.99999997802044727) + // TODO: toString() was required, we could not compare two decimals + expect(decayFormula(amount, seconds).toString()).toBe('0.999999978035040489732012') }) it('has correct backward calculation', async () => { - const amount = 1.0 + const amount = new Decimal(1.0) const seconds = -1 - expect(await decayFormula(amount, seconds)).toBe(1.0000000219795533) + expect(decayFormula(amount, seconds).toString()).toBe('1.000000021964959992727444') }) - // not possible, nodejs hasn't enough accuracy - it('has correct forward calculation', async () => { - const amount = 1.0 / 0.99999997802044727 + // we get pretty close, but not exact here, skipping + it.skip('has correct forward calculation', async () => { + const amount = new Decimal(1.0).div( + new Decimal('0.99999997803504048973201202316767079413460520837376'), + ) const seconds = 1 - expect(await decayFormula(amount, seconds)).toBe(1.0) + expect(decayFormula(amount, seconds).toString()).toBe('1.0') }) }) - it.skip('has base 0.99999997802044727', async () => { + it('has base 0.99999997802044727', async () => { const now = new Date() now.setSeconds(1) const oneSecondAgo = new Date(now.getTime()) oneSecondAgo.setSeconds(0) - expect(await calculateDecay(1.0, oneSecondAgo, now)).toBe(0.99999997802044727) + expect(calculateDecay(new Decimal(1.0), oneSecondAgo, now).balance.toString()).toBe( + '0.999999978035040489732012', + ) }) it('returns input amount when from and to is the same', async () => { const now = new Date() - expect(await calculateDecay(100.0, now, now)).toBe(100.0) + expect(calculateDecay(new Decimal(100.0), now, now).balance.toString()).toBe('100') }) }) diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index 75f96f18c..36f83f23f 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -1,70 +1,58 @@ -import { getCustomRepository } from 'typeorm' -import { Decay } from '../graphql/model/Decay' -import { TransactionRepository } from '../typeorm/repository/Transaction' +import Decimal from 'decimal.js-light' +import CONFIG from '@/config' +import { Decay } from '@model/Decay' -function decayFormula(amount: number, seconds: number): number { - return amount * Math.pow(0.99999997802044727, seconds) // This number represents 50% decay a year +// TODO: externalize all those definitions and functions into an external decay library + +function decayFormula(value: Decimal, seconds: number): Decimal { + // TODO why do we need to convert this here to a stting to work properly? + return value.mul( + new Decimal('0.99999997803504048973201202316767079413460520837376').pow(seconds).toString(), + ) } -async function calculateDecay(amount: number, from: Date, to: Date): Promise { - if (amount === undefined || !from || !to) { - throw new Error('at least one parameter is undefined') +function calculateDecay( + amount: Decimal, + from: Date, + to: Date, + startBlock: Date = CONFIG.DECAY_START_TIME, +): Decay { + const fromMs = from.getTime() + const toMs = to.getTime() + const startBlockMs = startBlock.getTime() + + if (toMs < fromMs) { + throw new Error('to < from, reverse decay calculation is invalid') } - if (from === to) { - return amount + + // Initialize with no decay + const decay: Decay = { + balance: amount, + decay: new Decimal(0), + start: null, + end: null, + duration: null, } - if (to < from) { - throw new Error('to < from, so the target date is in the past?') + + // decay started after end date; no decay + if (startBlockMs > toMs) { + return decay } - // load decay start block - const transactionRepository = getCustomRepository(TransactionRepository) - const decayStartBlock = await transactionRepository.findDecayStartBlock() - - // if decay hasn't started yet we return input amount - if (!decayStartBlock) return amount - - // what happens when from > to - // Do we want to have negative decay? - const decayDuration = (to.getTime() - from.getTime()) / 1000 - return decayFormula(amount, decayDuration) -} - -async function calculateDecayWithInterval( - amount: number, - from: number | Date, - to: number | Date, -): Promise { - const transactionRepository = getCustomRepository(TransactionRepository) - const decayStartBlock = await transactionRepository.findDecayStartBlock() - - const result = new Decay(undefined) - result.balance = amount - const fromMillis = typeof from === 'number' ? from : from.getTime() - const toMillis = typeof to === 'number' ? to : to.getTime() - result.decayStart = (fromMillis / 1000).toString() - result.decayEnd = (toMillis / 1000).toString() - - // (amount, from.getTime(), to.getTime()) - - // if no decay start block exist or decay startet after end date - if (!decayStartBlock || decayStartBlock.received.getTime() > toMillis) { - return result + // decay started before start date; decay for full duration + if (startBlockMs < fromMs) { + decay.start = from + decay.duration = (toMs - fromMs) / 1000 } - const decayStartBlockMillis = decayStartBlock.received.getTime() - - // if decay start date is before start date we calculate decay for full duration - if (decayStartBlockMillis < fromMillis) { - result.decayDuration = toMillis - fromMillis - } - // if decay start in between start date and end date we caculcate decay from decay start time to end date + // decay started between start and end date; decay from decay start till end date else { - result.decayDuration = toMillis - decayStartBlockMillis - result.decayStart = (decayStartBlockMillis / 1000).toString() + decay.start = startBlock + decay.duration = (toMs - startBlockMs) / 1000 } - // js use timestamp in milliseconds but we calculate with seconds - result.decayDuration /= 1000 - result.balance = decayFormula(amount, result.decayDuration) - return result + + decay.end = to + decay.balance = decayFormula(amount, decay.duration) + decay.decay = decay.balance.minus(amount) + return decay } -export { decayFormula, calculateDecay, calculateDecayWithInterval } +export { decayFormula, calculateDecay } diff --git a/backend/src/util/hasElopageBuys.ts b/backend/src/util/hasElopageBuys.ts new file mode 100644 index 000000000..4e23e717c --- /dev/null +++ b/backend/src/util/hasElopageBuys.ts @@ -0,0 +1,6 @@ +import { LoginElopageBuys } from '@entity/LoginElopageBuys' + +export async function hasElopageBuys(email: string): Promise { + const elopageBuyCount = await LoginElopageBuys.count({ payerEmail: email }) + return elopageBuyCount > 0 +} diff --git a/backend/src/util/round.test.ts b/backend/src/util/round.test.ts deleted file mode 100644 index a33867157..000000000 --- a/backend/src/util/round.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { roundCeilFrom4, roundFloorFrom4, roundCeilFrom2, roundFloorFrom2 } from './round' - -describe('utils/round', () => { - it('roundCeilFrom4', () => { - const amount = 11617 - expect(roundCeilFrom4(amount)).toBe(1.17) - }) - // Not sure if the following skiped tests make sence!? - it('roundFloorFrom4', () => { - const amount = 11617 - expect(roundFloorFrom4(amount)).toBe(1.16) - }) - it('roundCeilFrom2', () => { - const amount = 1216 - expect(roundCeilFrom2(amount)).toBe(13) - }) - // not possible, nodejs hasn't enough accuracy - it('roundFloorFrom2', () => { - const amount = 1216 - expect(roundFloorFrom2(amount)).toBe(12) - }) -}) diff --git a/backend/src/util/round.ts b/backend/src/util/round.ts deleted file mode 100644 index 18e15afcd..000000000 --- a/backend/src/util/round.ts +++ /dev/null @@ -1,17 +0,0 @@ -function roundCeilFrom4(decimal: number): number { - return Math.ceil(decimal / 100) / 100 -} - -function roundFloorFrom4(decimal: number): number { - return Math.floor(decimal / 100) / 100 -} - -function roundCeilFrom2(decimal: number): number { - return Math.ceil(decimal / 100) -} - -function roundFloorFrom2(decimal: number): number { - return Math.floor(decimal / 100) -} - -export { roundCeilFrom4, roundFloorFrom4, roundCeilFrom2, roundFloorFrom2 } diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 55449cb8e..95e1bf699 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -1,7 +1,9 @@ -import { User as dbUser } from '@entity/User' -import { Balance as dbBalance } from '@entity/Balance' -import { getRepository } from 'typeorm' import { calculateDecay } from './decay' +import Decimal from 'decimal.js-light' +import { Transaction } from '@entity/Transaction' +import { Decay } from '@model/Decay' +import { getCustomRepository } from '@dbTools/typeorm' +import { TransactionLinkRepository } from '@repository/TransactionLink' function isStringBoolean(value: string): boolean { const lowerValue = value.toLowerCase() @@ -15,14 +17,25 @@ function isHexPublicKey(publicKey: string): boolean { return /^[0-9A-Fa-f]{64}$/i.test(publicKey) } -async function hasUserAmount(user: dbUser, amount: number): Promise { - if (amount < 0) return false - const balanceRepository = getRepository(dbBalance) - const balance = await balanceRepository.findOne({ userId: user.id }) - if (!balance) return false +async function calculateBalance( + userId: number, + amount: Decimal, + time: Date, +): Promise<{ balance: Decimal; decay: Decay; lastTransactionId: number } | null> { + const lastTransaction = await Transaction.findOne({ userId }, { order: { balanceDate: 'DESC' } }) + if (!lastTransaction) return null - const decay = await calculateDecay(balance.amount, balance.recordDate, new Date()) - return decay > amount + const decay = calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, time) + + // TODO why we have to use toString() here? + const balance = decay.balance.add(amount.toString()) + const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) + const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(userId, time) + + if (balance.minus(sumHoldAvailableAmount.toString()).lessThan(0)) { + return null + } + return { balance, lastTransactionId: lastTransaction.id, decay } } -export { isHexPublicKey, hasUserAmount, isStringBoolean } +export { isHexPublicKey, calculateBalance, isStringBoolean } diff --git a/backend/src/util/virtualTransactions.ts b/backend/src/util/virtualTransactions.ts new file mode 100644 index 000000000..e4b9eec1f --- /dev/null +++ b/backend/src/util/virtualTransactions.ts @@ -0,0 +1,82 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Transaction } from '@model/Transaction' +import { SaveOptions, RemoveOptions } from '@dbTools/typeorm' +import { Transaction as dbTransaction } from '@entity/Transaction' +import { TransactionTypeId } from '@enum/TransactionTypeId' +import { calculateDecay } from './decay' +import { User } from '@model/User' +import Decimal from 'decimal.js-light' + +const defaultModelFunctions = { + hasId: function (): boolean { + throw new Error('Function not implemented.') + }, + save: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + remove: function (options?: RemoveOptions): Promise { + throw new Error('Function not implemented.') + }, + softRemove: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + recover: function (options?: SaveOptions): Promise { + throw new Error('Function not implemented.') + }, + reload: function (): Promise { + throw new Error('Function not implemented.') + }, +} + +const virtualLinkTransaction = ( + balance: Decimal, + amount: Decimal, + holdAvailableAmount: Decimal, + decay: Decimal, + createdAt: Date, + validUntil: Date, + user: User, +): Transaction => { + const linkDbTransaction: dbTransaction = { + id: -2, + userId: -1, + previous: -1, + typeId: TransactionTypeId.LINK_SUMMARY, + amount: amount, + balance: balance, + balanceDate: validUntil, + decayStart: createdAt, + decay: decay, + memo: '', + creationDate: null, + ...defaultModelFunctions, + } + return new Transaction(linkDbTransaction, user) +} + +const virtualDecayTransaction = ( + balance: Decimal, + balanceDate: Date, + time: Date = new Date(), + user: User, +): Transaction => { + const decay = calculateDecay(balance, balanceDate, time) + // const balance = decay.balance.minus(lastTransaction.balance) + const decayDbTransaction: dbTransaction = { + id: -1, + userId: -1, + previous: -1, + typeId: TransactionTypeId.DECAY, + amount: decay.decay ? decay.decay : new Decimal(0), // new Decimal(0), // this kinda is wrong, but helps with the frontend query + balance: decay.balance, + balanceDate: time, + decay: decay.decay ? decay.decay : new Decimal(0), + decayStart: decay.start, + memo: '', + creationDate: null, + ...defaultModelFunctions, + } + return new Transaction(decayDbTransaction, user) +} + +export { virtualLinkTransaction, virtualDecayTransaction } diff --git a/backend/src/webhook/elopage.ts b/backend/src/webhook/elopage.ts index 80fa90933..d5eaef521 100644 --- a/backend/src/webhook/elopage.ts +++ b/backend/src/webhook/elopage.ts @@ -28,80 +28,71 @@ */ import { LoginElopageBuys } from '@entity/LoginElopageBuys' -import { LoginUser } from '@entity/LoginUser' -import { UserResolver } from '../graphql/resolver/UserResolver' +import { UserResolver } from '@/graphql/resolver/UserResolver' +import { User as dbUser } from '@entity/User' export const elopageWebhook = async (req: any, res: any): Promise => { + // eslint-disable-next-line no-console + console.log('Elopage Hook received', req.body) res.status(200).end() // Responding is important + const loginElopageBuy = new LoginElopageBuys() - const loginElopgaeBuy = new LoginElopageBuys() - let firstName = '' - let lastName = '' - const entries = req.body.split('&') - entries.foreach((entry: string) => { - const keyVal = entry.split('=') - if (keyVal.length !== 2) { - throw new Error(`Error parsing entry '${entry}'`) - } - const key = keyVal[0] - const val = decodeURIComponent(keyVal[1]).replace('+', ' ').trim() - switch (key) { - case 'product[affiliate_program_id]': - loginElopgaeBuy.affiliateProgramId = parseInt(val) - break - case 'publisher[id]': - loginElopgaeBuy.publisherId = parseInt(val) - break - case 'order_id': - loginElopgaeBuy.orderId = parseInt(val) - break - case 'product_id': - loginElopgaeBuy.productId = parseInt(val) - break - case 'product[price]': - // TODO: WHAT THE ACTUAL FUK? Please save this as float in the future directly in the database - loginElopgaeBuy.productPrice = Math.trunc(parseFloat(val) * 100) - break - case 'payer[email]': - loginElopgaeBuy.payerEmail = val - break - case 'publisher[email]': - loginElopgaeBuy.publisherEmail = val - break - case 'payment_state': - loginElopgaeBuy.payed = val === 'paid' - break - case 'success_date': - loginElopgaeBuy.successDate = new Date(val) - break - case 'event': - loginElopgaeBuy.event = val - break - case 'membership[id]': - // TODO this was never set on login_server - its unclear if this is the correct value - loginElopgaeBuy.elopageUserId = parseInt(val) - break - case 'payer[first_name]': - firstName = val - break - case 'payer[last_name]': - lastName = val - break - default: - // eslint-disable-next-line no-console - console.log(`Unknown Elopage Value '${entry}'`) - } - }) + const { + payer, + product, + publisher, + // eslint-disable-next-line camelcase + order_id, + // eslint-disable-next-line camelcase + product_id, + // eslint-disable-next-line camelcase + payment_state, + // eslint-disable-next-line camelcase + success_date, + event, + membership, + } = req.body // Do not process certain events - if (['lesson.viewed', 'lesson.completed', 'lesson.commented'].includes(loginElopgaeBuy.event)) { + if (['lesson.viewed', 'lesson.completed', 'lesson.commented'].includes(event)) { // eslint-disable-next-line no-console console.log('User viewed, completed or commented - not saving hook') return } + if (!product || !publisher || !membership || !payer) { + // eslint-disable-next-line no-console + console.log('Elopage Hook: Not an event we can process') + return + } + + loginElopageBuy.affiliateProgramId = parseInt(product.affiliate_program_id) || null + loginElopageBuy.publisherId = parseInt(publisher.id) || null + loginElopageBuy.orderId = parseInt(order_id) || null + loginElopageBuy.productId = parseInt(product_id) || null + // TODO: WHAT THE ACTUAL FUK? Please save this as float in the future directly in the database + const productPrice = parseFloat(product.price) + loginElopageBuy.productPrice = productPrice ? Math.trunc(productPrice * 100) : 0 + loginElopageBuy.payerEmail = payer.email + loginElopageBuy.publisherEmail = publisher.email + // eslint-disable-next-line camelcase + loginElopageBuy.payed = payment_state === 'paid' + loginElopageBuy.successDate = new Date(success_date) + loginElopageBuy.event = event + // TODO this was never set on login_server - its unclear if this is the correct value + loginElopageBuy.elopageUserId = parseInt(membership.id) || null + + const firstName = payer.first_name + const lastName = payer.last_name + // Save the hook data - await loginElopgaeBuy.save() + try { + await LoginElopageBuys.save(loginElopageBuy) + } catch (error) { + // eslint-disable-next-line no-console + console.log('Error saving LoginElopageBuy', error) + return + } // create user for certain products /* @@ -112,8 +103,11 @@ export const elopageWebhook = async (req: any, res: any): Promise => { Business-Mitgliedschaft, 43960 Förderbeitrag: 49106 */ - if ([36001, 43741, 43870, 43944, 43960, 49106].includes(loginElopgaeBuy.productId)) { - const email = loginElopgaeBuy.payerEmail + if ( + loginElopageBuy.productId && + [36001, 43741, 43870, 43944, 43960, 49106].includes(loginElopageBuy.productId) + ) { + const email = loginElopageBuy.payerEmail const VALIDATE_EMAIL = /^[a-zA-Z0-9.!#$%&?*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/ const VALIDATE_NAME = /^<>&;]{2,}$/ @@ -133,7 +127,7 @@ export const elopageWebhook = async (req: any, res: any): Promise => { } // Do we already have such a user? - if ((await LoginUser.count({ email })) !== 0) { + if ((await dbUser.count({ email })) !== 0) { // eslint-disable-next-line no-console console.log(`Did not create User - already exists with email: ${email}`) return @@ -145,7 +139,7 @@ export const elopageWebhook = async (req: any, res: any): Promise => { email, firstName, lastName, - publisherId: loginElopgaeBuy.publisherId, + publisherId: loginElopageBuy.publisherId || 0, // This seemed to be the default value if not set }) } catch (error) { // eslint-disable-next-line no-console diff --git a/backend/test/helpers.ts b/backend/test/helpers.ts new file mode 100644 index 000000000..51610b07e --- /dev/null +++ b/backend/test/helpers.ts @@ -0,0 +1,48 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + +import { createTestClient } from 'apollo-server-testing' +import createServer from '../src/server/createServer' +import { initialize } from '@dbTools/helpers' +import { entities } from '@entity/index' + +export const headerPushMock = jest.fn((t) => { + context.token = t.value +}) + +const context = { + token: '', + setHeaders: { + push: headerPushMock, + forEach: jest.fn(), + }, +} + +export const cleanDB = async () => { + // this only works as lond we do not have foreign key constraints + for (let i = 0; i < entities.length; i++) { + await resetEntity(entities[i]) + } +} + +export const testEnvironment = async () => { + const server = await createServer(context) + const con = server.con + const testClient = createTestClient(server.apollo) + const mutate = testClient.mutate + const query = testClient.query + await initialize() + return { mutate, query, con } +} + +export const resetEntity = async (entity: any) => { + const items = await entity.find({ withDeleted: true }) + if (items.length > 0) { + const ids = items.map((i: any) => i.id) + await entity.delete(ids) + } +} + +export const resetToken = () => { + context.token = '' +} diff --git a/backend/test/testSetup.ts b/backend/test/testSetup.ts new file mode 100644 index 000000000..d42836626 --- /dev/null +++ b/backend/test/testSetup.ts @@ -0,0 +1,7 @@ +/* eslint-disable no-console */ + +// disable console.info for apollo log + +// eslint-disable-next-line @typescript-eslint/no-empty-function +console.info = () => {} +jest.setTimeout(1000000) diff --git a/backend/tsconfig.json b/backend/tsconfig.json index eabdc75b0..f81bf22d5 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -45,10 +45,17 @@ /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + "baseUrl": ".", /* Base directory to resolve non-absolute module names. */ "paths": { /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - "@entity/*": ["../database/entity/*"], - "@dbTools/*": ["../database/src/*"] + "@/*": ["src/*"], + "@arg/*": ["src/graphql/arg/*"], + "@enum/*": ["src/graphql/enum/*"], + "@model/*": ["src/graphql/model/*"], + "@repository/*": ["src/typeorm/repository/*"], + "@test/*": ["test/*"], + /* external */ + "@dbTools/*": ["../database/src/*", "../../database/build/src/*"], + "@entity/*": ["../database/entity/*", "../../database/build/entity/*"] }, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ @@ -76,7 +83,7 @@ { "path": "../database/tsconfig.json", // add 'prepend' if you want to include the referenced project in your output file - // "prepend": true, + // "prepend": true } ] } diff --git a/backend/yarn.lock b/backend/yarn.lock index b46bc183d..4134e1d37 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@apollo/protobufjs@1.2.2": +"@apollo/protobufjs@1.2.2", "@apollo/protobufjs@^1.0.3": version "1.2.2" resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" integrity sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ== @@ -677,11 +677,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sqltools/formatter@^1.2.2": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" - integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== - "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -816,6 +811,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/faker@^5.5.9": + version "5.5.9" + resolved "https://registry.yarnpkg.com/@types/faker/-/faker-5.5.9.tgz#588ede92186dc557bff8341d294335d50d255f0c" + integrity sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA== + "@types/fs-capacitor@*": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" @@ -918,6 +918,18 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/lodash.clonedeep@^4.5.6": + version "4.5.6" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.6.tgz#3b6c40a0affe0799a2ce823b440a6cf33571d32b" + integrity sha512-cE1jYr2dEg1wBImvXlNtp0xDoS79rfEdGozQVgliDZj1uERH4k+rmEMTudP9b4VQ8O6nRb5gPqft0QzEQGMQgA== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== + "@types/long@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" @@ -1012,11 +1024,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/zen-observable@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" - integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== - "@typescript-eslint/eslint-plugin@^4.28.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" @@ -1191,21 +1198,11 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1225,11 +1222,6 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= - anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -1273,6 +1265,24 @@ apollo-link@^1.2.14: tslib "^1.9.3" zen-observable-ts "^0.8.21" +apollo-log@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/apollo-log/-/apollo-log-1.1.0.tgz#e21287c917cf735b77adc06f07034f965e9b24de" + integrity sha512-TciLu+85LSqk7t7ZGKrYN5jFiCcRMLujBjrLiOQGHGgVVkvmKlwK0oELSS9kiHQIhTq23p8qVVWb08spLpQ7Jw== + dependencies: + apollo-server-plugin-base "^0.10.4" + chalk "^4.1.0" + fast-safe-stringify "^2.0.7" + loglevelnext "^4.0.1" + nanoid "^3.1.20" + +apollo-reporting-protobuf@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz#5572866be9b77f133916532b10e15fbaa4158304" + integrity sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw== + dependencies: + "@apollo/protobufjs" "^1.0.3" + apollo-reporting-protobuf@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz#ae9d967934d3d8ed816fc85a0d8068ef45c371b9" @@ -1280,6 +1290,13 @@ apollo-reporting-protobuf@^0.8.0: dependencies: "@apollo/protobufjs" "1.2.2" +apollo-server-caching@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz#cf42a77ad09a46290a246810075eaa029b5305e1" + integrity sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ== + dependencies: + lru-cache "^6.0.0" + apollo-server-caching@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz#e6d1e68e3bb571cba63a61f60b434fb771c6ff39" @@ -1318,7 +1335,7 @@ apollo-server-core@^2.25.2: subscriptions-transport-ws "^0.9.19" uuid "^8.0.0" -apollo-server-env@^3.1.0: +apollo-server-env@^3.0.0, apollo-server-env@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.1.0.tgz#0733c2ef50aea596cc90cf40a53f6ea2ad402cd0" integrity sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ== @@ -1354,6 +1371,13 @@ apollo-server-express@^2.25.2: subscriptions-transport-ws "^0.9.19" type-is "^1.6.16" +apollo-server-plugin-base@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.4.tgz#fbf73f64f95537ca9f9639dd7c535eb5eeb95dcd" + integrity sha512-HRhbyHgHFTLP0ImubQObYhSgpmVH4Rk1BinnceZmwudIVLKrqayIVOELdyext/QnSmmzg5W7vF3NLGBcVGMqDg== + dependencies: + apollo-server-types "^0.6.3" + apollo-server-plugin-base@^0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz#3f85751a420d3c4625355b6cb3fbdd2acbe71f13" @@ -1368,6 +1392,15 @@ apollo-server-testing@^2.25.2: dependencies: apollo-server-core "^2.25.2" +apollo-server-types@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.6.3.tgz#f7aa25ff7157863264d01a77d7934aa6e13399e8" + integrity sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg== + dependencies: + apollo-reporting-protobuf "^0.6.2" + apollo-server-caching "^0.5.3" + apollo-server-env "^3.0.0" + apollo-server-types@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.9.0.tgz#ccf550b33b07c48c72f104fbe2876232b404848b" @@ -1395,11 +1428,6 @@ apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: ts-invariant "^0.4.0" tslib "^1.10.0" -app-root-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" - integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1412,11 +1440,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1542,17 +1565,12 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.19.0, body-parser@^1.18.3, body-parser@^1.19.0: +body-parser@1.19.0, body-parser@^1.18.3: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -1637,14 +1655,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - busboy@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" @@ -1698,17 +1708,6 @@ caniuse-lite@^1.0.30001264: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1775,18 +1774,6 @@ cli-boxes@^2.2.1: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -cli-highlight@^2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1979,6 +1966,11 @@ debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" +decimal.js-light@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decimal.js@^10.2.1: version "10.3.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" @@ -2110,11 +2102,6 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -dotenv@^8.2.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -2223,7 +2210,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -2528,6 +2515,11 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +faker@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/faker/-/faker-5.5.3.tgz#c57974ee484431b25205c2c8dc09fda861e51e0e" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2559,6 +2551,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fastq@^1.6.0: version "1.13.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" @@ -2573,11 +2570,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figlet@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634" - integrity sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ== - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2865,13 +2857,6 @@ graphql@^15.5.1: resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.1.tgz#9125bdf057553525da251e19e96dab3d3855ddfc" integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -2911,11 +2896,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -3007,11 +2987,6 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -3751,13 +3726,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -4008,6 +3976,11 @@ loglevel@^1.6.7: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +loglevelnext@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-4.0.1.tgz#4406c6348c243a35272ac75d7d8e4e60ecbcd011" + integrity sha512-/tlMUn5wqgzg9msy0PiWc+8fpVXEuYPq49c2RGyw2NAh0hSrgq6j/Z3YPnwWsILMoFJ+ZT6ePHnWUonkjDnq2Q== + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -4129,21 +4102,6 @@ minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -module-alias@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" - integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== - -moment@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4178,15 +4136,6 @@ mysql2@^2.3.0: seq-queue "^0.0.5" sqlstring "^2.3.2" -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - named-placeholders@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8" @@ -4194,6 +4143,11 @@ named-placeholders@^1.1.2: dependencies: lru-cache "^4.1.3" +nanoid@^3.1.20: + version "3.1.32" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.32.tgz#8f96069e6239cc0a9ae8c0d3b41a3b4933a88c0a" + integrity sha512-F8mf7R3iT9bvThBoW4tGXhXFHCctyCiUUPrWF8WaTqa3h96d9QybkSeba43XVOOE3oiLfkVDe4bT8MeGmkrTxw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4291,7 +4245,7 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -object-assign@^4, object-assign@^4.0.1: +object-assign@^4: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4444,11 +4398,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parent-require@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" - integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -4457,23 +4406,11 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@6.0.1, parse5@^6.0.1: +parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parseurl@^1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -4831,11 +4768,6 @@ safe-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -5080,13 +5012,6 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -5130,11 +5055,6 @@ subscriptions-transport-ws@^0.9.19: symbol-observable "^1.0.4" ws "^5.2.0 || ^6.0.0 || ^7.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5208,20 +5128,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - throat@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" @@ -5331,6 +5237,16 @@ tsconfig-paths@^3.11.0: minimist "^1.2.0" strip-bom "^3.0.0" +tsconfig-paths@^3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz#4fcc48f9ccea8826c41b9ca093479de7f5018976" + integrity sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -5406,29 +5322,6 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typeorm@^0.2.38: - version "0.2.38" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.38.tgz#2af08079919f6ab04cd17017f9faa2c8d5cd566f" - integrity sha512-M6Y3KQcAREQcphOVJciywf4mv6+A0I/SeR+lWNjKsjnQ+a3XcMwGYMGL0Jonsx3H0Cqlf/3yYqVki1jIXSK/xg== - dependencies: - "@sqltools/formatter" "^1.2.2" - app-root-path "^3.0.0" - buffer "^6.0.3" - chalk "^4.1.0" - cli-highlight "^2.1.11" - debug "^4.3.1" - dotenv "^8.2.0" - glob "^7.1.6" - js-yaml "^4.0.0" - mkdirp "^1.0.4" - reflect-metadata "^0.1.13" - sha.js "^2.4.11" - tslib "^2.1.0" - xml2js "^0.4.23" - yargonaut "^1.1.4" - yargs "^17.0.1" - zen-observable-ts "^1.0.0" - typescript@^4.3.4: version "4.4.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" @@ -5694,19 +5587,6 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@^0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -5735,21 +5615,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargonaut@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" - integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== - dependencies: - chalk "^1.1.1" - figlet "^1.1.1" - parent-require "^1.0.0" - yargs-parser@20.x, yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^16.0.0, yargs@^16.2.0: +yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -5762,19 +5633,6 @@ yargs@^16.0.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.1: - version "17.2.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" - integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -5788,15 +5646,7 @@ zen-observable-ts@^0.8.21: tslib "^1.9.3" zen-observable "^0.8.0" -zen-observable-ts@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" - integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== - dependencies: - "@types/zen-observable" "0.8.3" - zen-observable "0.8.15" - -zen-observable@0.8.15, zen-observable@^0.8.0: +zen-observable@^0.8.0: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/community_server/.gitignore b/community_server/.gitignore deleted file mode 100644 index 633978598..000000000 --- a/community_server/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -config/app.php -logs/ -src/GPBMetadata/ -tmp/ -vendor/ -websrc/node_modules/ -websrc/package-lock.json -mithril_client/ -websrc/src/less-files.css - diff --git a/community_server/.gitmodules b/community_server/.gitmodules deleted file mode 100644 index 8499eaac6..000000000 --- a/community_server/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src/protobuf"] - path = src/protobuf - url = git@github.com:gradido/gradido_protocol.git diff --git a/community_server/Dockerfile b/community_server/Dockerfile deleted file mode 100644 index c553137c6..000000000 --- a/community_server/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM phpdockerio/php74-fpm as community_server - -# install php fpm -RUN apt-get update \ - && apt-get -y --no-install-recommends install curl unzip php7.4-curl php7.4-fpm php7.4-mbstring php7.4-intl php7.4-xml php7.4-pdo php7.4-mysql php7.4-xdebug \ - && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* - -WORKDIR /var/www/cakephp -RUN mkdir logs && mkdir tmp && chmod 777 logs && chmod 777 tmp -COPY ./community_server/ . -COPY ./configs/community_server/app.php ./config/ - -RUN composer update -RUN composer dump-autoload - -######### special for code coverage and testing -FROM community_server as test - - -RUN apt-get update \ - && apt-get -y --no-install-recommends install php7.4-xdebug \ - && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* - - -ENV XDEBUG_MODE=coverage -#RUN composer require --dev rregeer/phpunit-coverage-check - -#CMD ./vendor/bin/phpunit --coverage-clover=./webroot/coverage/clover.xml -CMD ./vendor/bin/phpunit --coverage-text=./webroot/coverage/coverage.info - diff --git a/community_server/README.md b/community_server/README.md deleted file mode 100644 index 61f89d306..000000000 --- a/community_server/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# CakePHP Application Skeleton - -[![Build Status](https://img.shields.io/travis/cakephp/app/master.svg?style=flat-square)](https://travis-ci.org/cakephp/app) -[![Total Downloads](https://img.shields.io/packagist/dt/cakephp/app.svg?style=flat-square)](https://packagist.org/packages/cakephp/app) - -A skeleton for creating applications with [CakePHP](https://cakephp.org) 3.x. - -The framework source code can be found here: [cakephp/cakephp](https://github.com/cakephp/cakephp). - -## Installation - -1. Download [Composer](https://getcomposer.org/doc/00-intro.md) or update `composer self-update`. -2. Run `php composer.phar create-project --prefer-dist cakephp/app [app_name]`. - -If Composer is installed globally, run - -```bash -composer create-project --prefer-dist cakephp/app -``` - -In case you want to use a custom app dir name (e.g. `/myapp/`): - -```bash -composer create-project --prefer-dist cakephp/app myapp -``` - -You can now either use your machine's webserver to view the default home page, or start -up the built-in webserver with: - -```bash -bin/cake server -p 8765 -``` - -Then visit `http://localhost:8765` to see the welcome page. - -## Update - -Since this skeleton is a starting point for your application and various files -would have been modified as per your needs, there isn't a way to provide -automated upgrades, so you have to do any updates manually. - -## Configuration - -Read and edit `config/app.php` and setup the `'Datasources'` and any other -configuration relevant for your application. - -## Layout - -The app skeleton uses a subset of [Foundation](http://foundation.zurb.com/) (v5) CSS -framework by default. You can, however, replace it with any other library or -custom styles. diff --git a/community_server/bin/cake b/community_server/bin/cake deleted file mode 100755 index 4b696c883..000000000 --- a/community_server/bin/cake +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env sh -################################################################################ -# -# Cake is a shell script for invoking CakePHP shell commands -# -# CakePHP(tm) : Rapid Development Framework (https://cakephp.org) -# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) -# -# Licensed under The MIT License -# For full copyright and license information, please see the LICENSE.txt -# Redistributions of files must retain the above copyright notice. -# -# @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) -# @link https://cakephp.org CakePHP(tm) Project -# @since 1.2.0 -# @license https://opensource.org/licenses/mit-license.php MIT License -# -################################################################################ - -# Canonicalize by following every symlink of the given name recursively -canonicalize() { - NAME="$1" - if [ -f "$NAME" ] - then - DIR=$(dirname -- "$NAME") - NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME") - fi - while [ -h "$NAME" ]; do - DIR=$(dirname -- "$NAME") - SYM=$(readlink "$NAME") - NAME=$(cd "$DIR" > /dev/null && cd "$(dirname -- "$SYM")" > /dev/null && pwd)/$(basename -- "$SYM") - done - echo "$NAME" -} - -# Find a CLI version of PHP -findCliPhp() { - for TESTEXEC in php php-cli /usr/local/bin/php - do - SAPI=$(echo "" | $TESTEXEC 2>/dev/null) - if [ "$SAPI" = "cli" ] - then - echo $TESTEXEC - return - fi - done - echo "Failed to find a CLI version of PHP; falling back to system standard php executable" >&2 - echo "php"; -} - -# If current path is a symlink, resolve to real path -realname="$0" -if [ -L "$realname" ] -then - realname=$(readlink -f "$0") -fi - -CONSOLE=$(dirname -- "$(canonicalize "$realname")") -APP=$(dirname "$CONSOLE") - -# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment -# variable with the correct path in it. -if [ -z "$PHP" ] -then - PHP=$(findCliPhp) -fi - -if [ "$(basename "$realname")" != 'cake' ] -then - exec "$PHP" "$CONSOLE"/cake.php "$(basename "$realname")" "$@" -else - exec "$PHP" "$CONSOLE"/cake.php "$@" -fi - -exit diff --git a/community_server/bin/cake.bat b/community_server/bin/cake.bat deleted file mode 100644 index ad1378229..000000000 --- a/community_server/bin/cake.bat +++ /dev/null @@ -1,27 +0,0 @@ -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: -:: Cake is a Windows batch script for invoking CakePHP shell commands -:: -:: CakePHP(tm) : Rapid Development Framework (https://cakephp.org) -:: Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) -:: -:: Licensed under The MIT License -:: Redistributions of files must retain the above copyright notice. -:: -:: @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) -:: @link https://cakephp.org CakePHP(tm) Project -:: @since 2.0.0 -:: @license https://opensource.org/licenses/mit-license.php MIT License -:: -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -@echo off - -SET app=%0 -SET lib=%~dp0 - -php "%lib%cake.php" %* - -echo. - -exit /B %ERRORLEVEL% diff --git a/community_server/bin/cake.php b/community_server/bin/cake.php deleted file mode 100644 index 320ee3643..000000000 --- a/community_server/bin/cake.php +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/php -q -run($argv)); diff --git a/community_server/composer.json b/community_server/composer.json deleted file mode 100644 index dbd031048..000000000 --- a/community_server/composer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "cakephp/app", - "description": "CakePHP skeleton app", - "homepage": "https://cakephp.org", - "type": "project", - "license": "MIT", - "require": { - "php": ">=5.6", - "cakephp/cakephp": "3.9.*", - "cakephp/plugin-installer": "^1.0", - "datto/json-rpc": "^6.0", - "google/protobuf": "v3.10.*", - "mobiledetect/mobiledetectlib": "2.*", - "paragonie/sodium_compat": "^1.11", - "tuupola/base58": "^2.0" - }, - "require-dev": { - "cakephp/bake": "^1.9.0", - "cakephp/cakephp-codesniffer": "^3.0", - "cakephp/debug_kit": "^3.17.0", - "josegonzalez/dotenv": "3.*", - "phpunit/phpunit": "^5.7|^6.0", - "psy/psysh": "@stable" - }, - "suggest": { - "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.", - "dereuromark/cakephp-ide-helper": "After baking your code, this keeps your annotations in sync with the code evolving from there on for maximum IDE and PHPStan compatibility." - }, - "autoload": { - "psr-4": { - "App\\": "src/", - "" : "src/", - "GPBMetadata\\Gradido\\": "src/Model/Messages/GPBMetadata/Gradido/", - "Proto\\Gradido\\" : "src/Model/Messages/Proto/Gradido/" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Test\\": "tests/", - "Cake\\Test\\": "vendor/cakephp/cakephp/tests/" - } - }, - "scripts": { - "post-install-cmd": "App\\Console\\Installer::postInstall", - "post-create-project-cmd": "App\\Console\\Installer::postInstall", - "check": [ - "@test", - "@cs-check" - ], - "cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/", - "cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/", - "test": "phpunit --colors=always" - }, - "prefer-stable": true, - "config": { - "sort-packages": true - } -} diff --git a/community_server/composer.lock b/community_server/composer.lock deleted file mode 100644 index 41674bb88..000000000 --- a/community_server/composer.lock +++ /dev/null @@ -1,5577 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "8a3d1923190a6c9d6066359057844457", - "packages": [ - { - "name": "aura/intl", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/auraphp/Aura.Intl.git", - "reference": "7fce228980b19bf4dee2d7bbd6202a69b0dde926" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/auraphp/Aura.Intl/zipball/7fce228980b19bf4dee2d7bbd6202a69b0dde926", - "reference": "7fce228980b19bf4dee2d7bbd6202a69b0dde926", - "shasum": "" - }, - "require": { - "php": "^5.6|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Aura\\Intl\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aura.Intl Contributors", - "homepage": "https://github.com/auraphp/Aura.Intl/contributors" - } - ], - "description": "The Aura Intl package provides internationalization tools, specifically message translation.", - "homepage": "https://github.com/auraphp/Aura.Intl", - "keywords": [ - "g11n", - "globalization", - "i18n", - "internationalization", - "intl", - "l10n", - "localization" - ], - "support": { - "issues": "https://github.com/auraphp/Aura.Intl/issues", - "source": "https://github.com/auraphp/Aura.Intl/tree/3.x" - }, - "time": "2017-01-20T05:00:11+00:00" - }, - { - "name": "cakephp/cakephp", - "version": "3.9.8", - "source": { - "type": "git", - "url": "https://github.com/cakephp/cakephp.git", - "reference": "b0e43e810132a8b1f66cf89b038b54c090811c32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp/zipball/b0e43e810132a8b1f66cf89b038b54c090811c32", - "reference": "b0e43e810132a8b1f66cf89b038b54c090811c32", - "shasum": "" - }, - "require": { - "aura/intl": "^3.0.0", - "cakephp/chronos": "^1.0.1", - "ext-intl": "*", - "ext-mbstring": "*", - "laminas/laminas-diactoros": "^1.4.0", - "paragonie/random_compat": "^1.4|^2.0|9.99.99", - "php": ">=5.6.0,<8.0.0", - "psr/log": "^1.0.0", - "psr/simple-cache": "^1.0.0" - }, - "conflict": { - "phpunit/phpunit": "<5.7" - }, - "replace": { - "cakephp/cache": "self.version", - "cakephp/collection": "self.version", - "cakephp/core": "self.version", - "cakephp/database": "self.version", - "cakephp/datasource": "self.version", - "cakephp/event": "self.version", - "cakephp/filesystem": "self.version", - "cakephp/form": "self.version", - "cakephp/i18n": "self.version", - "cakephp/log": "self.version", - "cakephp/orm": "self.version", - "cakephp/utility": "self.version", - "cakephp/validation": "self.version" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^3.0", - "cakephp/chronos": "^1.2.1", - "paragonie/csp-builder": "^1.4|^2.3", - "phpunit/phpunit": "^5.7.14|^6.0" - }, - "suggest": { - "ext-curl": "To enable more efficient network calls in Http\\Client.", - "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.", - "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()", - "paragonie/csp-builder": "CSP builder, to use the CSP Middleware" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cake\\": "src/" - }, - "files": [ - "src/Core/functions.php", - "src/Collection/functions.php", - "src/I18n/functions.php", - "src/Utility/bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/cakephp/graphs/contributors" - } - ], - "description": "The CakePHP framework", - "homepage": "https://cakephp.org", - "keywords": [ - "conventions over configuration", - "dry", - "form", - "framework", - "mvc", - "orm", - "psr-7", - "rapid-development", - "validation" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/cakephp" - }, - "time": "2021-03-10T02:10:31+00:00" - }, - { - "name": "cakephp/chronos", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/cakephp/chronos.git", - "reference": "ba2bab98849e7bf29b02dd634ada49ab36472959" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/ba2bab98849e7bf29b02dd634ada49ab36472959", - "reference": "ba2bab98849e7bf29b02dd634ada49ab36472959", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "athletic/athletic": "~0.1", - "cakephp/cakephp-codesniffer": "^3.0", - "phpbench/phpbench": "@dev", - "phpunit/phpunit": "<6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cake\\Chronos\\": "src/" - }, - "files": [ - "src/carbon_compat.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" - }, - { - "name": "The CakePHP Team", - "homepage": "http://cakephp.org" - } - ], - "description": "A simple API extension for DateTime.", - "homepage": "http://cakephp.org", - "keywords": [ - "date", - "datetime", - "time" - ], - "support": { - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/chronos/issues", - "source": "https://github.com/cakephp/chronos" - }, - "time": "2019-11-30T02:33:19+00:00" - }, - { - "name": "cakephp/migrations", - "version": "2.4.2", - "source": { - "type": "git", - "url": "https://github.com/cakephp/migrations.git", - "reference": "7fa4f1f8a4cd90df59cd8e3a46958c822abe457e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/migrations/zipball/7fa4f1f8a4cd90df59cd8e3a46958c822abe457e", - "reference": "7fa4f1f8a4cd90df59cd8e3a46958c822abe457e", - "shasum": "" - }, - "require": { - "cakephp/cache": "^3.6.0", - "cakephp/orm": "^3.6.0", - "php": ">=5.6.0", - "robmorgan/phinx": "^0.10.3|^0.11.1" - }, - "require-dev": { - "cakephp/bake": "^1.7.0", - "cakephp/cakephp": "^3.6.0", - "cakephp/cakephp-codesniffer": "^3.0", - "phpunit/phpunit": "^5.7.14|^6.0" - }, - "suggest": { - "cakephp/bake": "If you want to generate migrations." - }, - "type": "cakephp-plugin", - "autoload": { - "psr-4": { - "Migrations\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/migrations/graphs/contributors" - } - ], - "description": "Database Migration plugin for CakePHP based on Phinx", - "homepage": "https://github.com/cakephp/migrations", - "keywords": [ - "cakephp", - "migrations" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/migrations/issues", - "source": "https://github.com/cakephp/migrations" - }, - "time": "2020-02-05T15:00:43+00:00" - }, - { - "name": "cakephp/plugin-installer", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/cakephp/plugin-installer.git", - "reference": "e27027aa2d3d8ab64452c6817629558685a064cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/plugin-installer/zipball/e27027aa2d3d8ab64452c6817629558685a064cb", - "reference": "e27027aa2d3d8ab64452c6817629558685a064cb", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.6.0" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^3.3", - "composer/composer": "^2.0", - "phpunit/phpunit": "^5.7 || ^6.5 || ^8.5 || ^9.3" - }, - "type": "composer-plugin", - "extra": { - "class": "Cake\\Composer\\Plugin" - }, - "autoload": { - "psr-4": { - "Cake\\Composer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://cakephp.org" - } - ], - "description": "A composer installer for CakePHP 3.0+ plugins.", - "support": { - "issues": "https://github.com/cakephp/plugin-installer/issues", - "source": "https://github.com/cakephp/plugin-installer/tree/1.3.1" - }, - "time": "2020-10-29T04:00:42+00:00" - }, - { - "name": "datto/json-rpc", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/datto/php-json-rpc.git", - "reference": "ad4d735f48d80c6b53f7405e5007d97c996533f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/datto/php-json-rpc/zipball/ad4d735f48d80c6b53f7405e5007d97c996533f6", - "reference": "ad4d735f48d80c6b53f7405e5007d97c996533f6", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Datto\\JsonRpc\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0+" - ], - "authors": [ - { - "name": "Spencer Mortensen", - "email": "smortensen@datto.com", - "homepage": "http://spencermortensen.com", - "role": "Developer" - } - ], - "description": "Fully unit-tested JSON-RPC 2.0 for PHP", - "homepage": "http://datto.com", - "keywords": [ - "json", - "json-rpc", - "jsonrpc", - "php", - "php-json-rpc", - "rpc" - ], - "support": { - "issues": "https://github.com/datto/php-json-rpc/issues", - "source": "https://github.com/datto/php-json-rpc/tree/6.1.0" - }, - "time": "2020-02-28T23:54:06+00:00" - }, - { - "name": "google/protobuf", - "version": "v3.10.0", - "source": { - "type": "git", - "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "5dffdd2c84112e6c91fd84f92e3df96649426881" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/5dffdd2c84112e6c91fd84f92e3df96649426881", - "reference": "5dffdd2c84112e6c91fd84f92e3df96649426881", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8.0" - }, - "suggest": { - "ext-bcmath": "Need to support JSON deserialization" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Protobuf\\": "src/Google/Protobuf", - "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "proto library for PHP", - "homepage": "https://developers.google.com/protocol-buffers/", - "keywords": [ - "proto" - ], - "support": { - "issues": "https://github.com/protocolbuffers/protobuf-php/issues", - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.10.0" - }, - "time": "2019-10-03T20:08:37+00:00" - }, - { - "name": "laminas/laminas-diactoros", - "version": "1.8.7p2", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "6991c1af7c8d2c8efee81b22ba97024781824aaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/6991c1af7c8d2c8efee81b22ba97024781824aaa", - "reference": "6991c1af7c8d2c8efee81b22ba97024781824aaa", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0", - "psr/http-message": "^1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "replace": { - "zendframework/zend-diactoros": "~1.8.7.0" - }, - "require-dev": { - "ext-dom": "*", - "ext-libxml": "*", - "laminas/laminas-coding-standard": "~1.0", - "php-http/psr7-integration-tests": "dev-master", - "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-release-1.8": "1.8.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions/create_uploaded_file.php", - "src/functions/marshal_headers_from_sapi.php", - "src/functions/marshal_method_from_sapi.php", - "src/functions/marshal_protocol_version_from_sapi.php", - "src/functions/marshal_uri_from_sapi.php", - "src/functions/normalize_server.php", - "src/functions/normalize_uploaded_files.php", - "src/functions/parse_cookie_header.php", - "src/functions/create_uploaded_file.legacy.php", - "src/functions/marshal_headers_from_sapi.legacy.php", - "src/functions/marshal_method_from_sapi.legacy.php", - "src/functions/marshal_protocol_version_from_sapi.legacy.php", - "src/functions/marshal_uri_from_sapi.legacy.php", - "src/functions/normalize_server.legacy.php", - "src/functions/normalize_uploaded_files.legacy.php", - "src/functions/parse_cookie_header.legacy.php" - ], - "psr-4": { - "Laminas\\Diactoros\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "PSR HTTP Message implementations", - "homepage": "https://laminas.dev", - "keywords": [ - "http", - "laminas", - "psr", - "psr-7" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-diactoros/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-diactoros/issues", - "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", - "source": "https://github.com/laminas/laminas-diactoros" - }, - "time": "2020-03-23T15:28:28+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-09-14T14:23:00+00:00" - }, - { - "name": "mobiledetect/mobiledetectlib", - "version": "2.8.37", - "source": { - "type": "git", - "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "9841e3c46f5bd0739b53aed8ac677fa712943df7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/9841e3c46f5bd0739b53aed8ac677fa712943df7", - "reference": "9841e3c46f5bd0739b53aed8ac677fa712943df7", - "shasum": "" - }, - "require": { - "php": ">=5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35||~5.7" - }, - "type": "library", - "autoload": { - "classmap": [ - "Mobile_Detect.php" - ], - "psr-0": { - "Detection": "namespaced/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Serban Ghita", - "email": "serbanghita@gmail.com", - "homepage": "http://mobiledetect.net", - "role": "Developer" - } - ], - "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", - "homepage": "https://github.com/serbanghita/Mobile-Detect", - "keywords": [ - "detect mobile devices", - "mobile", - "mobile detect", - "mobile detector", - "php mobile detect" - ], - "support": { - "issues": "https://github.com/serbanghita/Mobile-Detect/issues", - "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.37" - }, - "funding": [ - { - "url": "https://github.com/serbanghita", - "type": "github" - } - ], - "time": "2021-02-19T21:22:57+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2018-07-02T15:55:56+00:00" - }, - { - "name": "paragonie/sodium_compat", - "version": "v1.14.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "a1cfe0b21faf9c0b61ac0c6188c4af7fd6fd0db3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a1cfe0b21faf9c0b61ac0c6188c4af7fd6fd0db3", - "reference": "a1cfe0b21faf9c0b61ac0c6188c4af7fd6fd0db3", - "shasum": "" - }, - "require": { - "paragonie/random_compat": ">=1", - "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8" - }, - "require-dev": { - "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" - }, - "suggest": { - "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", - "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." - }, - "type": "library", - "autoload": { - "files": [ - "autoload.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com" - }, - { - "name": "Frank Denis", - "email": "jedisct1@pureftpd.org" - } - ], - "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", - "keywords": [ - "Authentication", - "BLAKE2b", - "ChaCha20", - "ChaCha20-Poly1305", - "Chapoly", - "Curve25519", - "Ed25519", - "EdDSA", - "Edwards-curve Digital Signature Algorithm", - "Elliptic Curve Diffie-Hellman", - "Poly1305", - "Pure-PHP cryptography", - "RFC 7748", - "RFC 8032", - "Salpoly", - "Salsa20", - "X25519", - "XChaCha20-Poly1305", - "XSalsa20-Poly1305", - "Xchacha20", - "Xsalsa20", - "aead", - "cryptography", - "ecdh", - "elliptic curve", - "elliptic curve cryptography", - "encryption", - "libsodium", - "php", - "public-key cryptography", - "secret-key cryptography", - "side-channel resistant" - ], - "support": { - "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v1.14.0" - }, - "time": "2020-12-03T16:26:19+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" - }, - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" - }, - "time": "2017-10-23T01:57:42+00:00" - }, - { - "name": "robmorgan/phinx", - "version": "0.11.7", - "source": { - "type": "git", - "url": "https://github.com/cakephp/phinx.git", - "reference": "3cdde73e0c33c410e076108b3e1603fabb5b330d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/phinx/zipball/3cdde73e0c33c410e076108b3e1603fabb5b330d", - "reference": "3cdde73e0c33c410e076108b3e1603fabb5b330d", - "shasum": "" - }, - "require": { - "cakephp/collection": "^3.7", - "cakephp/database": "^3.7", - "php": ">=5.6", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^3.0", - "ext-json": "*", - "phpunit/phpunit": ">=5.7,<8.0", - "sebastian/comparator": ">=1.2.3" - }, - "suggest": { - "ext-json": "Install if using JSON configuration format", - "symfony/yaml": "Install if using YAML configuration format" - }, - "bin": [ - "bin/phinx" - ], - "type": "library", - "autoload": { - "psr-4": { - "Phinx\\": "src/Phinx/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Morgan", - "email": "robbym@gmail.com", - "homepage": "https://robmorgan.id.au", - "role": "Lead Developer" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com", - "homepage": "https://shadowhand.me", - "role": "Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Developer" - }, - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/phinx/graphs/contributors", - "role": "Developer" - } - ], - "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.", - "homepage": "https://phinx.org", - "keywords": [ - "database", - "database migrations", - "db", - "migrations", - "phinx" - ], - "support": { - "issues": "https://github.com/cakephp/phinx/issues", - "source": "https://github.com/cakephp/phinx/tree/0.11.7" - }, - "time": "2020-05-09T13:59:05+00:00" - }, - { - "name": "symfony/config", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/212d54675bf203ff8aef7d8cee8eecfb72f4a263", - "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-23T23:58:19+00:00" - }, - { - "name": "symfony/console", - "version": "v5.2.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/35f039df40a3b335ebf310f244cb242b3a83ac8d", - "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.2.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-28T09:42:18+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.2.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c86a82f51658188119e62cff0a050a12d09836f", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-28T14:30:26+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-07T16:49:33+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/string", - "version": "v5.2.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572", - "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.2.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-17T17:12:15+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.2.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "298a08ddda623485208506fcee08817807a251dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", - "reference": "298a08ddda623485208506fcee08817807a251dd", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.2.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-06T07:59:01+00:00" - }, - { - "name": "tuupola/base58", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/tuupola/base58.git", - "reference": "4cd1a3972679946e87c0746f59ff8f0760240b4c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tuupola/base58/zipball/4cd1a3972679946e87c0746f59ff8f0760240b4c", - "reference": "4cd1a3972679946e87c0746f59ff8f0760240b4c", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "require-dev": { - "overtrue/phplint": "^1.0.0", - "phpbench/phpbench": "^0.13.0", - "phpstan/phpstan": "^0.12.37", - "phpunit/phpunit": "^7.0|^8.0|^9.0", - "squizlabs/php_codesniffer": "^3.0" - }, - "suggest": { - "ext-gmp": "GMP extension provides the fastest encoding and decoding." - }, - "type": "library", - "autoload": { - "psr-4": { - "Tuupola\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mika Tuupola", - "email": "tuupola@appelsiini.net", - "homepage": "https://appelsiini.net/", - "role": "Developer" - } - ], - "description": "Base58 encoder and decoder for arbitrary data", - "homepage": "https://github.com/tuupola/base58", - "keywords": [ - "base58" - ], - "support": { - "issues": "https://github.com/tuupola/base58/issues", - "source": "https://github.com/tuupola/base58/tree/2.1.0" - }, - "funding": [ - { - "url": "https://github.com/tuupola", - "type": "github" - } - ], - "time": "2020-09-09T11:38:20+00:00" - } - ], - "packages-dev": [ - { - "name": "ajgl/breakpoint-twig-extension", - "version": "0.3.5", - "source": { - "type": "git", - "url": "https://github.com/ajgarlag/AjglBreakpointTwigExtension.git", - "reference": "9875feea0ac4bc3c9f308c62bae4727669d6052a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ajgarlag/AjglBreakpointTwigExtension/zipball/9875feea0ac4bc3c9f308c62bae4727669d6052a", - "reference": "9875feea0ac4bc3c9f308c62bae4727669d6052a", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "twig/twig": "^1.34|^2.0|^3.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.18", - "symfony/framework-bundle": "^2.7|^3.4|^4.4|^5.2", - "symfony/phpunit-bridge": "^4.4|^5.2", - "symfony/twig-bundle": "^2.7|^3.4|^4.4|^5.2" - }, - "suggest": { - "ext-xdebug": "The Xdebug extension is required for the breakpoint to work", - "symfony/framework-bundle": "The framework bundle to integrate the extension into Symfony", - "symfony/twig-bundle": "The twig bundle to integrate the extension into Symfony" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Ajgl\\Twig\\Extension\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Antonio J. García Lagar", - "email": "aj@garcialagar.es", - "homepage": "http://aj.garcialagar.es", - "role": "developer" - } - ], - "description": "Twig extension to set breakpoints", - "homepage": "https://github.com/ajgarlag/AjglBreakpointTwigExtension", - "keywords": [ - "Xdebug", - "breakpoint", - "twig" - ], - "support": { - "issues": "https://github.com/ajgarlag/AjglBreakpointTwigExtension/issues", - "source": "https://github.com/ajgarlag/AjglBreakpointTwigExtension/tree/0.3.5" - }, - "time": "2021-02-08T10:48:05+00:00" - }, - { - "name": "aptoma/twig-markdown", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/aptoma/twig-markdown.git", - "reference": "64a9c5c7418c08faf91c4410b34bdb65fb25c23d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aptoma/twig-markdown/zipball/64a9c5c7418c08faf91c4410b34bdb65fb25c23d", - "reference": "64a9c5c7418c08faf91c4410b34bdb65fb25c23d", - "shasum": "" - }, - "require": { - "twig/twig": "~1.12" - }, - "require-dev": { - "codeclimate/php-test-reporter": "dev-master", - "erusev/parsedown": "^1.6", - "knplabs/github-api": "~1.2", - "league/commonmark": "~0.5", - "michelf/php-markdown": "~1", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "~0.6" - }, - "suggest": { - "knplabs/github-api": "Needed for using GitHub's Markdown engine provided through their API.", - "michelf/php-markdown": "Original Markdown engine with MarkdownExtra." - }, - "type": "library", - "autoload": { - "psr-0": { - "Aptoma": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joris Berthelot", - "email": "joris@berthelot.tel" - }, - { - "name": "Gunnar Lium", - "email": "gunnar@aptoma.com" - } - ], - "description": "Twig extension to work with Markdown content", - "keywords": [ - "markdown", - "twig" - ], - "support": { - "issues": "https://github.com/aptoma/twig-markdown/issues", - "source": "https://github.com/aptoma/twig-markdown/tree/master" - }, - "time": "2015-10-23T20:27:08+00:00" - }, - { - "name": "asm89/twig-cache-extension", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/asm89/twig-cache-extension.git", - "reference": "13787226956ec766f4770722082288097aebaaf3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/asm89/twig-cache-extension/zipball/13787226956ec766f4770722082288097aebaaf3", - "reference": "13787226956ec766f4770722082288097aebaaf3", - "shasum": "" - }, - "require": { - "php": ">=5.3.2", - "twig/twig": "^1.0|^2.0" - }, - "require-dev": { - "doctrine/cache": "~1.0", - "phpunit/phpunit": "^5.0 || ^4.8.10" - }, - "suggest": { - "psr/cache-implementation": "To make use of PSR-6 cache implementation via PsrCacheAdapter." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexander", - "email": "iam.asm89@gmail.com" - } - ], - "description": "Cache fragments of templates directly within Twig.", - "homepage": "https://github.com/asm89/twig-cache-extension", - "keywords": [ - "cache", - "extension", - "twig" - ], - "support": { - "issues": "https://github.com/asm89/twig-cache-extension/issues", - "source": "https://github.com/asm89/twig-cache-extension/tree/1.4.0" - }, - "abandoned": "twig/cache-extension", - "time": "2020-01-01T20:47:37+00:00" - }, - { - "name": "cakephp/bake", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/cakephp/bake.git", - "reference": "33e8ee8419ba36c13fa4074c208c93352b5530cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/bake/zipball/33e8ee8419ba36c13fa4074c208c93352b5530cf", - "reference": "33e8ee8419ba36c13fa4074c208c93352b5530cf", - "shasum": "" - }, - "require": { - "cakephp/cakephp": "^3.8.0", - "cakephp/plugin-installer": "^1.0", - "php": ">=5.6.0", - "wyrihaximus/twig-view": "^4.3.7" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^3.0", - "phpunit/phpunit": "^5.7.14|^6.0" - }, - "type": "cakephp-plugin", - "autoload": { - "psr-4": { - "Bake\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/bake/graphs/contributors" - } - ], - "description": "Bake plugin for CakePHP 3", - "homepage": "https://github.com/cakephp/bake", - "keywords": [ - "bake", - "cakephp" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/bake/issues", - "source": "https://github.com/cakephp/bake" - }, - "time": "2019-12-07T20:34:43+00:00" - }, - { - "name": "cakephp/cakephp-codesniffer", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/cakephp/cakephp-codesniffer.git", - "reference": "7998a191e787fd5b68cb635d7050cb0d7b55e1a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/7998a191e787fd5b68cb635d7050cb0d7b55e1a1", - "reference": "7998a191e787fd5b68cb635d7050cb0d7b55e1a1", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "squizlabs/php_codesniffer": "^3.0.0" - }, - "require-dev": { - "phpunit/phpunit": "<6.0" - }, - "type": "phpcodesniffer-standard", - "autoload": { - "psr-4": { - "CakePHP\\": "CakePHP/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/cakephp-codesniffer/graphs/contributors" - } - ], - "description": "CakePHP CodeSniffer Standards", - "homepage": "https://cakephp.org", - "keywords": [ - "codesniffer", - "framework" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp-codesniffer/issues", - "source": "https://github.com/cakephp/cakephp-codesniffer" - }, - "time": "2019-12-07T03:02:34+00:00" - }, - { - "name": "cakephp/debug_kit", - "version": "3.22.4", - "source": { - "type": "git", - "url": "https://github.com/cakephp/debug_kit.git", - "reference": "5bec3c49a2b8d9bd12655f2ec35e52ec90befe17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/5bec3c49a2b8d9bd12655f2ec35e52ec90befe17", - "reference": "5bec3c49a2b8d9bd12655f2ec35e52ec90befe17", - "shasum": "" - }, - "require": { - "cakephp/cakephp": "^3.7.0", - "cakephp/chronos": "^1.0.0", - "cakephp/plugin-installer": "^1.0.0", - "composer/composer": "^1.3.0", - "jdorn/sql-formatter": "^1.2.0", - "php": ">=5.6.0" - }, - "require-dev": { - "cakephp/authorization": "^1.3.2", - "cakephp/cakephp-codesniffer": "^3.0", - "phpunit/phpunit": "^5.7.14|^6.0" - }, - "suggest": { - "ext-pdo_sqlite": "DebugKit needs to store panel data in a database. SQLite is simple and easy to use." - }, - "type": "cakephp-plugin", - "autoload": { - "psr-4": { - "DebugKit\\": "src/", - "DebugKit\\Test\\Fixture\\": "tests/Fixture/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Story", - "homepage": "https://mark-story.com", - "role": "Author" - }, - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/debug_kit/graphs/contributors" - } - ], - "description": "CakePHP Debug Kit", - "homepage": "https://github.com/cakephp/debug_kit", - "keywords": [ - "cakephp", - "debug", - "kit" - ], - "support": { - "forum": "http://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/debug_kit/issues", - "source": "https://github.com/cakephp/debug_kit" - }, - "time": "2020-04-22T17:27:39+00:00" - }, - { - "name": "composer/ca-bundle", - "version": "1.2.9", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.2.9" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-01-12T12:10:35+00:00" - }, - { - "name": "composer/composer", - "version": "1.10.21", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "04021432f4a9cbd9351dd166b8c193f42c36a39c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/04021432f4a9cbd9351dd166b8c193f42c36a39c", - "reference": "04021432f4a9cbd9351dd166b8c193f42c36a39c", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/1.10.21" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-04-01T07:16:35+00:00" - }, - { - "name": "composer/semver", - "version": "1.7.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/1.7.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-03T15:47:16+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.5", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-03T16:04:16+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.6", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/1.4.6" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-03-25T17:01:18+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-11-10T18:47:58+00:00" - }, - { - "name": "jasny/twig-extensions", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/jasny/twig-extensions.git", - "reference": "30bdf3a3903c021544f36332c9d5d4d563527da4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jasny/twig-extensions/zipball/30bdf3a3903c021544f36332c9d5d4d563527da4", - "reference": "30bdf3a3903c021544f36332c9d5d4d563527da4", - "shasum": "" - }, - "require": { - "php": ">=7.0.0 | >=5.6.0", - "twig/twig": "^2.0 | ^1.12" - }, - "require-dev": { - "ext-intl": "*", - "ext-pcre": "*", - "jasny/php-code-quality": "^2.1", - "phpunit/phpunit": "^5.0" - }, - "suggest": { - "ext-intl": "Required for the use of the LocalDate Twig extension", - "ext-pcre": "Required for the use of the PCRE Twig extension" - }, - "type": "library", - "autoload": { - "psr-4": { - "Jasny\\Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arnold Daniels", - "email": "arnold@jasny.net", - "homepage": "http://www.jasny.net" - } - ], - "description": "A set of useful Twig filters", - "homepage": "http://github.com/jasny/twig-extensions#README", - "keywords": [ - "PCRE", - "array", - "date", - "datetime", - "preg", - "regex", - "templating", - "text", - "time" - ], - "support": { - "issues": "https://github.com/jasny/twig-extensions/issues", - "source": "https://github.com/jasny/twig-extensions" - }, - "time": "2017-09-13T07:38:01+00:00" - }, - { - "name": "jdorn/sql-formatter", - "version": "v1.2.17", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "support": { - "issues": "https://github.com/jdorn/sql-formatter/issues", - "source": "https://github.com/jdorn/sql-formatter/tree/master" - }, - "time": "2014-01-12T16:20:24+00:00" - }, - { - "name": "josegonzalez/dotenv", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/josegonzalez/php-dotenv.git", - "reference": "f19174d9d7213a6c20e8e5e268aa7dd042d821ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/josegonzalez/php-dotenv/zipball/f19174d9d7213a6c20e8e5e268aa7dd042d821ca", - "reference": "f19174d9d7213a6c20e8e5e268aa7dd042d821ca", - "shasum": "" - }, - "require": { - "m1/env": "2.*", - "php": ">=5.5.0" - }, - "require-dev": { - "php-mock/php-mock-phpunit": "^1.1", - "satooshi/php-coveralls": "1.*", - "squizlabs/php_codesniffer": "2.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "josegonzalez\\Dotenv": [ - "src", - "tests" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jose Diaz-Gonzalez", - "email": "dotenv@josegonzalez.com", - "homepage": "http://josediazgonzalez.com", - "role": "Maintainer" - } - ], - "description": "dotenv file parsing for PHP", - "homepage": "https://github.com/josegonzalez/php-dotenv", - "keywords": [ - "configuration", - "dotenv", - "php" - ], - "support": { - "issues": "https://github.com/josegonzalez/php-dotenv/issues", - "source": "https://github.com/josegonzalez/php-dotenv/tree/master" - }, - "time": "2017-09-19T15:49:58+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.10", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" - }, - "time": "2020-05-27T16:41:55+00:00" - }, - { - "name": "m1/env", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/m1/Env.git", - "reference": "5c296e3e13450a207e12b343f3af1d7ab569f6f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/m1/Env/zipball/5c296e3e13450a207e12b343f3af1d7ab569f6f3", - "reference": "5c296e3e13450a207e12b343f3af1d7ab569f6f3", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "4.*", - "scrutinizer/ocular": "~1.1", - "squizlabs/php_codesniffer": "^2.3" - }, - "suggest": { - "josegonzalez/dotenv": "For loading of .env", - "m1/vars": "For loading of configs" - }, - "type": "library", - "autoload": { - "psr-4": { - "M1\\Env\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Miles Croxford", - "email": "hello@milescroxford.com", - "homepage": "http://milescroxford.com", - "role": "Developer" - } - ], - "description": "Env is a lightweight library bringing .env file parser compatibility to PHP. In short - it enables you to read .env files with PHP.", - "homepage": "https://github.com/m1/Env", - "keywords": [ - ".env", - "config", - "dotenv", - "env", - "loader", - "m1", - "parser", - "support" - ], - "support": { - "issues": "https://github.com/m1/Env/issues", - "source": "https://github.com/m1/Env/tree/2.2.0" - }, - "time": "2020-02-19T09:02:13+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-11-13T09:40:50+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.10.4", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" - }, - "time": "2020-12-20T10:01:03+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^1.0.1", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" - }, - "time": "2017-03-05T18:14:27+00:00" - }, - { - "name": "phar-io/version", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/master" - }, - "time": "2017-03-05T17:38:23+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, - "time": "2020-09-03T19:13:55+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" - }, - "time": "2020-09-17T18:55:26+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.10.3", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" - }, - "time": "2020-03-05T15:02:03+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "5.3.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.0", - "phpunit/php-file-iterator": "^1.4.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-xdebug": "^2.5.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/5.3" - }, - "time": "2018-04-06T15:36:58+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" - }, - "time": "2017-11-27T13:52:08+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" - }, - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" - }, - "time": "2017-02-26T11:10:40+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" - }, - "abandoned": true, - "time": "2017-11-27T05:48:46+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "6.5.14", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7", - "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.0", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", - "phpunit/php-file-iterator": "^1.4.3", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.9", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", - "sebastian/environment": "^3.1", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/6.5.14" - }, - "time": "2019-02-01T05:22:47+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "5.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f", - "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.0", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" - }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5.11" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", - "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/5.0.10" - }, - "abandoned": true, - "time": "2018-08-09T05:50:03+00:00" - }, - { - "name": "psy/psysh", - "version": "v0.10.7", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "a395af46999a12006213c0c8346c9445eb31640c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a395af46999a12006213c0c8346c9445eb31640c", - "reference": "a395af46999a12006213c0c8346c9445eb31640c", - "shasum": "" - }, - "require": { - "dnoegel/php-xdg-base-dir": "0.1.*", - "ext-json": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", - "php": "^8.0 || ^7.0 || ^5.5.9", - "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", - "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.*" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." - }, - "bin": [ - "bin/psysh" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.10.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", - "keywords": [ - "REPL", - "console", - "interactive", - "shell" - ], - "support": { - "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.10.7" - }, - "time": "2021-03-14T02:14:56+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T08:15:22+00:00" - }, - { - "name": "sebastian/comparator", - "version": "2.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/master" - }, - "time": "2018-02-01T13:46:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" - }, - "time": "2017-08-03T08:09:46+00:00" - }, - { - "name": "sebastian/environment", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/master" - }, - "time": "2017-07-01T08:51:00+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:47:53+00:00" - }, - { - "name": "sebastian/global-state", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" - }, - "time": "2017-04-27T15:39:26+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:40:27+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:37:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:34:24+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" - }, - "time": "2015-07-28T20:34:47+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" - }, - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.8.3", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2020-11-11T09:19:24+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/master" - }, - "time": "2020-07-07T18:42:57+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.6.0", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2021-04-09T00:54:41+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "0d639a0943822626290d169965804f79400e6a04" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", - "reference": "0d639a0943822626290d169965804f79400e6a04", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-15T18:55:04+00:00" - }, - { - "name": "symfony/process", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T10:15:41+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v5.2.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "89412a68ea2e675b4e44f260a5666729f77f668e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89412a68ea2e675b4e44f260a5666729f77f668e", - "reference": "89412a68ea2e675b4e44f260a5666729f77f668e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-28T09:42:18+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "twig/twig", - "version": "v1.44.2", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "138c493c5b8ee7cff3821f80b8896d371366b5fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/138c493c5b8ee7cff3821f80b8896d371366b5fe", - "reference": "138c493c5b8ee7cff3821f80b8896d371366b5fe", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.44-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - }, - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v1.44.2" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2021-01-05T10:10:05+00:00" - }, - { - "name": "umpirsky/twig-php-function", - "version": "v0.1", - "source": { - "type": "git", - "url": "https://github.com/umpirsky/twig-php-function.git", - "reference": "53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/umpirsky/twig-php-function/zipball/53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc", - "reference": "53b4b1eb0c5eacbd7d66c504b7d809c79b4bedbc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "twig/twig": "~1.12" - }, - "require-dev": { - "phpspec/phpspec": "~2.0", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "autoload": { - "psr-0": { - "Umpirsky\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Saša Stamenković", - "email": "umpirsky@gmail.com" - } - ], - "description": "Call (almost) any PHP function from your Twig templates.", - "support": { - "issues": "https://github.com/umpirsky/twig-php-function/issues", - "source": "https://github.com/umpirsky/twig-php-function/tree/master" - }, - "time": "2016-03-12T16:36:32+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - }, - { - "name": "wyrihaximus/twig-view", - "version": "4.4.0", - "source": { - "type": "git", - "url": "https://github.com/cakephp/legacy-twig-view.git", - "reference": "463e1a6ed493d4fe99eaeaaf39d80172b51fc0fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/legacy-twig-view/zipball/463e1a6ed493d4fe99eaeaaf39d80172b51fc0fb", - "reference": "463e1a6ed493d4fe99eaeaaf39d80172b51fc0fb", - "shasum": "" - }, - "require": { - "ajgl/breakpoint-twig-extension": "^0.3.0", - "aptoma/twig-markdown": "^2.0", - "asm89/twig-cache-extension": "^1.0", - "cakephp/cakephp": "^3.7", - "jasny/twig-extensions": "^1.0", - "php": "^5.6 || ^7.0", - "twig/twig": "^1.27", - "umpirsky/twig-php-function": "0.1" - }, - "require-dev": { - "cakephp/bake": "^1.5", - "cakephp/debug_kit": "^3.0", - "phake/phake": "^2.3.2", - "phpunit/phpunit": "^5.7.14", - "squizlabs/php_codesniffer": "^3.4.0", - "wyrihaximus/phpunit-class-reflection-helpers": "dev-master" - }, - "type": "cakephp-plugin", - "autoload": { - "psr-4": { - "WyriHaximus\\TwigView\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com", - "homepage": "http://wyrihaximus.net/" - } - ], - "description": "Twig powered View for CakePHP3", - "keywords": [ - "cakephp", - "cakephp3", - "twig", - "view" - ], - "support": { - "issues": "https://github.com/cakephp/legacy-twig-view/issues", - "source": "https://github.com/cakephp/legacy-twig-view/tree/4.4.0" - }, - "time": "2021-04-06T15:42:50+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "psy/psysh": 0 - }, - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": ">=5.6" - }, - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/community_server/config/app.default.php b/community_server/config/app.default.php deleted file mode 100644 index 04c8cede2..000000000 --- a/community_server/config/app.default.php +++ /dev/null @@ -1,407 +0,0 @@ - filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN), - - /** - * Configure basic information about the application. - * - * - namespace - The namespace to find app classes under. - * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time. - * - encoding - The encoding used for HTML + database connections. - * - base - The base directory the app resides in. If false this - * will be auto detected. - * - dir - Name of app directory. - * - webroot - The webroot directory. - * - wwwRoot - The file path to webroot. - * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to - * use CakePHP pretty URLs, remove these .htaccess - * files: - * /.htaccess - * /webroot/.htaccess - * And uncomment the baseUrl key below. - * - fullBaseUrl - A base URL to use for absolute links. When set to false (default) - * CakePHP generates required value based on `HTTP_HOST` environment variable. - * However, you can define it manually to optimize performance or if you - * are concerned about people manipulating the `Host` header. - * - imageBaseUrl - Web path to the public images directory under webroot. - * - cssBaseUrl - Web path to the public css directory under webroot. - * - jsBaseUrl - Web path to the public js directory under webroot. - * - paths - Configure paths for non class based resources. Supports the - * `plugins`, `templates`, `locales` subkeys, which allow the definition of - * paths for plugins, view templates and locale files respectively. - */ - 'App' => [ - 'namespace' => 'App', - 'encoding' => env('APP_ENCODING', 'UTF-8'), - 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'), - 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'), - 'base' => false, - 'dir' => 'src', - 'webroot' => 'webroot', - 'wwwRoot' => WWW_ROOT, - //'baseUrl' => env('SCRIPT_NAME'), - 'fullBaseUrl' => false, - 'imageBaseUrl' => 'img/', - 'cssBaseUrl' => 'css/', - 'jsBaseUrl' => 'js/', - 'paths' => [ - 'plugins' => [ROOT . DS . 'plugins' . DS], - 'templates' => [APP . 'Template' . DS], - 'locales' => [APP . 'Locale' . DS], - ], - ], - - /** - * Security and encryption configuration - * - * - salt - A random string used in security hashing methods. - * The salt value is also used as the encryption key. - * You should treat it as extremely sensitive data. - */ - 'Security' => [ - 'salt' => env('SECURITY_SALT', '__SALT__'), - ], - - /** - * Apply timestamps with the last modified time to static assets (js, css, images). - * Will append a querystring parameter containing the time the file was modified. - * This is useful for busting browser caches. - * - * Set to true to apply timestamps when debug is true. Set to 'force' to always - * enable timestamping regardless of debug value. - */ - 'Asset' => [ - //'timestamp' => true, - // 'cacheTime' => '+1 year' - ], - - /** - * Configure the cache adapters. - */ - 'Cache' => [ - 'default' => [ - 'className' => FileEngine::class, - 'path' => CACHE, - 'url' => env('CACHE_DEFAULT_URL', null), - ], - - /** - * Configure the cache used for general framework caching. - * Translation cache files are stored with this configuration. - * Duration will be set to '+2 minutes' in bootstrap.php when debug = true - * If you set 'className' => 'Null' core cache will be disabled. - */ - '_cake_core_' => [ - 'className' => FileEngine::class, - 'prefix' => 'myapp_cake_core_', - 'path' => CACHE . 'persistent/', - 'serialize' => true, - 'duration' => '+1 years', - 'url' => env('CACHE_CAKECORE_URL', null), - ], - - /** - * Configure the cache for model and datasource caches. This cache - * configuration is used to store schema descriptions, and table listings - * in connections. - * Duration will be set to '+2 minutes' in bootstrap.php when debug = true - */ - '_cake_model_' => [ - 'className' => FileEngine::class, - 'prefix' => 'myapp_cake_model_', - 'path' => CACHE . 'models/', - 'serialize' => true, - 'duration' => '+1 years', - 'url' => env('CACHE_CAKEMODEL_URL', null), - ], - - /** - * Configure the cache for routes. The cached routes collection is built the - * first time the routes are processed via `config/routes.php`. - * Duration will be set to '+2 seconds' in bootstrap.php when debug = true - */ - '_cake_routes_' => [ - 'className' => FileEngine::class, - 'prefix' => 'myapp_cake_routes_', - 'path' => CACHE, - 'serialize' => true, - 'duration' => '+1 years', - 'url' => env('CACHE_CAKEROUTES_URL', null), - ], - ], - - /** - * Configure the Error and Exception handlers used by your application. - * - * By default errors are displayed using Debugger, when debug is true and logged - * by Cake\Log\Log when debug is false. - * - * In CLI environments exceptions will be printed to stderr with a backtrace. - * In web environments an HTML page will be displayed for the exception. - * With debug true, framework errors like Missing Controller will be displayed. - * When debug is false, framework errors will be coerced into generic HTTP errors. - * - * Options: - * - * - `errorLevel` - int - The level of errors you are interested in capturing. - * - `trace` - boolean - Whether or not backtraces should be included in - * logged errors/exceptions. - * - `log` - boolean - Whether or not you want exceptions logged. - * - `exceptionRenderer` - string - The class responsible for rendering - * uncaught exceptions. If you choose a custom class you should place - * the file for that class in src/Error. This class needs to implement a - * render method. - * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that - * extend one of the listed exceptions will also be skipped for logging. - * E.g.: - * `'skipLog' => ['Cake\Http\Exception\NotFoundException', 'Cake\Http\Exception\UnauthorizedException']` - * - `extraFatalErrorMemory` - int - The number of megabytes to increase - * the memory limit by when a fatal error is encountered. This allows - * breathing room to complete logging or error handling. - */ - 'Error' => [ - 'errorLevel' => E_ALL, - 'exceptionRenderer' => ExceptionRenderer::class, - 'skipLog' => [], - 'log' => true, - 'trace' => true, - ], - - /** - * Email configuration. - * - * By defining transports separately from delivery profiles you can easily - * re-use transport configuration across multiple profiles. - * - * You can specify multiple configurations for production, development and - * testing. - * - * Each transport needs a `className`. Valid options are as follows: - * - * Mail - Send using PHP mail function - * Smtp - Send using SMTP - * Debug - Do not send the email, just return the result - * - * You can add custom transports (or override existing transports) by adding the - * appropriate file to src/Mailer/Transport. Transports should be named - * 'YourTransport.php', where 'Your' is the name of the transport. - */ - 'EmailTransport' => [ - 'default' => [ - 'className' => MailTransport::class, - /* - * The following keys are used in SMTP transports: - */ - 'host' => 'localhost', - 'port' => 25, - 'timeout' => 30, - 'username' => null, - 'password' => null, - 'client' => null, - 'tls' => null, - 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), - ], - ], - - /** - * Email delivery profiles - * - * Delivery profiles allow you to predefine various properties about email - * messages from your application and give the settings a name. This saves - * duplication across your application and makes maintenance and development - * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email` - * for more information. - */ - 'Email' => [ - 'default' => [ - 'transport' => 'default', - 'from' => 'you@localhost', - //'charset' => 'utf-8', - //'headerCharset' => 'utf-8', - ], - ], - - /** - * Connection information used by the ORM to connect - * to your application's datastores. - * - * ### Notes - * - Drivers include Mysql Postgres Sqlite Sqlserver - * See vendor\cakephp\cakephp\src\Database\Driver for complete list - * - Do not use periods in database name - it may lead to error. - * See https://github.com/cakephp/cakephp/issues/6471 for details. - * - 'encoding' is recommended to be set to full UTF-8 4-Byte support. - * E.g set it to 'utf8mb4' in MariaDB and MySQL and 'utf8' for any - * other RDBMS. - */ - 'Datasources' => [ - 'default' => [ - 'className' => Connection::class, - 'driver' => Mysql::class, - 'persistent' => false, - 'host' => 'localhost', - /* - * CakePHP will use the default DB port based on the driver selected - * MySQL on MAMP uses port 8889, MAMP users will want to uncomment - * the following line and set the port accordingly - */ - //'port' => 'non_standard_port_number', - 'username' => 'my_app', - 'password' => 'secret', - 'database' => 'my_app', - /* - * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6). - */ - //'encoding' => 'utf8mb4', - 'timezone' => 'UTC', - 'flags' => [], - 'cacheMetadata' => true, - 'log' => false, - - /** - * Set identifier quoting to true if you are using reserved words or - * special characters in your table or column names. Enabling this - * setting will result in queries built using the Query Builder having - * identifiers quoted when creating SQL. It should be noted that this - * decreases performance because each query needs to be traversed and - * manipulated before being executed. - */ - 'quoteIdentifiers' => false, - - /** - * During development, if using MySQL < 5.6, uncommenting the - * following line could boost the speed at which schema metadata is - * fetched from the database. It can also be set directly with the - * mysql configuration directive 'innodb_stats_on_metadata = 0' - * which is the recommended value in production environments - */ - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - - 'url' => env('DATABASE_URL', null), - ], - - /** - * The test connection is used during the test suite. - */ - 'test' => [ - 'className' => Connection::class, - 'driver' => Mysql::class, - 'persistent' => false, - 'host' => 'localhost', - //'port' => 'non_standard_port_number', - 'username' => 'my_app', - 'password' => 'secret', - 'database' => 'test_myapp', - //'encoding' => 'utf8mb4', - 'timezone' => 'UTC', - 'cacheMetadata' => true, - 'quoteIdentifiers' => false, - 'log' => false, - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - 'url' => env('DATABASE_TEST_URL', null), - ], - ], - - /** - * Configures logging options - */ - 'Log' => [ - 'debug' => [ - 'className' => FileLog::class, - 'path' => LOGS, - 'file' => 'debug', - 'url' => env('LOG_DEBUG_URL', null), - 'scopes' => false, - 'levels' => ['notice', 'info', 'debug'], - ], - 'error' => [ - 'className' => FileLog::class, - 'path' => LOGS, - 'file' => 'error', - 'url' => env('LOG_ERROR_URL', null), - 'scopes' => false, - 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], - ], - // To enable this dedicated query log, you need set your datasource's log flag to true - 'queries' => [ - 'className' => FileLog::class, - 'path' => LOGS, - 'file' => 'queries', - 'url' => env('LOG_QUERIES_URL', null), - 'scopes' => ['queriesLog'], - ], - ], - - /** - * Session configuration. - * - * Contains an array of settings to use for session configuration. The - * `defaults` key is used to define a default preset to use for sessions, any - * settings declared here will override the settings of the default config. - * - * ## Options - * - * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. Avoid using `.` in cookie names, - * as PHP will drop sessions from cookies with `.` in the name. - * - `cookiePath` - The url path for which session cookie is set. Maps to the - * `session.cookie_path` php.ini config. Defaults to base path of app. - * - `timeout` - The time in minutes the session should be valid for. - * Pass 0 to disable checking timeout. - * Please note that php.ini's session.gc_maxlifetime must be equal to or greater - * than the largest Session['timeout'] in all served websites for it to have the - * desired effect. - * - `defaults` - The default configuration set to use as a basis for your session. - * There are four built-in options: php, cake, cache, database. - * - `handler` - Can be used to enable a custom session handler. Expects an - * array with at least the `engine` key, being the name of the Session engine - * class to use for managing the session. CakePHP bundles the `CacheSession` - * and `DatabaseSession` engines. - * - `ini` - An associative array of additional ini values to set. - * - * The built-in `defaults` options are: - * - * - 'php' - Uses settings defined in your php.ini. - * - 'cake' - Saves session files in CakePHP's /tmp directory. - * - 'database' - Uses CakePHP's database sessions. - * - 'cache' - Use the Cache class to save sessions. - * - * To define a custom session handler, save it at src/Network/Session/.php. - * Make sure the class implements PHP's `SessionHandlerInterface` and set - * Session.handler to - * - * To use database sessions, load the SQL file located at config/schema/sessions.sql - */ - 'Session' => [ - 'defaults' => 'php', - ], - // Gradido specific configuration - // Login Server ip and port - 'LoginServer' => [ - 'host' => 'http://127.0.0.1', - 'port' => 1201 - ], - 'API' => [ - 'allowedCaller' => [''] // insert domains or ips from login-server and gdt if they not at localhost - ], - 'ServerAdminEmail' => 'info@gradido.net', // email 'from' field for transfer notification emails - 'noReplyEmail' => 'no-replay@gradido.net', // email sender for creation notification emails to user - - 'GroupNode' => false -]; diff --git a/community_server/config/bootstrap.php b/community_server/config/bootstrap.php deleted file mode 100644 index 77264ee0a..000000000 --- a/community_server/config/bootstrap.php +++ /dev/null @@ -1,212 +0,0 @@ -parse() -// ->putenv() -// ->toEnv() -// ->toServer(); -// } - -/* - * Read configuration file and inject configuration into various - * CakePHP classes. - * - * By default there is only one configuration file. It is often a good - * idea to create multiple configuration files, and separate the configuration - * that changes from configuration that does not. This makes deployment simpler. - */ -try { - Configure::config('default', new PhpConfig()); - Configure::load('app', 'default', false); -} catch (\Exception $e) { - exit($e->getMessage() . "\n"); -} - -/* - * Load an environment local configuration file. - * You can use a file like app_local.php to provide local overrides to your - * shared configuration. - */ -//Configure::load('app_local', 'default'); - -/* - * When debug = true the metadata cache should only last - * for a short time. - */ -if (Configure::read('debug')) { - Configure::write('Cache._cake_model_.duration', '+2 minutes'); - Configure::write('Cache._cake_core_.duration', '+2 minutes'); - // disable router cache during development - Configure::write('Cache._cake_routes_.duration', '+2 seconds'); -} - -/* - * Set the default server timezone. Using UTC makes time calculations / conversions easier. - * Check http://php.net/manual/en/timezones.php for list of valid timezone strings. - */ -date_default_timezone_set(Configure::read('App.defaultTimezone')); - -/* - * Configure the mbstring extension to use the correct encoding. - */ -mb_internal_encoding(Configure::read('App.encoding')); - -/* - * Set the default locale. This controls how dates, number and currency is - * formatted and sets the default language to use for translations. - */ -ini_set('intl.default_locale', Configure::read('App.defaultLocale')); - -/* - * Register application error and exception handlers. - */ - -$isCli = PHP_SAPI === 'cli'; - -if ($isCli) { - (new ConsoleErrorHandler(Configure::read('Error')))->register(); -} else { - (new ErrorHandler(Configure::read('Error')))->register(); -} - -/* - * Include the CLI bootstrap overrides. - */ -if ($isCli) { - require __DIR__ . '/bootstrap_cli.php'; -} - -/* - * Set the full base URL. - * This URL is used as the base of all absolute links. - * - * If you define fullBaseUrl in your config file you can remove this. - */ -if (!Configure::read('App.fullBaseUrl')) { - $s = null; - if (env('HTTPS')) { - $s = 's'; - } - - $httpHost = env('HTTP_HOST'); - if (isset($httpHost)) { - Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost); - } - unset($httpHost, $s); -} - -Cache::setConfig(Configure::consume('Cache')); -ConnectionManager::setConfig(Configure::consume('Datasources')); -TransportFactory::setConfig(Configure::consume('EmailTransport')); -Email::setConfig(Configure::consume('Email')); -Log::setConfig(Configure::consume('Log')); -Security::setSalt(Configure::consume('Security.salt')); - -/* - * The default crypto extension in 3.0 is OpenSSL. - * If you are migrating from 2.x uncomment this code to - * use a more compatible Mcrypt based implementation - */ -//Security::engine(new \Cake\Utility\Crypto\Mcrypt()); - -/* - * Setup detectors for mobile and tablet. - */ -ServerRequest::addDetector('mobile', function ($request) { - $detector = new \Detection\MobileDetect(); - - return $detector->isMobile(); -}); -ServerRequest::addDetector('tablet', function ($request) { - $detector = new \Detection\MobileDetect(); - - return $detector->isTablet(); -}); - -/* - * Enable immutable time objects in the ORM. - * - * You can enable default locale format parsing by adding calls - * to `useLocaleParser()`. This enables the automatic conversion of - * locale specific date formats. For details see - * @link https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data - */ -Type::build('time') - ->useImmutable(); -Type::build('date') - ->useImmutable(); -Type::build('datetime') - ->useImmutable(); -Type::build('timestamp') - ->useImmutable(); - -header('Access-Control-Allow-Origin: *'); -header('Access-Control-Allow-Methods: POST, GET, PUT, PATCH, DELETE, OPTIONS'); -header('Access-Control-Allow-Headers: *'); -if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'OPTIONS') { - exit(0); -} - -/* - * Custom Inflector rules, can be set to correctly pluralize or singularize - * table, model, controller names or whatever other string is passed to the - * inflection functions. - */ -//Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']); -//Inflector::rules('irregular', ['red' => 'redlings']); -//Inflector::rules('uninflected', ['dontinflectme']); -//Inflector::rules('transliteration', ['/å/' => 'aa']); diff --git a/community_server/config/bootstrap_cli.php b/community_server/config/bootstrap_cli.php deleted file mode 100644 index d3679d754..000000000 --- a/community_server/config/bootstrap_cli.php +++ /dev/null @@ -1,28 +0,0 @@ - '{{content}}', - // Container element used by control() when a field has an error. - 'inputContainerError' => '
{{content}}{{error}}
', - // Label element when inputs are not nested inside the label. - 'label' => '{{text}}', - // Generic input element. - 'input' => '', - // Textarea input element, - 'textarea' => '', - // Error message wrapper elements. - 'error' => '
' - . '{{content}}' - . '
', - // Container for error items. - 'errorList' => '{{content}}', - // Error item wrapper. - 'errorItem' => '
{{text}}
' -]; -/* - -
-
- -
-
- -
-
- - -
- - -
- - */ diff --git a/community_server/config/nginx/fastcgi.conf b/community_server/config/nginx/fastcgi.conf deleted file mode 100644 index 238f7869f..000000000 --- a/community_server/config/nginx/fastcgi.conf +++ /dev/null @@ -1,25 +0,0 @@ -fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -fastcgi_param QUERY_STRING $query_string; -fastcgi_param REQUEST_METHOD $request_method; -fastcgi_param CONTENT_TYPE $content_type; -fastcgi_param CONTENT_LENGTH $content_length; - -fastcgi_param SCRIPT_NAME $fastcgi_script_name; -fastcgi_param REQUEST_URI $request_uri; -fastcgi_param DOCUMENT_URI $document_uri; -fastcgi_param DOCUMENT_ROOT $document_root; -fastcgi_param SERVER_PROTOCOL $server_protocol; -fastcgi_param REQUEST_SCHEME $scheme; -fastcgi_param HTTPS $https if_not_empty; - -fastcgi_param GATEWAY_INTERFACE CGI/1.1; -fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; - -fastcgi_param REMOTE_ADDR $remote_addr; -fastcgi_param REMOTE_PORT $remote_port; -fastcgi_param SERVER_ADDR $server_addr; -fastcgi_param SERVER_PORT $server_port; -fastcgi_param SERVER_NAME $server_name; - -# PHP only, required if PHP was built with --enable-force-cgi-redirect -fastcgi_param REDIRECT_STATUS 200; \ No newline at end of file diff --git a/community_server/config/nginx/mime.types b/community_server/config/nginx/mime.types deleted file mode 100644 index cd3d700ea..000000000 --- a/community_server/config/nginx/mime.types +++ /dev/null @@ -1,88 +0,0 @@ -types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/png png; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - image/svg+xml svg svgz; - image/webp webp; - - application/font-woff woff; - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.apple.mpegurl m3u8; - application/vnd.ms-excel xls; - application/vnd.ms-fontobject eot; - application/vnd.ms-powerpoint ppt; - application/vnd.wap.wmlc wmlc; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/xspf+xml xspf; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream iso img; - application/octet-stream msi msp msm; - - application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; - application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; - - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; - - video/3gpp 3gpp 3gp; - video/mp2t ts; - video/mp4 mp4; - video/mpeg mpeg mpg; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-m4v m4v; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; -} diff --git a/community_server/config/nginx/nginx.conf b/community_server/config/nginx/nginx.conf deleted file mode 100644 index 197c96167..000000000 --- a/community_server/config/nginx/nginx.conf +++ /dev/null @@ -1,86 +0,0 @@ - -server { - - listen 80 ; - listen [::]:80; - server_name 0.0.0.0; - - #include /etc/nginx/common/protect.conf; - #include /etc/nginx/common/protect_add_header.conf; - #include /etc/nginx/common/ssl.conf; - - - root /usr/share/nginx/html/webroot; - index index.php; - - location ~* \.(png|jpg|ico|webp)\$ { - expires 30d; - } - - location ~* \.(js|css) { - # expires 1d; - expires 1d; - } - - location ~ \.php\$ { - # regex to split $uri to $fastcgi_script_name and $fastcgi_path - fastcgi_split_path_info ^(.+\.php)(/.+)$; - - # Check that the PHP script exists before passing it - try_files $fastcgi_script_name =404; - - # Bypass the fact that try_files resets $fastcgi_path_info - # see: http://trac.nginx.org/nginx/ticket/321 - set $path_info $fastcgi_path_info; - fastcgi_param PATH_INFO $path_info; - - fastcgi_index index.php; - include fastcgi.conf; - - #fastcgi_pass unix:/run/php/php7.3-fpm.sock; - fastcgi_pass 127.0.0.1:9000; - - } - - location ~ /\.ht { - deny all; - } - - location /account { - proxy_http_version 1.1; - proxy_set_header Upgrade \$http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_cache_bypass \$http_upgrade; - proxy_set_header X-Real-IP \$remote_addr; - proxy_set_header X-Forwarded-For \$remote_addr; - proxy_set_header Host \$host; - rewrite /account/(.*) /\$1 break; - - #proxy_next_upstream error timeout invalid_header http_502 non_idempotent; - proxy_pass http://login-server:1200; - proxy_redirect off; - - - } - - location /login_api { - proxy_http_version 1.1; - proxy_set_header Upgrade \$http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_cache_bypass \$http_upgrade; - proxy_set_header X-Real-IP \$remote_addr; - proxy_set_header X-Forwarded-For \$remote_addr; - proxy_set_header Host \$host; - rewrite /login_api/(.*) /\$1 break; - - proxy_pass http://login-server:1201; - proxy_redirect off; - } - - location / { - try_files \$uri \$uri/ /index.php?\$args; - } - -# access_log /var/log/nginx/access.log main; - -} \ No newline at end of file diff --git a/community_server/config/paths.php b/community_server/config/paths.php deleted file mode 100644 index 1c8121588..000000000 --- a/community_server/config/paths.php +++ /dev/null @@ -1,89 +0,0 @@ - '{{content}}', - 'input' => '
' - . '' - . '
', - 'error' => '
' - . '{{content}}' - . '
', - - // Container for error items. - //'errorList' => '
    {{content}}
', - 'errorList' => '{{content}}', - - // Error item wrapper. - //'errorItem' => '
  • {{text}}
  • ', - 'errorItem' => '
    {{text}}
    ' -]; diff --git a/community_server/config/routes.php b/community_server/config/routes.php deleted file mode 100644 index 20fc1ff62..000000000 --- a/community_server/config/routes.php +++ /dev/null @@ -1,160 +0,0 @@ - true - ]); - - // Token check will be skipped when callback returns `true`. - $csrf->whitelistCallback(function ($request) { - // Skip token check for API URLs. - //die($request->getParam('controller')); - $whitelist = ['JsonRequestHandler', 'ElopageWebhook', 'AppRequests']; - $ajaxWhitelist = ['TransactionSendCoins', 'TransactionCreations']; - - $callerIp = $request->clientIp(); - - foreach($whitelist as $entry) { - if($request->getParam('controller') === $entry) { - if($entry == 'ElopageWebhook' || $entry == 'AppRequests') { - return true; - } - $allowedIpLocalhost = ['127.0.0.1', 'localhost', '', '::1']; - if(in_array($callerIp, $allowedIpLocalhost)) { - return true; - } - $allowedCaller = Configure::read('API.allowedCaller'); - $ipPerHost = []; - if($allowedCaller && count($allowedCaller) > 0) { - - foreach($allowedCaller as $allowed) { - $ip = gethostbyname($allowed); - $ipPerHost[$allowed] = $ip; - if($ip === $callerIp) return true; - } - //die("caller ip: $callerIp
    "); - } - //var_dump(['caller_ip' => $callerIp, 'ips' => $ipPerHost]); - die(json_encode(['state' => 'error', 'details' => ['caller_ip' => $callerIp, 'ips' => $ipPerHost]])); - } - } - // disable csfr for all ajax requests in ajax whitelisted controller - foreach($ajaxWhitelist as $entry) { - if($request->getParam('controller') === $entry) { - $action = $request->getParam('action'); - if(preg_match('/^ajax/', $action)) { - return true; - } - } - } - }); - - // Register scoped middleware for in scopes. - $routes->registerMiddleware('csrf', $csrf); - - /** - * Apply a middleware to the current route scope. - * Requires middleware to be registered via `Application::routes()` with `registerMiddleware()` - */ - $routes->applyMiddleware('csrf'); - - /** - * Here, we are connecting '/' (base path) to a controller called 'Pages', - * its action called 'display', and we pass a param to select the view file - * to use (in this case, src/Template/Pages/home.ctp)... - */ - //$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); - $routes->connect('/', ['controller' => 'Dashboard', 'action' => 'index']); - $routes->connect('/api/:action/*', ['controller' => 'AppRequests'], ['routeClass' => 'DashedRoute']); - //$routes->connect('/client', ['controller' => 'Pages', 'action' => 'display', 'js']); - $routes->connect('/server', ['controller' => 'Dashboard', 'action' => 'serverIndex']); - $routes->connect('/client', ['controller' => 'Pages', 'action' => 'display', 'vue']); - $routes->connect('/vue-dev', ['controller' => 'Pages', 'action' => 'display', 'vue-dev']); - //$routes->connect('/', 'https://gradido2.dario-rekowski.de/account', array('status' => 303)); - - /** - * ...and connect the rest of 'Pages' controller's URLs. - */ - $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']); - - /** - * Connect catchall routes for all controllers. - * - * Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for - * - * ``` - * $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']); - * $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']); - * ``` - * - * Any route class can be used with this method, such as: - * - DashedRoute - * - InflectedRoute - * - Route - * - Or your own route class - * - * You can remove these routes once you've connected the - * routes you want in your application. - */ - $routes->fallbacks(DashedRoute::class); -}); - -/** - * If you need a different set of middleware or none at all, - * open new scope and define routes there. - * - * ``` - * Router::scope('/api', function (RouteBuilder $routes) { - * // No $routes->applyMiddleware() here. - * // Connect API actions here. - * }); - * ``` - */ diff --git a/community_server/config/schema/i18n.sql b/community_server/config/schema/i18n.sql deleted file mode 100644 index e59d1e651..000000000 --- a/community_server/config/schema/i18n.sql +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) -# -# Licensed under The MIT License -# For full copyright and license information, please see the LICENSE.txt -# Redistributions of files must retain the above copyright notice. -# MIT License (https://opensource.org/licenses/mit-license.php) - -CREATE TABLE i18n ( - id int NOT NULL auto_increment, - locale varchar(6) NOT NULL, - model varchar(255) NOT NULL, - foreign_key int(10) NOT NULL, - field varchar(255) NOT NULL, - content text, - PRIMARY KEY (id), - UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field), - INDEX I18N_FIELD(model, foreign_key, field) -); diff --git a/community_server/config/schema/sessions.sql b/community_server/config/schema/sessions.sql deleted file mode 100644 index 1aa0a0f54..000000000 --- a/community_server/config/schema/sessions.sql +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) -# -# Licensed under The MIT License -# For full copyright and license information, please see the LICENSE.txt -# Redistributions of files must retain the above copyright notice. -# MIT License (https://opensource.org/licenses/mit-license.php) - -CREATE TABLE `sessions` ( - `id` char(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL, - `created` datetime DEFAULT CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+ - `modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+ - `data` blob DEFAULT NULL, -- for PostgreSQL use bytea instead of blob - `expires` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/community_server/copy_to_www.sh b/community_server/copy_to_www.sh deleted file mode 100755 index f6519919f..000000000 --- a/community_server/copy_to_www.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -[! -z "${FOLDER_NAME}"] && FOLDER_NAME=community_server - -COLOR_GREEN="\033[0;32m" -COLOR_YELLOW="\e[33m" -COLOR_NONE="\033[0m" - -SCRIPT=`realpath -s $0` -SCRIPTPATH=`dirname $SCRIPT` -#echo -e "script: $SCRIPT, Path: $SCRIPTPATH " - -cd /var/www/html -if [ ! -d "$FOLDER_NAME" ] ; then - mkdir $FOLDER_NAME -else - chmod -R 0755 $FOLDER_NAME -fi -cd $FOLDER_NAME -cp -r $SCRIPTPATH/src . -cp -r $SCRIPTPATH/config . -cp -r $SCRIPTPATH/composer.json . -cp -r $SCRIPTPATH/webroot . -composer install -if [ ! -d "tmp" ] ; then - mkdir tmp - chown -R www-data:www-data ./tmp -fi -if [ ! -d "logs" ] ; then - mkdir logs - chown -R www-data:www-data ./logs -fi - -cd .. -chown -R www-data:www-data $FOLDER_NAME -chmod -R 0755 $FOLDER_NAME/src -chmod -R 0755 $FOLDER_NAME/config -chmod -R 0755 $FOLDER_NAME/webroot diff --git a/community_server/docu/community-server.api.md b/community_server/docu/community-server.api.md deleted file mode 100644 index 6032ce0a2..000000000 --- a/community_server/docu/community-server.api.md +++ /dev/null @@ -1,132 +0,0 @@ - -# community server api - -In this examples I assume that you use gradido with docker-compose build on your local maschine - -## Konto Overview -return current account balance - -GET http://localhost/state-balances/ajaxGetBalance/-127182 - -If session is valid, return: -```json -{"state":"success","balance":174500} -``` -- balance: Gradido Cent, 4 Nachkommastellen (2 Reserve), 174500 = 17,45 GDD - -## List Transactions -List all transactions from logged in user, currently without paging -Ajax: -GET http://localhost/state-balances/ajaxListTransactions/-127182/ -or -GET http://localhost/state-balances/ajaxListTransactions/-127182/DESC -to get transaction in descending order - -Antwort: -Wenn alles okay: -```json -{"state":"success", "transactions": - [ - { - "name": "Max Mustermann", - "email": "Maxim Mustermann", - "type": "send", - "transaction_id": 2, - "date": "2021-02-19T13:25:36+00:00", - "balance": 1920000, - "memo": "a piece of cake :)", - "pubkey": "038a6f93270dc57b91d76bf110ad3863fcb7d1b08e7692e793fcdb4467e5b6a7" - } - ], - "transactionExecutingCount": 0, - "count": 1, - "gdtSum": 0, - "timeUsed": 0.04562687873840332 -} -``` - -- name: name of other involved party or empty if unknown (if other party don't belong to group) - - if type is send, name is name of receiver - - if type is receive, name is name of sender - - if type is creation currently I use a static string ("Gradido Akademie) -- email: optional, only if type is send or receive and other user is known -- pubkey: optional, only if type is send or receive and other user isn't known -- type: type of transaction - - creation: user has get gradidos created - - send: user has send another user gradidos - - receiver: user has received gradidos from another user -- transaction_id: id of transaction in db, in stage2 also the hedera sequence number of transaction -- date: date of ordering transaction (booking date) -- balance: Gradido Cent, 4 Nachkommastellen (2 Reserve), 1920000 = 192,00 GDD -- memo: Details about transaction -- pubkey: optional, if other party isn't known, hexadecimal representation of 32 Byte public key of user [0-9a-f] - -- transactionExecutingCount: how many transaction for this user currently pending and waiting for signing -- count: sum of finished transactions user is involved -- gdtSum: sum of gdt of user in cent with 2 places (Nachkommastellen) -- timeUsed: time used for getting data from db in seconds, only for analyse backend performance - -## Creation Transaction -Make a creation transaction -With new Option set in Login-Server: -```ini -unsecure.allow_auto_sign_transactions = 1 -``` -transactions can be auto-signed directly with handing in transaction. -Normally a forwarding to login-server check transactions side is neccessary to minimize security risks. - -POST http://localhost/transaction-creations/ajaxCreate -```json -{ - "session_id" : -127182, - "email": "max.musterman@gmail.de", - "amount": 10000000, - "target_date":"2021-02-19T13:25:36+00:00", - "memo":"AGE", - "auto_sign": true -} -``` -return if everything is ok: -```json -{"state":"success", "timeUsed": 0.0122} -``` -- timeUsed: time used for getting data from db in seconds, only for analyse backend performance - -## Send Coins Transaction -Make a simple GDD Transaction, send Coins from one user to other. -With new Option set in Login-Server: -```ini -unsecure.allow_auto_sign_transactions = 1 -``` -transactions can be auto-signed directly with handing in transaction. -Normally a forwarding to login-server check transactions side is neccessary to minimize security risks. - -POST http://localhost/transaction-send-coins/ajaxCreate -```json -{ - "session_id" : -127182, - "amount": 2000000, - "email": "max.musterman@gmail.de", - "memo":"Thank you :)", - "auto_sign": true -} -``` -- amout: amount to transfer, 2000000 = 200,00 GDD -- email: receiver email address, must be differ from user email -- memo: Details about transaction -- auto_sign: set to true to directly sign transaction if unsecure.allow_auto_sign_transactions = 1 is set - -return if everything is ok: -```json -{"state":"success", "timeUsed": 0.0122} -``` -- timeUsed: time used for getting data from db in seconds, only for analyse backend performance - -Than the transaction was created on community server, send to login-server, signed (if unsecure.allow_auto_sign_transactions = 1 and auto_sign = true) -and send back to community server and put into db. -After you get this answear you see the new transaction if you list transactions or call for the balance. - -Without auto-sign the transaction is pending on login-server and waits for the user to review it at -http://localhost/account/checkTransactions - - diff --git a/community_server/index.php b/community_server/index.php deleted file mode 100644 index 459176916..000000000 --- a/community_server/index.php +++ /dev/null @@ -1,16 +0,0 @@ -=2.1.2 <3.0.0', -175 silly cache add type: 'range' } -176 silly addNamed clone@>=2.1.2 <3.0.0 -177 verbose addNamed ">=2.1.2 <3.0.0" is a valid semver range for clone -178 silly addNameRange { name: 'clone', range: '>=2.1.2 <3.0.0', hasData: false } -179 silly mapToRegistry name clone -180 silly mapToRegistry using default registry -181 silly mapToRegistry registry https://registry.npmjs.org/ -182 silly mapToRegistry uri https://registry.npmjs.org/clone -183 verbose addNameRange registry:https://registry.npmjs.org/clone not in flight; fetching -184 verbose get https://registry.npmjs.org/clone not expired, no request -185 silly addNameRange number 2 { name: 'clone', range: '>=2.1.2 <3.0.0', hasData: true } -186 silly addNameRange versions [ 'clone', -186 silly addNameRange [ '0.0.0', -186 silly addNameRange '0.0.1', -186 silly addNameRange '0.0.2', -186 silly addNameRange '0.0.3', -186 silly addNameRange '0.0.4', -186 silly addNameRange '0.0.5', -186 silly addNameRange '0.0.6', -186 silly addNameRange '0.0.7', -186 silly addNameRange '0.1.0', -186 silly addNameRange '0.1.1', -186 silly addNameRange '0.1.2', -186 silly addNameRange '0.1.3', -186 silly addNameRange '0.1.4', -186 silly addNameRange '0.1.5', -186 silly addNameRange '0.1.6', -186 silly addNameRange '0.1.7', -186 silly addNameRange '0.1.8', -186 silly addNameRange '0.1.9', -186 silly addNameRange '0.1.10', -186 silly addNameRange '0.1.11', -186 silly addNameRange '0.1.12', -186 silly addNameRange '0.1.13', -186 silly addNameRange '0.1.14', -186 silly addNameRange '0.1.15', -186 silly addNameRange '0.1.16', -186 silly addNameRange '0.1.17', -186 silly addNameRange '0.1.18', -186 silly addNameRange '0.2.0', -186 silly addNameRange '0.1.19', -186 silly addNameRange '1.0.0', -186 silly addNameRange '1.0.1', -186 silly addNameRange '1.0.2', -186 silly addNameRange '2.0.0', -186 silly addNameRange '2.1.0', -186 silly addNameRange '2.1.1', -186 silly addNameRange '1.0.3', -186 silly addNameRange '2.1.2', -186 silly addNameRange '1.0.4' ] ] -187 silly addNamed clone@2.1.2 -188 verbose addNamed "2.1.2" is a plain semver version for clone -189 silly mapToRegistry name clone -190 silly mapToRegistry using default registry -191 silly mapToRegistry registry https://registry.npmjs.org/ -192 silly mapToRegistry uri https://registry.npmjs.org/clone -193 verbose addRemoteTarball https://registry.npmjs.org/clone/-/clone-2.1.2.tgz not in flight; adding -194 verbose addRemoteTarball [ 'https://registry.npmjs.org/clone/-/clone-2.1.2.tgz', -194 verbose addRemoteTarball '1b7f4b9f591f1e8f83670401600345a02887435f' ] -195 info retry fetch attempt 1 at 13:48:57 -196 info attempt registry request try #1 at 13:48:57 -197 http fetch GET https://registry.npmjs.org/clone/-/clone-2.1.2.tgz -198 http fetch 200 https://registry.npmjs.org/clone/-/clone-2.1.2.tgz -199 silly fetchAndShaCheck shasum 1b7f4b9f591f1e8f83670401600345a02887435f -200 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/clone/-/clone-2.1.2.tgz not in flight; adding -201 verbose addTmpTarball already have metadata; skipping unpack for clone@2.1.2 -202 http 200 https://registry.npmjs.org/mime -203 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -203 verbose headers 'content-type': 'application/json', -203 verbose headers 'transfer-encoding': 'chunked', -203 verbose headers connection: 'keep-alive', -203 verbose headers 'set-cookie': -203 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -203 verbose headers 'cf-ray': '59764fa1caba6347-FRA', -203 verbose headers age: '5658', -203 verbose headers 'cache-control': 'public, max-age=300', -203 verbose headers etag: 'W/"06d541b2c21df82e268be063f8846ba5"', -203 verbose headers 'last-modified': 'Fri, 01 May 2020 23:10:52 GMT', -203 verbose headers vary: 'accept-encoding, accept', -203 verbose headers 'cf-cache-status': 'HIT', -203 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -203 verbose headers server: 'cloudflare', -203 verbose headers 'content-encoding': 'gzip', -203 verbose headers 'cf-request-id': '02ddd0192000006347e8890200000001' } -204 silly get cb [ 200, -204 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -204 silly get 'content-type': 'application/json', -204 silly get 'transfer-encoding': 'chunked', -204 silly get connection: 'keep-alive', -204 silly get 'set-cookie': -204 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -204 silly get 'cf-ray': '59764fa1caba6347-FRA', -204 silly get age: '5658', -204 silly get 'cache-control': 'public, max-age=300', -204 silly get etag: 'W/"06d541b2c21df82e268be063f8846ba5"', -204 silly get 'last-modified': 'Fri, 01 May 2020 23:10:52 GMT', -204 silly get vary: 'accept-encoding, accept', -204 silly get 'cf-cache-status': 'HIT', -204 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -204 silly get server: 'cloudflare', -204 silly get 'content-encoding': 'gzip', -204 silly get 'cf-request-id': '02ddd0192000006347e8890200000001' } ] -205 verbose get saving mime to /home/christine/.npm/registry.npmjs.org/mime/.cache.json -206 http 304 https://registry.npmjs.org/errno -207 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -207 verbose headers connection: 'keep-alive', -207 verbose headers 'set-cookie': -207 verbose headers [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -207 verbose headers 'cf-ray': '59764fa1ddccd6e9-FRA', -207 verbose headers age: '5629', -207 verbose headers 'cache-control': 'public, max-age=300', -207 verbose headers etag: '"93d3c79a655f99137298121fc95d36c6"', -207 verbose headers 'last-modified': 'Sat, 26 May 2018 23:40:24 GMT', -207 verbose headers vary: 'Accept-Encoding', -207 verbose headers 'cf-cache-status': 'HIT', -207 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -207 verbose headers server: 'cloudflare', -207 verbose headers 'cf-request-id': '02ddd019240000d6e975b00200000001' } -208 silly get cb [ 304, -208 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -208 silly get connection: 'keep-alive', -208 silly get 'set-cookie': -208 silly get [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -208 silly get 'cf-ray': '59764fa1ddccd6e9-FRA', -208 silly get age: '5629', -208 silly get 'cache-control': 'public, max-age=300', -208 silly get etag: '"93d3c79a655f99137298121fc95d36c6"', -208 silly get 'last-modified': 'Sat, 26 May 2018 23:40:24 GMT', -208 silly get vary: 'Accept-Encoding', -208 silly get 'cf-cache-status': 'HIT', -208 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -208 silly get server: 'cloudflare', -208 silly get 'cf-request-id': '02ddd019240000d6e975b00200000001' } ] -209 verbose etag https://registry.npmjs.org/errno from cache -210 verbose get saving errno to /home/christine/.npm/registry.npmjs.org/errno/.cache.json -211 http 200 https://registry.npmjs.org/promise -212 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -212 verbose headers 'content-type': 'application/json', -212 verbose headers 'transfer-encoding': 'chunked', -212 verbose headers connection: 'keep-alive', -212 verbose headers 'set-cookie': -212 verbose headers [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -212 verbose headers 'cf-ray': '59764fa1c9c76413-FRA', -212 verbose headers age: '5628', -212 verbose headers 'cache-control': 'public, max-age=300', -212 verbose headers etag: 'W/"0560bb757d840a7a46bf8d008bc75194"', -212 verbose headers 'last-modified': 'Mon, 02 Mar 2020 10:57:46 GMT', -212 verbose headers vary: 'accept-encoding, accept', -212 verbose headers 'cf-cache-status': 'HIT', -212 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -212 verbose headers server: 'cloudflare', -212 verbose headers 'content-encoding': 'gzip', -212 verbose headers 'cf-request-id': '02ddd01920000064135f8cb200000001' } -213 silly get cb [ 200, -213 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -213 silly get 'content-type': 'application/json', -213 silly get 'transfer-encoding': 'chunked', -213 silly get connection: 'keep-alive', -213 silly get 'set-cookie': -213 silly get [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -213 silly get 'cf-ray': '59764fa1c9c76413-FRA', -213 silly get age: '5628', -213 silly get 'cache-control': 'public, max-age=300', -213 silly get etag: 'W/"0560bb757d840a7a46bf8d008bc75194"', -213 silly get 'last-modified': 'Mon, 02 Mar 2020 10:57:46 GMT', -213 silly get vary: 'accept-encoding, accept', -213 silly get 'cf-cache-status': 'HIT', -213 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -213 silly get server: 'cloudflare', -213 silly get 'content-encoding': 'gzip', -213 silly get 'cf-request-id': '02ddd01920000064135f8cb200000001' } ] -214 verbose get saving promise to /home/christine/.npm/registry.npmjs.org/promise/.cache.json -215 http 200 https://registry.npmjs.org/graceful-fs -216 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -216 verbose headers 'content-type': 'application/json', -216 verbose headers 'transfer-encoding': 'chunked', -216 verbose headers connection: 'keep-alive', -216 verbose headers 'set-cookie': -216 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -216 verbose headers 'cf-ray': '59764fa1da22325c-FRA', -216 verbose headers age: '5345', -216 verbose headers 'cache-control': 'public, max-age=300', -216 verbose headers etag: 'W/"84e1c483529d18a582ac0265096141af"', -216 verbose headers 'last-modified': 'Tue, 28 Apr 2020 15:14:15 GMT', -216 verbose headers vary: 'accept-encoding, accept', -216 verbose headers 'cf-cache-status': 'HIT', -216 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -216 verbose headers server: 'cloudflare', -216 verbose headers 'content-encoding': 'gzip', -216 verbose headers 'cf-request-id': '02ddd019250000325c4cbef200000001' } -217 silly get cb [ 200, -217 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -217 silly get 'content-type': 'application/json', -217 silly get 'transfer-encoding': 'chunked', -217 silly get connection: 'keep-alive', -217 silly get 'set-cookie': -217 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -217 silly get 'cf-ray': '59764fa1da22325c-FRA', -217 silly get age: '5345', -217 silly get 'cache-control': 'public, max-age=300', -217 silly get etag: 'W/"84e1c483529d18a582ac0265096141af"', -217 silly get 'last-modified': 'Tue, 28 Apr 2020 15:14:15 GMT', -217 silly get vary: 'accept-encoding, accept', -217 silly get 'cf-cache-status': 'HIT', -217 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -217 silly get server: 'cloudflare', -217 silly get 'content-encoding': 'gzip', -217 silly get 'cf-request-id': '02ddd019250000325c4cbef200000001' } ] -218 verbose get saving graceful-fs to /home/christine/.npm/registry.npmjs.org/graceful-fs/.cache.json -219 silly resolveWithNewModule errno@0.1.7 checking installable status -220 silly cache add args [ 'errno@^0.1.1', null ] -221 verbose cache add spec errno@^0.1.1 -222 silly cache add parsed spec Result { -222 silly cache add raw: 'errno@^0.1.1', -222 silly cache add scope: null, -222 silly cache add name: 'errno', -222 silly cache add rawSpec: '^0.1.1', -222 silly cache add spec: '>=0.1.1 <0.2.0', -222 silly cache add type: 'range' } -223 silly addNamed errno@>=0.1.1 <0.2.0 -224 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for errno -225 silly addNameRange { name: 'errno', range: '>=0.1.1 <0.2.0', hasData: false } -226 silly mapToRegistry name errno -227 silly mapToRegistry using default registry -228 silly mapToRegistry registry https://registry.npmjs.org/ -229 silly mapToRegistry uri https://registry.npmjs.org/errno -230 verbose addNameRange registry:https://registry.npmjs.org/errno not in flight; fetching -231 silly resolveWithNewModule mime@1.6.0 checking installable status -232 silly cache add args [ 'mime@^1.4.1', null ] -233 verbose cache add spec mime@^1.4.1 -234 silly cache add parsed spec Result { -234 silly cache add raw: 'mime@^1.4.1', -234 silly cache add scope: null, -234 silly cache add name: 'mime', -234 silly cache add rawSpec: '^1.4.1', -234 silly cache add spec: '>=1.4.1 <2.0.0', -234 silly cache add type: 'range' } -235 silly addNamed mime@>=1.4.1 <2.0.0 -236 verbose addNamed ">=1.4.1 <2.0.0" is a valid semver range for mime -237 silly addNameRange { name: 'mime', range: '>=1.4.1 <2.0.0', hasData: false } -238 silly mapToRegistry name mime -239 silly mapToRegistry using default registry -240 silly mapToRegistry registry https://registry.npmjs.org/ -241 silly mapToRegistry uri https://registry.npmjs.org/mime -242 verbose addNameRange registry:https://registry.npmjs.org/mime not in flight; fetching -243 http 200 https://registry.npmjs.org/tslib -244 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -244 verbose headers 'content-type': 'application/json', -244 verbose headers 'transfer-encoding': 'chunked', -244 verbose headers connection: 'keep-alive', -244 verbose headers 'set-cookie': -244 verbose headers [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -244 verbose headers 'cf-ray': '59764fa1d9e7d715-FRA', -244 verbose headers age: '5299', -244 verbose headers 'cache-control': 'public, max-age=300', -244 verbose headers etag: 'W/"2b86a514bc0f750da0d0f62d3dbfde51"', -244 verbose headers 'last-modified': 'Wed, 13 May 2020 23:18:43 GMT', -244 verbose headers vary: 'accept-encoding, accept', -244 verbose headers 'cf-cache-status': 'HIT', -244 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -244 verbose headers server: 'cloudflare', -244 verbose headers 'content-encoding': 'gzip', -244 verbose headers 'cf-request-id': '02ddd019240000d715c11d3200000001' } -245 silly get cb [ 200, -245 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -245 silly get 'content-type': 'application/json', -245 silly get 'transfer-encoding': 'chunked', -245 silly get connection: 'keep-alive', -245 silly get 'set-cookie': -245 silly get [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -245 silly get 'cf-ray': '59764fa1d9e7d715-FRA', -245 silly get age: '5299', -245 silly get 'cache-control': 'public, max-age=300', -245 silly get etag: 'W/"2b86a514bc0f750da0d0f62d3dbfde51"', -245 silly get 'last-modified': 'Wed, 13 May 2020 23:18:43 GMT', -245 silly get vary: 'accept-encoding, accept', -245 silly get 'cf-cache-status': 'HIT', -245 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -245 silly get server: 'cloudflare', -245 silly get 'content-encoding': 'gzip', -245 silly get 'cf-request-id': '02ddd019240000d715c11d3200000001' } ] -246 verbose get saving tslib to /home/christine/.npm/registry.npmjs.org/tslib/.cache.json -247 verbose get https://registry.npmjs.org/errno not expired, no request -248 silly addNameRange number 2 { name: 'errno', range: '>=0.1.1 <0.2.0', hasData: true } -249 silly addNameRange versions [ 'errno', -249 silly addNameRange [ '0.0.1', -249 silly addNameRange '0.0.2', -249 silly addNameRange '0.0.3', -249 silly addNameRange '0.0.4', -249 silly addNameRange '0.0.5', -249 silly addNameRange '0.1.0', -249 silly addNameRange '0.1.1', -249 silly addNameRange '0.1.2', -249 silly addNameRange '0.1.3', -249 silly addNameRange '0.1.4', -249 silly addNameRange '0.1.5', -249 silly addNameRange '0.1.6', -249 silly addNameRange '0.1.7' ] ] -250 silly addNamed errno@0.1.7 -251 verbose addNamed "0.1.7" is a plain semver version for errno -252 verbose get https://registry.npmjs.org/mime not expired, no request -253 silly addNameRange number 2 { name: 'mime', range: '>=1.4.1 <2.0.0', hasData: true } -254 silly addNameRange versions [ 'mime', -254 silly addNameRange [ '1.0.0', -254 silly addNameRange '1.1.0', -254 silly addNameRange '1.2.1', -254 silly addNameRange '1.2.2', -254 silly addNameRange '1.2.3', -254 silly addNameRange '1.2.4', -254 silly addNameRange '1.2.5', -254 silly addNameRange '1.2.6', -254 silly addNameRange '1.2.7', -254 silly addNameRange '1.2.8', -254 silly addNameRange '1.2.9', -254 silly addNameRange '1.2.10', -254 silly addNameRange '1.2.11', -254 silly addNameRange '1.3.0', -254 silly addNameRange '1.3.2', -254 silly addNameRange '1.3.3', -254 silly addNameRange '1.3.4', -254 silly addNameRange '1.3.5', -254 silly addNameRange '1.3.6', -254 silly addNameRange '1.4.0', -254 silly addNameRange '2.0.0', -254 silly addNameRange '2.0.1', -254 silly addNameRange '2.0.2', -254 silly addNameRange '1.4.1', -254 silly addNameRange '2.0.3', -254 silly addNameRange '1.5.0', -254 silly addNameRange '1.6.0', -254 silly addNameRange '2.0.5', -254 silly addNameRange '2.1.0', -254 silly addNameRange '2.2.0', -254 silly addNameRange '2.2.1', -254 silly addNameRange '2.2.2', -254 silly addNameRange '2.3.0', -254 silly addNameRange '2.3.1', -254 silly addNameRange '2.4.0', -254 silly addNameRange '2.4.1', -254 silly addNameRange '2.4.2', -254 silly addNameRange '2.4.3', -254 silly addNameRange '2.4.4', -254 silly addNameRange '2.4.5' ] ] -255 silly addNamed mime@1.6.0 -256 verbose addNamed "1.6.0" is a plain semver version for mime -257 silly cache afterAdd clone@2.1.2 -258 verbose afterAdd /home/christine/.npm/clone/2.1.2/package/package.json not in flight; writing -259 silly mapToRegistry name mime -260 silly mapToRegistry using default registry -261 silly mapToRegistry registry https://registry.npmjs.org/ -262 silly mapToRegistry uri https://registry.npmjs.org/mime -263 verbose addRemoteTarball https://registry.npmjs.org/mime/-/mime-1.6.0.tgz not in flight; adding -264 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime/-/mime-1.6.0.tgz', -264 verbose addRemoteTarball '32cd9e5c64553bd58d19a568af452acff04981b1' ] -265 http 200 https://registry.npmjs.org/mkdirp -266 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -266 verbose headers 'content-type': 'application/json', -266 verbose headers 'transfer-encoding': 'chunked', -266 verbose headers connection: 'keep-alive', -266 verbose headers 'set-cookie': -266 verbose headers [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -266 verbose headers 'cf-ray': '59764fa1fe51175a-FRA', -266 verbose headers age: '5346', -266 verbose headers 'cache-control': 'public, max-age=300', -266 verbose headers etag: 'W/"0730d9c43c136c318d8e19c69cbd72aa"', -266 verbose headers 'last-modified': 'Wed, 22 Apr 2020 06:03:24 GMT', -266 verbose headers vary: 'accept-encoding, accept', -266 verbose headers 'cf-cache-status': 'HIT', -266 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -266 verbose headers server: 'cloudflare', -266 verbose headers 'content-encoding': 'gzip', -266 verbose headers 'cf-request-id': '02ddd019380000175a1e1e7200000001' } -267 silly get cb [ 200, -267 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -267 silly get 'content-type': 'application/json', -267 silly get 'transfer-encoding': 'chunked', -267 silly get connection: 'keep-alive', -267 silly get 'set-cookie': -267 silly get [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -267 silly get 'cf-ray': '59764fa1fe51175a-FRA', -267 silly get age: '5346', -267 silly get 'cache-control': 'public, max-age=300', -267 silly get etag: 'W/"0730d9c43c136c318d8e19c69cbd72aa"', -267 silly get 'last-modified': 'Wed, 22 Apr 2020 06:03:24 GMT', -267 silly get vary: 'accept-encoding, accept', -267 silly get 'cf-cache-status': 'HIT', -267 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -267 silly get server: 'cloudflare', -267 silly get 'content-encoding': 'gzip', -267 silly get 'cf-request-id': '02ddd019380000175a1e1e7200000001' } ] -268 verbose get saving mkdirp to /home/christine/.npm/registry.npmjs.org/mkdirp/.cache.json -269 silly resolveWithNewModule graceful-fs@4.2.4 checking installable status -270 silly cache add args [ 'graceful-fs@^4.1.2', null ] -271 verbose cache add spec graceful-fs@^4.1.2 -272 silly cache add parsed spec Result { -272 silly cache add raw: 'graceful-fs@^4.1.2', -272 silly cache add scope: null, -272 silly cache add name: 'graceful-fs', -272 silly cache add rawSpec: '^4.1.2', -272 silly cache add spec: '>=4.1.2 <5.0.0', -272 silly cache add type: 'range' } -273 silly addNamed graceful-fs@>=4.1.2 <5.0.0 -274 verbose addNamed ">=4.1.2 <5.0.0" is a valid semver range for graceful-fs -275 silly addNameRange { name: 'graceful-fs', range: '>=4.1.2 <5.0.0', hasData: false } -276 silly mapToRegistry name graceful-fs -277 silly mapToRegistry using default registry -278 silly mapToRegistry registry https://registry.npmjs.org/ -279 silly mapToRegistry uri https://registry.npmjs.org/graceful-fs -280 verbose addNameRange registry:https://registry.npmjs.org/graceful-fs not in flight; fetching -281 http 200 https://registry.npmjs.org/image-size -282 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -282 verbose headers 'content-type': 'application/json', -282 verbose headers 'transfer-encoding': 'chunked', -282 verbose headers connection: 'keep-alive', -282 verbose headers 'set-cookie': -282 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -282 verbose headers 'cf-ray': '59764fa1cf14648b-FRA', -282 verbose headers age: '4621', -282 verbose headers 'cache-control': 'public, max-age=300', -282 verbose headers etag: 'W/"c223fda42dcf547145c5fcea3c32c5da"', -282 verbose headers 'last-modified': 'Mon, 30 Sep 2019 10:49:43 GMT', -282 verbose headers vary: 'accept-encoding, accept', -282 verbose headers 'cf-cache-status': 'HIT', -282 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -282 verbose headers server: 'cloudflare', -282 verbose headers 'content-encoding': 'gzip', -282 verbose headers 'cf-request-id': '02ddd0191b0000648bda3f1200000001' } -283 silly get cb [ 200, -283 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -283 silly get 'content-type': 'application/json', -283 silly get 'transfer-encoding': 'chunked', -283 silly get connection: 'keep-alive', -283 silly get 'set-cookie': -283 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -283 silly get 'cf-ray': '59764fa1cf14648b-FRA', -283 silly get age: '4621', -283 silly get 'cache-control': 'public, max-age=300', -283 silly get etag: 'W/"c223fda42dcf547145c5fcea3c32c5da"', -283 silly get 'last-modified': 'Mon, 30 Sep 2019 10:49:43 GMT', -283 silly get vary: 'accept-encoding, accept', -283 silly get 'cf-cache-status': 'HIT', -283 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -283 silly get server: 'cloudflare', -283 silly get 'content-encoding': 'gzip', -283 silly get 'cf-request-id': '02ddd0191b0000648bda3f1200000001' } ] -284 verbose get saving image-size to /home/christine/.npm/registry.npmjs.org/image-size/.cache.json -285 silly resolveWithNewModule promise@7.3.1 checking installable status -286 silly cache add args [ 'promise@^7.1.1', null ] -287 verbose cache add spec promise@^7.1.1 -288 silly cache add parsed spec Result { -288 silly cache add raw: 'promise@^7.1.1', -288 silly cache add scope: null, -288 silly cache add name: 'promise', -288 silly cache add rawSpec: '^7.1.1', -288 silly cache add spec: '>=7.1.1 <8.0.0', -288 silly cache add type: 'range' } -289 silly addNamed promise@>=7.1.1 <8.0.0 -290 verbose addNamed ">=7.1.1 <8.0.0" is a valid semver range for promise -291 silly addNameRange { name: 'promise', range: '>=7.1.1 <8.0.0', hasData: false } -292 silly mapToRegistry name promise -293 silly mapToRegistry using default registry -294 silly mapToRegistry registry https://registry.npmjs.org/ -295 silly mapToRegistry uri https://registry.npmjs.org/promise -296 verbose addNameRange registry:https://registry.npmjs.org/promise not in flight; fetching -297 info retry fetch attempt 1 at 13:48:57 -298 info attempt registry request try #1 at 13:48:57 -299 http fetch GET https://registry.npmjs.org/mime/-/mime-1.6.0.tgz -300 silly resolveWithNewModule tslib@1.13.0 checking installable status -301 silly cache add args [ 'tslib@^1.10.0', null ] -302 verbose cache add spec tslib@^1.10.0 -303 silly cache add parsed spec Result { -303 silly cache add raw: 'tslib@^1.10.0', -303 silly cache add scope: null, -303 silly cache add name: 'tslib', -303 silly cache add rawSpec: '^1.10.0', -303 silly cache add spec: '>=1.10.0 <2.0.0', -303 silly cache add type: 'range' } -304 silly addNamed tslib@>=1.10.0 <2.0.0 -305 verbose addNamed ">=1.10.0 <2.0.0" is a valid semver range for tslib -306 silly addNameRange { name: 'tslib', range: '>=1.10.0 <2.0.0', hasData: false } -307 silly mapToRegistry name tslib -308 silly mapToRegistry using default registry -309 silly mapToRegistry registry https://registry.npmjs.org/ -310 silly mapToRegistry uri https://registry.npmjs.org/tslib -311 verbose addNameRange registry:https://registry.npmjs.org/tslib not in flight; fetching -312 verbose afterAdd /home/christine/.npm/clone/2.1.2/package/package.json written -313 verbose get https://registry.npmjs.org/graceful-fs not expired, no request -314 silly addNameRange number 2 { name: 'graceful-fs', range: '>=4.1.2 <5.0.0', hasData: true } -315 silly addNameRange versions [ 'graceful-fs', -315 silly addNameRange [ '1.0.0', -315 silly addNameRange '1.0.1', -315 silly addNameRange '1.0.2', -315 silly addNameRange '1.1.0', -315 silly addNameRange '1.1.1', -315 silly addNameRange '1.1.2', -315 silly addNameRange '1.1.3', -315 silly addNameRange '1.1.4', -315 silly addNameRange '1.1.5', -315 silly addNameRange '1.1.6', -315 silly addNameRange '1.1.7', -315 silly addNameRange '1.1.8', -315 silly addNameRange '1.1.9', -315 silly addNameRange '1.1.10', -315 silly addNameRange '1.1.11', -315 silly addNameRange '1.1.12', -315 silly addNameRange '1.1.13', -315 silly addNameRange '1.1.14', -315 silly addNameRange '1.2.0', -315 silly addNameRange '1.2.1', -315 silly addNameRange '1.2.2', -315 silly addNameRange '1.2.3', -315 silly addNameRange '2.0.0', -315 silly addNameRange '2.0.1', -315 silly addNameRange '2.0.2', -315 silly addNameRange '2.0.3', -315 silly addNameRange '3.0.0', -315 silly addNameRange '3.0.1', -315 silly addNameRange '3.0.2', -315 silly addNameRange '3.0.3', -315 silly addNameRange '3.0.4', -315 silly addNameRange '3.0.5', -315 silly addNameRange '3.0.6', -315 silly addNameRange '3.0.7', -315 silly addNameRange '3.0.8', -315 silly addNameRange '4.1.0', -315 silly addNameRange '4.1.1', -315 silly addNameRange '4.1.2', -315 silly addNameRange '4.1.3', -315 silly addNameRange '4.1.4', -315 silly addNameRange '4.1.5', -315 silly addNameRange '3.0.9', -315 silly addNameRange '4.1.6', -315 silly addNameRange '3.0.10', -315 silly addNameRange '3.0.11', -315 silly addNameRange '4.1.7', -315 silly addNameRange '4.1.8', -315 silly addNameRange '4.1.9', -315 silly addNameRange '4.1.10', -315 silly addNameRange '4.1.11', -315 silly addNameRange '4.1.12', -315 silly addNameRange '4.1.13', -315 silly addNameRange '4.1.14', -315 silly addNameRange '4.1.15', -315 silly addNameRange '4.2.0', -315 silly addNameRange '4.2.1', -315 silly addNameRange '3.0.12', -315 silly addNameRange '4.2.2', -315 silly addNameRange '4.2.3', -315 silly addNameRange '4.2.4' ] ] -316 silly addNamed graceful-fs@4.2.4 -317 verbose addNamed "4.2.4" is a plain semver version for graceful-fs -318 silly cache afterAdd errno@0.1.7 -319 verbose afterAdd /home/christine/.npm/errno/0.1.7/package/package.json not in flight; writing -320 silly mapToRegistry name graceful-fs -321 silly mapToRegistry using default registry -322 silly mapToRegistry registry https://registry.npmjs.org/ -323 silly mapToRegistry uri https://registry.npmjs.org/graceful-fs -324 verbose addRemoteTarball https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz not in flight; adding -325 verbose addRemoteTarball [ 'https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz', -325 verbose addRemoteTarball '2256bde14d3632958c465ebc96dc467ca07a29fb' ] -326 verbose get https://registry.npmjs.org/promise not expired, no request -327 silly addNameRange number 2 { name: 'promise', range: '>=7.1.1 <8.0.0', hasData: true } -328 silly addNameRange versions [ 'promise', -328 silly addNameRange [ '1.2.1', -328 silly addNameRange '1.2.2', -328 silly addNameRange '1.3.0', -328 silly addNameRange '2.0.0', -328 silly addNameRange '3.0.0', -328 silly addNameRange '3.0.1', -328 silly addNameRange '3.1.0', -328 silly addNameRange '3.2.0', -328 silly addNameRange '4.0.0', -328 silly addNameRange '5.0.0', -328 silly addNameRange '6.0.0', -328 silly addNameRange '6.0.1', -328 silly addNameRange '6.1.0', -328 silly addNameRange '7.0.0', -328 silly addNameRange '7.0.1', -328 silly addNameRange '7.0.2', -328 silly addNameRange '7.0.3', -328 silly addNameRange '7.0.4', -328 silly addNameRange '7.1.0', -328 silly addNameRange '7.1.1', -328 silly addNameRange '7.2.0', -328 silly addNameRange '7.3.0', -328 silly addNameRange '7.3.1', -328 silly addNameRange '8.0.0', -328 silly addNameRange '8.0.1', -328 silly addNameRange '8.0.2', -328 silly addNameRange '8.0.3', -328 silly addNameRange '8.1.0' ] ] -329 silly addNamed promise@7.3.1 -330 verbose addNamed "7.3.1" is a plain semver version for promise -331 verbose get https://registry.npmjs.org/tslib not expired, no request -332 silly addNameRange number 2 { name: 'tslib', range: '>=1.10.0 <2.0.0', hasData: true } -333 silly addNameRange versions [ 'tslib', -333 silly addNameRange [ '0.0.1-security', -333 silly addNameRange '1.0.0', -333 silly addNameRange '1.1.0', -333 silly addNameRange '1.2.0', -333 silly addNameRange '1.3.0', -333 silly addNameRange '1.4.0', -333 silly addNameRange '1.5.0', -333 silly addNameRange '1.6.0', -333 silly addNameRange '1.6.1', -333 silly addNameRange '1.7.0', -333 silly addNameRange '1.7.1', -333 silly addNameRange '1.8.0', -333 silly addNameRange '1.8.1', -333 silly addNameRange '1.9.0', -333 silly addNameRange '1.9.1', -333 silly addNameRange '1.9.2', -333 silly addNameRange '1.9.3', -333 silly addNameRange '1.10.0', -333 silly addNameRange '1.11.0', -333 silly addNameRange '1.11.1', -333 silly addNameRange '1.11.2', -333 silly addNameRange '1.12.0', -333 silly addNameRange '1.13.0', -333 silly addNameRange '2.0.0' ] ] -334 silly addNamed tslib@1.13.0 -335 verbose addNamed "1.13.0" is a plain semver version for tslib -336 silly mapToRegistry name promise -337 silly mapToRegistry using default registry -338 silly mapToRegistry registry https://registry.npmjs.org/ -339 silly mapToRegistry uri https://registry.npmjs.org/promise -340 verbose addRemoteTarball https://registry.npmjs.org/promise/-/promise-7.3.1.tgz not in flight; adding -341 verbose addRemoteTarball [ 'https://registry.npmjs.org/promise/-/promise-7.3.1.tgz', -341 verbose addRemoteTarball '064b72602b18f90f29192b8b1bc418ffd1ebd3bf' ] -342 silly resolveWithNewModule mkdirp@0.5.5 checking installable status -343 silly cache add args [ 'mkdirp@^0.5.0', null ] -344 verbose cache add spec mkdirp@^0.5.0 -345 silly cache add parsed spec Result { -345 silly cache add raw: 'mkdirp@^0.5.0', -345 silly cache add scope: null, -345 silly cache add name: 'mkdirp', -345 silly cache add rawSpec: '^0.5.0', -345 silly cache add spec: '>=0.5.0 <0.6.0', -345 silly cache add type: 'range' } -346 silly addNamed mkdirp@>=0.5.0 <0.6.0 -347 verbose addNamed ">=0.5.0 <0.6.0" is a valid semver range for mkdirp -348 silly addNameRange { name: 'mkdirp', range: '>=0.5.0 <0.6.0', hasData: false } -349 silly mapToRegistry name mkdirp -350 silly mapToRegistry using default registry -351 silly mapToRegistry registry https://registry.npmjs.org/ -352 silly mapToRegistry uri https://registry.npmjs.org/mkdirp -353 verbose addNameRange registry:https://registry.npmjs.org/mkdirp not in flight; fetching -354 silly mapToRegistry name tslib -355 silly mapToRegistry using default registry -356 silly mapToRegistry registry https://registry.npmjs.org/ -357 silly mapToRegistry uri https://registry.npmjs.org/tslib -358 verbose addRemoteTarball https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz not in flight; adding -359 verbose addRemoteTarball [ 'https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz', -359 verbose addRemoteTarball 'c881e13cc7015894ed914862d276436fa9a47043' ] -360 info retry fetch attempt 1 at 13:48:57 -361 info attempt registry request try #1 at 13:48:57 -362 http fetch GET https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz -363 info retry fetch attempt 1 at 13:48:57 -364 info attempt registry request try #1 at 13:48:57 -365 http fetch GET https://registry.npmjs.org/promise/-/promise-7.3.1.tgz -366 http 200 https://registry.npmjs.org/source-map -367 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -367 verbose headers 'content-type': 'application/json', -367 verbose headers 'transfer-encoding': 'chunked', -367 verbose headers connection: 'keep-alive', -367 verbose headers 'set-cookie': -367 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -367 verbose headers 'cf-ray': '59764fa1f8a405fd-FRA', -367 verbose headers age: '5629', -367 verbose headers 'cache-control': 'public, max-age=300', -367 verbose headers etag: 'W/"ed6422e25077febab77501a786cb4bdd"', -367 verbose headers 'last-modified': 'Thu, 07 May 2020 17:23:05 GMT', -367 verbose headers vary: 'accept-encoding, accept', -367 verbose headers 'cf-cache-status': 'HIT', -367 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -367 verbose headers server: 'cloudflare', -367 verbose headers 'content-encoding': 'gzip', -367 verbose headers 'cf-request-id': '02ddd0193d000005fd8da0d200000001' } -368 silly get cb [ 200, -368 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -368 silly get 'content-type': 'application/json', -368 silly get 'transfer-encoding': 'chunked', -368 silly get connection: 'keep-alive', -368 silly get 'set-cookie': -368 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -368 silly get 'cf-ray': '59764fa1f8a405fd-FRA', -368 silly get age: '5629', -368 silly get 'cache-control': 'public, max-age=300', -368 silly get etag: 'W/"ed6422e25077febab77501a786cb4bdd"', -368 silly get 'last-modified': 'Thu, 07 May 2020 17:23:05 GMT', -368 silly get vary: 'accept-encoding, accept', -368 silly get 'cf-cache-status': 'HIT', -368 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -368 silly get server: 'cloudflare', -368 silly get 'content-encoding': 'gzip', -368 silly get 'cf-request-id': '02ddd0193d000005fd8da0d200000001' } ] -369 verbose get saving source-map to /home/christine/.npm/registry.npmjs.org/source-map/.cache.json -370 silly resolveWithNewModule image-size@0.5.5 checking installable status -371 silly cache add args [ 'image-size@~0.5.0', null ] -372 verbose cache add spec image-size@~0.5.0 -373 silly cache add parsed spec Result { -373 silly cache add raw: 'image-size@~0.5.0', -373 silly cache add scope: null, -373 silly cache add name: 'image-size', -373 silly cache add rawSpec: '~0.5.0', -373 silly cache add spec: '>=0.5.0 <0.6.0', -373 silly cache add type: 'range' } -374 silly addNamed image-size@>=0.5.0 <0.6.0 -375 verbose addNamed ">=0.5.0 <0.6.0" is a valid semver range for image-size -376 silly addNameRange { name: 'image-size', range: '>=0.5.0 <0.6.0', hasData: false } -377 silly mapToRegistry name image-size -378 silly mapToRegistry using default registry -379 silly mapToRegistry registry https://registry.npmjs.org/ -380 silly mapToRegistry uri https://registry.npmjs.org/image-size -381 verbose addNameRange registry:https://registry.npmjs.org/image-size not in flight; fetching -382 info retry fetch attempt 1 at 13:48:57 -383 info attempt registry request try #1 at 13:48:57 -384 http fetch GET https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz -385 verbose afterAdd /home/christine/.npm/errno/0.1.7/package/package.json written -386 verbose get https://registry.npmjs.org/mkdirp not expired, no request -387 silly addNameRange number 2 { name: 'mkdirp', range: '>=0.5.0 <0.6.0', hasData: true } -388 silly addNameRange versions [ 'mkdirp', -388 silly addNameRange [ '0.0.1', -388 silly addNameRange '0.0.2', -388 silly addNameRange '0.0.3', -388 silly addNameRange '0.0.4', -388 silly addNameRange '0.0.5', -388 silly addNameRange '0.0.6', -388 silly addNameRange '0.0.7', -388 silly addNameRange '0.1.0', -388 silly addNameRange '0.2.0', -388 silly addNameRange '0.2.1', -388 silly addNameRange '0.2.2', -388 silly addNameRange '0.3.0', -388 silly addNameRange '0.3.1', -388 silly addNameRange '0.3.2', -388 silly addNameRange '0.3.3', -388 silly addNameRange '0.3.4', -388 silly addNameRange '0.3.5', -388 silly addNameRange '0.4.0', -388 silly addNameRange '0.4.1', -388 silly addNameRange '0.4.2', -388 silly addNameRange '0.5.0', -388 silly addNameRange '0.5.1', -388 silly addNameRange '1.0.0', -388 silly addNameRange '1.0.1', -388 silly addNameRange '1.0.2', -388 silly addNameRange '1.0.3', -388 silly addNameRange '0.5.2', -388 silly addNameRange '0.5.3', -388 silly addNameRange '0.5.4', -388 silly addNameRange '1.0.4', -388 silly addNameRange '0.5.5' ] ] -389 silly addNamed mkdirp@0.5.5 -390 verbose addNamed "0.5.5" is a plain semver version for mkdirp -391 silly mapToRegistry name mkdirp -392 silly mapToRegistry using default registry -393 silly mapToRegistry registry https://registry.npmjs.org/ -394 silly mapToRegistry uri https://registry.npmjs.org/mkdirp -395 verbose addRemoteTarball https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz not in flight; adding -396 verbose addRemoteTarball [ 'https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz', -396 verbose addRemoteTarball 'd91cefd62d1436ca0f41620e251288d420099def' ] -397 verbose get https://registry.npmjs.org/image-size not expired, no request -398 silly addNameRange number 2 { name: 'image-size', range: '>=0.5.0 <0.6.0', hasData: true } -399 silly addNameRange versions [ 'image-size', -399 silly addNameRange [ '0.0.2', -399 silly addNameRange '0.0.3', -399 silly addNameRange '0.0.5', -399 silly addNameRange '0.1.0', -399 silly addNameRange '0.1.1', -399 silly addNameRange '0.1.2', -399 silly addNameRange '0.1.3', -399 silly addNameRange '0.1.4', -399 silly addNameRange '0.1.5', -399 silly addNameRange '0.1.6', -399 silly addNameRange '0.1.7', -399 silly addNameRange '0.1.10', -399 silly addNameRange '0.1.15', -399 silly addNameRange '0.0.16', -399 silly addNameRange '0.1.16', -399 silly addNameRange '0.1.17', -399 silly addNameRange '0.1.20', -399 silly addNameRange '0.2.1', -399 silly addNameRange '0.2.2', -399 silly addNameRange '0.2.3', -399 silly addNameRange '0.2.4', -399 silly addNameRange '0.2.5', -399 silly addNameRange '0.3.0', -399 silly addNameRange '0.3.1', -399 silly addNameRange '0.3.2', -399 silly addNameRange '0.3.3', -399 silly addNameRange '0.3.5', -399 silly addNameRange '0.4.0', -399 silly addNameRange '0.5.0', -399 silly addNameRange '0.5.1', -399 silly addNameRange '0.5.2', -399 silly addNameRange '0.5.3', -399 silly addNameRange '0.5.4', -399 silly addNameRange '0.5.5', -399 silly addNameRange '0.6.0', -399 silly addNameRange '0.6.1', -399 silly addNameRange '0.6.2', -399 silly addNameRange '0.6.3', -399 silly addNameRange '0.7.0', -399 silly addNameRange '0.7.1', -399 silly addNameRange '0.7.2', -399 silly addNameRange '0.7.3', -399 silly addNameRange '0.7.4', -399 silly addNameRange '0.7.5', -399 silly addNameRange '0.8.0', -399 silly addNameRange '0.8.1', -399 silly addNameRange '0.8.2', -399 silly addNameRange '0.8.3' ] ] -400 silly addNamed image-size@0.5.5 -401 verbose addNamed "0.5.5" is a plain semver version for image-size -402 silly mapToRegistry name image-size -403 silly mapToRegistry using default registry -404 silly mapToRegistry registry https://registry.npmjs.org/ -405 silly mapToRegistry uri https://registry.npmjs.org/image-size -406 verbose addRemoteTarball https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz not in flight; adding -407 verbose addRemoteTarball [ 'https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz', -407 verbose addRemoteTarball '09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c' ] -408 http fetch 200 https://registry.npmjs.org/mime/-/mime-1.6.0.tgz -409 info retry fetch attempt 1 at 13:48:57 -410 info attempt registry request try #1 at 13:48:57 -411 http fetch GET https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz -412 http 200 https://registry.npmjs.org/request -413 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -413 verbose headers 'content-type': 'application/json', -413 verbose headers 'transfer-encoding': 'chunked', -413 verbose headers connection: 'keep-alive', -413 verbose headers 'set-cookie': -413 verbose headers [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -413 verbose headers 'cf-ray': '59764fa1dc0ec272-FRA', -413 verbose headers age: '5668', -413 verbose headers 'cache-control': 'public, max-age=300', -413 verbose headers etag: 'W/"f6a50554348a0710692c70f1bd6574ab"', -413 verbose headers 'last-modified': 'Mon, 11 May 2020 15:19:07 GMT', -413 verbose headers vary: 'accept-encoding, accept', -413 verbose headers 'cf-cache-status': 'HIT', -413 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -413 verbose headers server: 'cloudflare', -413 verbose headers 'content-encoding': 'gzip', -413 verbose headers 'cf-request-id': '02ddd0192b0000c27238899200000001' } -414 silly get cb [ 200, -414 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -414 silly get 'content-type': 'application/json', -414 silly get 'transfer-encoding': 'chunked', -414 silly get connection: 'keep-alive', -414 silly get 'set-cookie': -414 silly get [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -414 silly get 'cf-ray': '59764fa1dc0ec272-FRA', -414 silly get age: '5668', -414 silly get 'cache-control': 'public, max-age=300', -414 silly get etag: 'W/"f6a50554348a0710692c70f1bd6574ab"', -414 silly get 'last-modified': 'Mon, 11 May 2020 15:19:07 GMT', -414 silly get vary: 'accept-encoding, accept', -414 silly get 'cf-cache-status': 'HIT', -414 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -414 silly get server: 'cloudflare', -414 silly get 'content-encoding': 'gzip', -414 silly get 'cf-request-id': '02ddd0192b0000c27238899200000001' } ] -415 verbose get saving request to /home/christine/.npm/registry.npmjs.org/request/.cache.json -416 silly resolveWithNewModule source-map@0.6.1 checking installable status -417 silly cache add args [ 'source-map@~0.6.0', null ] -418 verbose cache add spec source-map@~0.6.0 -419 silly cache add parsed spec Result { -419 silly cache add raw: 'source-map@~0.6.0', -419 silly cache add scope: null, -419 silly cache add name: 'source-map', -419 silly cache add rawSpec: '~0.6.0', -419 silly cache add spec: '>=0.6.0 <0.7.0', -419 silly cache add type: 'range' } -420 silly addNamed source-map@>=0.6.0 <0.7.0 -421 verbose addNamed ">=0.6.0 <0.7.0" is a valid semver range for source-map -422 silly addNameRange { name: 'source-map', range: '>=0.6.0 <0.7.0', hasData: false } -423 silly mapToRegistry name source-map -424 silly mapToRegistry using default registry -425 silly mapToRegistry registry https://registry.npmjs.org/ -426 silly mapToRegistry uri https://registry.npmjs.org/source-map -427 verbose addNameRange registry:https://registry.npmjs.org/source-map not in flight; fetching -428 info retry fetch attempt 1 at 13:48:57 -429 info attempt registry request try #1 at 13:48:57 -430 http fetch GET https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz -431 silly fetchAndShaCheck shasum 32cd9e5c64553bd58d19a568af452acff04981b1 -432 http fetch 200 https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz -433 http fetch 200 https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz -434 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime/-/mime-1.6.0.tgz not in flight; adding -435 verbose addTmpTarball already have metadata; skipping unpack for mime@1.6.0 -436 verbose get https://registry.npmjs.org/source-map not expired, no request -437 silly addNameRange number 2 { name: 'source-map', range: '>=0.6.0 <0.7.0', hasData: true } -438 silly addNameRange versions [ 'source-map', -438 silly addNameRange [ '0.0.0', -438 silly addNameRange '0.1.0', -438 silly addNameRange '0.1.1', -438 silly addNameRange '0.1.2', -438 silly addNameRange '0.1.3', -438 silly addNameRange '0.1.4', -438 silly addNameRange '0.1.5', -438 silly addNameRange '0.1.6', -438 silly addNameRange '0.1.7', -438 silly addNameRange '0.1.8', -438 silly addNameRange '0.1.9', -438 silly addNameRange '0.1.10', -438 silly addNameRange '0.1.11', -438 silly addNameRange '0.1.12', -438 silly addNameRange '0.1.13', -438 silly addNameRange '0.1.14', -438 silly addNameRange '0.1.15', -438 silly addNameRange '0.1.16', -438 silly addNameRange '0.1.17', -438 silly addNameRange '0.1.18', -438 silly addNameRange '0.1.19', -438 silly addNameRange '0.1.20', -438 silly addNameRange '0.1.21', -438 silly addNameRange '0.1.22', -438 silly addNameRange '0.1.23', -438 silly addNameRange '0.1.24', -438 silly addNameRange '0.1.25', -438 silly addNameRange '0.1.26', -438 silly addNameRange '0.1.27', -438 silly addNameRange '0.1.28', -438 silly addNameRange '0.1.29', -438 silly addNameRange '0.1.30', -438 silly addNameRange '0.1.31', -438 silly addNameRange '0.1.32', -438 silly addNameRange '0.1.33', -438 silly addNameRange '0.1.34', -438 silly addNameRange '0.1.35', -438 silly addNameRange '0.1.36', -438 silly addNameRange '0.1.37', -438 silly addNameRange '0.1.38', -438 silly addNameRange '0.1.39', -438 silly addNameRange '0.1.40', -438 silly addNameRange '0.1.41', -438 silly addNameRange '0.1.42', -438 silly addNameRange '0.1.43', -438 silly addNameRange '0.2.0', -438 silly addNameRange '0.3.0', -438 silly addNameRange '0.4.0', -438 silly addNameRange '0.4.1', -438 silly addNameRange '0.4.2', -438 silly addNameRange '0.4.3', -438 silly addNameRange '0.4.4', -438 silly addNameRange '0.5.0', -438 silly addNameRange '0.5.1', -438 silly addNameRange '0.5.2', -438 silly addNameRange '0.5.3', -438 silly addNameRange '0.5.4', -438 silly addNameRange '0.5.5', -438 silly addNameRange '0.5.6', -438 silly addNameRange '0.5.7', -438 silly addNameRange '0.6.0', -438 silly addNameRange '0.6.1', -438 silly addNameRange '0.7.0', -438 silly addNameRange '0.7.1', -438 silly addNameRange '0.7.2', -438 silly addNameRange '0.7.3', -438 silly addNameRange '0.8.0-beta.0' ] ] -439 silly addNamed source-map@0.6.1 -440 verbose addNamed "0.6.1" is a plain semver version for source-map -441 silly fetchAndShaCheck shasum 2256bde14d3632958c465ebc96dc467ca07a29fb -442 silly fetchAndShaCheck shasum c881e13cc7015894ed914862d276436fa9a47043 -443 silly resolveWithNewModule request@2.88.2 checking installable status -444 silly cache add args [ 'request@^2.83.0', null ] -445 verbose cache add spec request@^2.83.0 -446 silly cache add parsed spec Result { -446 silly cache add raw: 'request@^2.83.0', -446 silly cache add scope: null, -446 silly cache add name: 'request', -446 silly cache add rawSpec: '^2.83.0', -446 silly cache add spec: '>=2.83.0 <3.0.0', -446 silly cache add type: 'range' } -447 silly addNamed request@>=2.83.0 <3.0.0 -448 verbose addNamed ">=2.83.0 <3.0.0" is a valid semver range for request -449 silly addNameRange { name: 'request', range: '>=2.83.0 <3.0.0', hasData: false } -450 silly mapToRegistry name request -451 silly mapToRegistry using default registry -452 silly mapToRegistry registry https://registry.npmjs.org/ -453 silly mapToRegistry uri https://registry.npmjs.org/request -454 verbose addNameRange registry:https://registry.npmjs.org/request not in flight; fetching -455 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz not in flight; adding -456 verbose addTmpTarball already have metadata; skipping unpack for graceful-fs@4.2.4 -457 http fetch 200 https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz -458 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/tslib/-/tslib-1.13.0.tgz not in flight; adding -459 verbose addTmpTarball already have metadata; skipping unpack for tslib@1.13.0 -460 verbose get https://registry.npmjs.org/request not expired, no request -461 silly addNameRange number 2 { name: 'request', range: '>=2.83.0 <3.0.0', hasData: true } -462 silly addNameRange versions [ 'request', -462 silly addNameRange [ '0.10.0', -462 silly addNameRange '0.8.3', -462 silly addNameRange '0.9.0', -462 silly addNameRange '0.9.1', -462 silly addNameRange '0.9.5', -462 silly addNameRange '1.0.0', -462 silly addNameRange '1.1.0', -462 silly addNameRange '1.1.1', -462 silly addNameRange '1.2.0', -462 silly addNameRange '1.9.0', -462 silly addNameRange '1.9.1', -462 silly addNameRange '1.9.2', -462 silly addNameRange '1.9.3', -462 silly addNameRange '1.9.5', -462 silly addNameRange '1.9.7', -462 silly addNameRange '1.9.8', -462 silly addNameRange '1.9.9', -462 silly addNameRange '2.0.0', -462 silly addNameRange '2.0.1', -462 silly addNameRange '2.0.2', -462 silly addNameRange '2.0.3', -462 silly addNameRange '2.0.4', -462 silly addNameRange '2.0.5', -462 silly addNameRange '2.1.0', -462 silly addNameRange '2.1.1', -462 silly addNameRange '2.2.0', -462 silly addNameRange '2.2.5', -462 silly addNameRange '2.2.6', -462 silly addNameRange '2.2.9', -462 silly addNameRange '2.9.0', -462 silly addNameRange '2.9.1', -462 silly addNameRange '2.9.2', -462 silly addNameRange '2.9.3', -462 silly addNameRange '2.9.100', -462 silly addNameRange '2.9.150', -462 silly addNameRange '2.9.151', -462 silly addNameRange '2.9.152', -462 silly addNameRange '2.9.153', -462 silly addNameRange '2.9.200', -462 silly addNameRange '2.9.201', -462 silly addNameRange '2.9.202', -462 silly addNameRange '2.9.203', -462 silly addNameRange '2.10.0', -462 silly addNameRange '2.11.0', -462 silly addNameRange '2.11.1', -462 silly addNameRange '2.11.2', -462 silly addNameRange '2.11.3', -462 silly addNameRange '2.11.4', -462 silly addNameRange '2.12.0', -462 silly addNameRange '2.14.0', -462 silly addNameRange '2.16.0', -462 silly addNameRange '2.16.2', -462 silly addNameRange '2.16.4', -462 silly addNameRange '2.16.6', -462 silly addNameRange '2.18.0', -462 silly addNameRange '2.19.0', -462 silly addNameRange '2.20.0', -462 silly addNameRange '2.21.0', -462 silly addNameRange '2.22.0', -462 silly addNameRange '2.23.0', -462 silly addNameRange '2.24.0', -462 silly addNameRange '2.25.0', -462 silly addNameRange '2.26.0', -462 silly addNameRange '2.27.0', -462 silly addNameRange '2.28.0', -462 silly addNameRange '2.29.0', -462 silly addNameRange '2.30.0', -462 silly addNameRange '2.31.0', -462 silly addNameRange '2.32.0', -462 silly addNameRange '2.33.0', -462 silly addNameRange '2.34.0', -462 silly addNameRange '2.35.0', -462 silly addNameRange '2.36.0', -462 silly addNameRange '2.37.0', -462 silly addNameRange '2.38.0', -462 silly addNameRange '2.39.0', -462 silly addNameRange '2.40.0', -462 silly addNameRange '2.41.0', -462 silly addNameRange '2.42.0', -462 silly addNameRange '2.43.0', -462 silly addNameRange '2.44.0', -462 silly addNameRange '2.45.0', -462 silly addNameRange '2.46.0', -462 silly addNameRange '2.47.0', -462 silly addNameRange '2.48.0', -462 silly addNameRange '2.49.0', -462 silly addNameRange '2.50.0', -462 silly addNameRange '2.51.0', -462 silly addNameRange '2.52.0', -462 silly addNameRange '2.53.0', -462 silly addNameRange '2.54.0', -462 silly addNameRange '2.55.0', -462 silly addNameRange '2.56.0', -462 silly addNameRange '2.57.0', -462 silly addNameRange '2.58.0', -462 silly addNameRange '2.59.0', -462 silly addNameRange '2.60.0', -462 silly addNameRange '2.61.0', -462 silly addNameRange '2.62.0', -462 silly addNameRange '2.63.0', -462 silly addNameRange ... 26 more items ] ] -463 silly addNamed request@2.88.2 -464 verbose addNamed "2.88.2" is a plain semver version for request -465 warn deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 -466 silly fetchAndShaCheck shasum d91cefd62d1436ca0f41620e251288d420099def -467 silly cache afterAdd source-map@0.6.1 -468 verbose afterAdd /home/christine/.npm/source-map/0.6.1/package/package.json not in flight; writing -469 silly mapToRegistry name request -470 silly mapToRegistry using default registry -471 silly mapToRegistry registry https://registry.npmjs.org/ -472 silly mapToRegistry uri https://registry.npmjs.org/request -473 verbose addRemoteTarball https://registry.npmjs.org/request/-/request-2.88.2.tgz not in flight; adding -474 verbose addRemoteTarball [ 'https://registry.npmjs.org/request/-/request-2.88.2.tgz', -474 verbose addRemoteTarball 'd73c918731cb5a87da047e207234146f664d12b3' ] -475 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz not in flight; adding -476 verbose addTmpTarball already have metadata; skipping unpack for mkdirp@0.5.5 -477 info retry fetch attempt 1 at 13:48:57 -478 info attempt registry request try #1 at 13:48:57 -479 http fetch GET https://registry.npmjs.org/request/-/request-2.88.2.tgz -480 verbose afterAdd /home/christine/.npm/source-map/0.6.1/package/package.json written -481 silly cache afterAdd graceful-fs@4.2.4 -482 verbose afterAdd /home/christine/.npm/graceful-fs/4.2.4/package/package.json not in flight; writing -483 silly cache afterAdd tslib@1.13.0 -484 verbose afterAdd /home/christine/.npm/tslib/1.13.0/package/package.json not in flight; writing -485 silly cache afterAdd mime@1.6.0 -486 verbose afterAdd /home/christine/.npm/mime/1.6.0/package/package.json not in flight; writing -487 verbose afterAdd /home/christine/.npm/graceful-fs/4.2.4/package/package.json written -488 verbose afterAdd /home/christine/.npm/tslib/1.13.0/package/package.json written -489 verbose afterAdd /home/christine/.npm/mime/1.6.0/package/package.json written -490 silly cache afterAdd mkdirp@0.5.5 -491 verbose afterAdd /home/christine/.npm/mkdirp/0.5.5/package/package.json not in flight; writing -492 verbose afterAdd /home/christine/.npm/mkdirp/0.5.5/package/package.json written -493 http fetch 200 https://registry.npmjs.org/promise/-/promise-7.3.1.tgz -494 silly fetchAndShaCheck shasum 064b72602b18f90f29192b8b1bc418ffd1ebd3bf -495 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/promise/-/promise-7.3.1.tgz not in flight; adding -496 verbose addTmpTarball already have metadata; skipping unpack for promise@7.3.1 -497 silly cache afterAdd promise@7.3.1 -498 verbose afterAdd /home/christine/.npm/promise/7.3.1/package/package.json not in flight; writing -499 verbose afterAdd /home/christine/.npm/promise/7.3.1/package/package.json written -500 http fetch 200 https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz -501 silly fetchAndShaCheck shasum 09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c -502 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/image-size/-/image-size-0.5.5.tgz not in flight; adding -503 verbose addTmpTarball already have metadata; skipping unpack for image-size@0.5.5 -504 http fetch 200 https://registry.npmjs.org/request/-/request-2.88.2.tgz -505 silly cache afterAdd image-size@0.5.5 -506 verbose afterAdd /home/christine/.npm/image-size/0.5.5/package/package.json not in flight; writing -507 verbose afterAdd /home/christine/.npm/image-size/0.5.5/package/package.json written -508 silly fetchAndShaCheck shasum d73c918731cb5a87da047e207234146f664d12b3 -509 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/request/-/request-2.88.2.tgz not in flight; adding -510 verbose addTmpTarball already have metadata; skipping unpack for request@2.88.2 -511 silly cache afterAdd request@2.88.2 -512 verbose afterAdd /home/christine/.npm/request/2.88.2/package/package.json not in flight; writing -513 verbose afterAdd /home/christine/.npm/request/2.88.2/package/package.json written -514 silly fetchNamedPackageData prr -515 silly mapToRegistry name prr -516 silly mapToRegistry using default registry -517 silly mapToRegistry registry https://registry.npmjs.org/ -518 silly mapToRegistry uri https://registry.npmjs.org/prr -519 verbose request uri https://registry.npmjs.org/prr -520 verbose request no auth needed -521 info attempt registry request try #1 at 13:48:57 -522 verbose etag W/"07ebb6c11e7a8b0a67aabb93f8b3aa09" -523 verbose lastModified Sun, 27 May 2018 13:04:47 GMT -524 http request GET https://registry.npmjs.org/prr -525 http 304 https://registry.npmjs.org/prr -526 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -526 verbose headers connection: 'keep-alive', -526 verbose headers 'set-cookie': -526 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -526 verbose headers 'cf-ray': '59764fa31fae648b-FRA', -526 verbose headers age: '5629', -526 verbose headers 'cache-control': 'public, max-age=300', -526 verbose headers etag: '"07ebb6c11e7a8b0a67aabb93f8b3aa09"', -526 verbose headers 'last-modified': 'Sun, 27 May 2018 13:04:47 GMT', -526 verbose headers vary: 'Accept-Encoding', -526 verbose headers 'cf-cache-status': 'HIT', -526 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -526 verbose headers server: 'cloudflare', -526 verbose headers 'cf-request-id': '02ddd019ef0000648bda3f9200000001' } -527 silly get cb [ 304, -527 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -527 silly get connection: 'keep-alive', -527 silly get 'set-cookie': -527 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -527 silly get 'cf-ray': '59764fa31fae648b-FRA', -527 silly get age: '5629', -527 silly get 'cache-control': 'public, max-age=300', -527 silly get etag: '"07ebb6c11e7a8b0a67aabb93f8b3aa09"', -527 silly get 'last-modified': 'Sun, 27 May 2018 13:04:47 GMT', -527 silly get vary: 'Accept-Encoding', -527 silly get 'cf-cache-status': 'HIT', -527 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -527 silly get server: 'cloudflare', -527 silly get 'cf-request-id': '02ddd019ef0000648bda3f9200000001' } ] -528 verbose etag https://registry.npmjs.org/prr from cache -529 verbose get saving prr to /home/christine/.npm/registry.npmjs.org/prr/.cache.json -530 silly resolveWithNewModule prr@1.0.1 checking installable status -531 silly cache add args [ 'prr@~1.0.1', null ] -532 verbose cache add spec prr@~1.0.1 -533 silly cache add parsed spec Result { -533 silly cache add raw: 'prr@~1.0.1', -533 silly cache add scope: null, -533 silly cache add name: 'prr', -533 silly cache add rawSpec: '~1.0.1', -533 silly cache add spec: '>=1.0.1 <1.1.0', -533 silly cache add type: 'range' } -534 silly addNamed prr@>=1.0.1 <1.1.0 -535 verbose addNamed ">=1.0.1 <1.1.0" is a valid semver range for prr -536 silly addNameRange { name: 'prr', range: '>=1.0.1 <1.1.0', hasData: false } -537 silly mapToRegistry name prr -538 silly mapToRegistry using default registry -539 silly mapToRegistry registry https://registry.npmjs.org/ -540 silly mapToRegistry uri https://registry.npmjs.org/prr -541 verbose addNameRange registry:https://registry.npmjs.org/prr not in flight; fetching -542 verbose get https://registry.npmjs.org/prr not expired, no request -543 silly addNameRange number 2 { name: 'prr', range: '>=1.0.1 <1.1.0', hasData: true } -544 silly addNameRange versions [ 'prr', [ '0.0.0', '1.0.0', '1.0.1' ] ] -545 silly addNamed prr@1.0.1 -546 verbose addNamed "1.0.1" is a plain semver version for prr -547 silly cache afterAdd prr@1.0.1 -548 verbose afterAdd /home/christine/.npm/prr/1.0.1/package/package.json not in flight; writing -549 verbose afterAdd /home/christine/.npm/prr/1.0.1/package/package.json written -550 silly fetchNamedPackageData minimist -551 silly mapToRegistry name minimist -552 silly mapToRegistry using default registry -553 silly mapToRegistry registry https://registry.npmjs.org/ -554 silly mapToRegistry uri https://registry.npmjs.org/minimist -555 verbose request uri https://registry.npmjs.org/minimist -556 verbose request no auth needed -557 info attempt registry request try #1 at 13:48:57 -558 verbose etag W/"81c2eaf8bba19c1bd6131ba9e932902f" -559 verbose lastModified Sun, 11 Aug 2019 09:03:19 GMT -560 http request GET https://registry.npmjs.org/minimist -561 http 200 https://registry.npmjs.org/minimist -562 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -562 verbose headers 'content-type': 'application/json', -562 verbose headers 'transfer-encoding': 'chunked', -562 verbose headers connection: 'keep-alive', -562 verbose headers 'set-cookie': -562 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -562 verbose headers 'cf-ray': '59764fa35d5205fd-FRA', -562 verbose headers age: '5653', -562 verbose headers 'cache-control': 'public, max-age=300', -562 verbose headers etag: 'W/"ab6c93df45eeb8867cab5ea4f62b4b74"', -562 verbose headers 'last-modified': 'Thu, 12 Mar 2020 22:16:24 GMT', -562 verbose headers vary: 'accept-encoding, accept', -562 verbose headers 'cf-cache-status': 'HIT', -562 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -562 verbose headers server: 'cloudflare', -562 verbose headers 'content-encoding': 'gzip', -562 verbose headers 'cf-request-id': '02ddd01a16000005fd8da2d200000001' } -563 silly get cb [ 200, -563 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -563 silly get 'content-type': 'application/json', -563 silly get 'transfer-encoding': 'chunked', -563 silly get connection: 'keep-alive', -563 silly get 'set-cookie': -563 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -563 silly get 'cf-ray': '59764fa35d5205fd-FRA', -563 silly get age: '5653', -563 silly get 'cache-control': 'public, max-age=300', -563 silly get etag: 'W/"ab6c93df45eeb8867cab5ea4f62b4b74"', -563 silly get 'last-modified': 'Thu, 12 Mar 2020 22:16:24 GMT', -563 silly get vary: 'accept-encoding, accept', -563 silly get 'cf-cache-status': 'HIT', -563 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -563 silly get server: 'cloudflare', -563 silly get 'content-encoding': 'gzip', -563 silly get 'cf-request-id': '02ddd01a16000005fd8da2d200000001' } ] -564 verbose get saving minimist to /home/christine/.npm/registry.npmjs.org/minimist/.cache.json -565 silly resolveWithNewModule minimist@1.2.5 checking installable status -566 silly cache add args [ 'minimist@^1.2.5', null ] -567 verbose cache add spec minimist@^1.2.5 -568 silly cache add parsed spec Result { -568 silly cache add raw: 'minimist@^1.2.5', -568 silly cache add scope: null, -568 silly cache add name: 'minimist', -568 silly cache add rawSpec: '^1.2.5', -568 silly cache add spec: '>=1.2.5 <2.0.0', -568 silly cache add type: 'range' } -569 silly addNamed minimist@>=1.2.5 <2.0.0 -570 verbose addNamed ">=1.2.5 <2.0.0" is a valid semver range for minimist -571 silly addNameRange { name: 'minimist', range: '>=1.2.5 <2.0.0', hasData: false } -572 silly mapToRegistry name minimist -573 silly mapToRegistry using default registry -574 silly mapToRegistry registry https://registry.npmjs.org/ -575 silly mapToRegistry uri https://registry.npmjs.org/minimist -576 verbose addNameRange registry:https://registry.npmjs.org/minimist not in flight; fetching -577 verbose get https://registry.npmjs.org/minimist not expired, no request -578 silly addNameRange number 2 { name: 'minimist', range: '>=1.2.5 <2.0.0', hasData: true } -579 silly addNameRange versions [ 'minimist', -579 silly addNameRange [ '0.0.0', -579 silly addNameRange '0.0.1', -579 silly addNameRange '0.0.2', -579 silly addNameRange '0.0.3', -579 silly addNameRange '0.0.4', -579 silly addNameRange '0.0.5', -579 silly addNameRange '0.0.6', -579 silly addNameRange '0.0.7', -579 silly addNameRange '0.0.8', -579 silly addNameRange '0.0.9', -579 silly addNameRange '0.0.10', -579 silly addNameRange '0.1.0', -579 silly addNameRange '0.2.0', -579 silly addNameRange '1.0.0', -579 silly addNameRange '1.1.0', -579 silly addNameRange '1.1.1', -579 silly addNameRange '1.1.2', -579 silly addNameRange '1.1.3', -579 silly addNameRange '1.2.0', -579 silly addNameRange '1.2.1', -579 silly addNameRange '1.2.2', -579 silly addNameRange '1.2.3', -579 silly addNameRange '1.2.4', -579 silly addNameRange '0.2.1', -579 silly addNameRange '1.2.5' ] ] -580 silly addNamed minimist@1.2.5 -581 verbose addNamed "1.2.5" is a plain semver version for minimist -582 silly mapToRegistry name minimist -583 silly mapToRegistry using default registry -584 silly mapToRegistry registry https://registry.npmjs.org/ -585 silly mapToRegistry uri https://registry.npmjs.org/minimist -586 verbose addRemoteTarball https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz not in flight; adding -587 verbose addRemoteTarball [ 'https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz', -587 verbose addRemoteTarball '67d66014b66a6a8aaa0c083c5fd58df4e4e97602' ] -588 info retry fetch attempt 1 at 13:48:57 -589 info attempt registry request try #1 at 13:48:57 -590 http fetch GET https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz -591 http fetch 200 https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz -592 silly fetchAndShaCheck shasum 67d66014b66a6a8aaa0c083c5fd58df4e4e97602 -593 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/minimist/-/minimist-1.2.5.tgz not in flight; adding -594 verbose addTmpTarball already have metadata; skipping unpack for minimist@1.2.5 -595 silly cache afterAdd minimist@1.2.5 -596 verbose afterAdd /home/christine/.npm/minimist/1.2.5/package/package.json not in flight; writing -597 verbose afterAdd /home/christine/.npm/minimist/1.2.5/package/package.json written -598 silly fetchNamedPackageData asap -599 silly mapToRegistry name asap -600 silly mapToRegistry using default registry -601 silly mapToRegistry registry https://registry.npmjs.org/ -602 silly mapToRegistry uri https://registry.npmjs.org/asap -603 verbose request uri https://registry.npmjs.org/asap -604 verbose request no auth needed -605 info attempt registry request try #1 at 13:48:57 -606 http request GET https://registry.npmjs.org/asap -607 http 200 https://registry.npmjs.org/asap -608 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -608 verbose headers 'content-type': 'application/json; charset=UTF-8', -608 verbose headers 'transfer-encoding': 'chunked', -608 verbose headers connection: 'keep-alive', -608 verbose headers 'set-cookie': -608 verbose headers [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -608 verbose headers 'cf-ray': '59764fa3da5bdfc7-FRA', -608 verbose headers age: '5027', -608 verbose headers 'cache-control': 'public, max-age=300', -608 verbose headers etag: 'W/"b9309e9e7d929bcdb698cfa401f3696f"', -608 verbose headers 'last-modified': 'Sat, 26 May 2018 17:25:23 GMT', -608 verbose headers vary: 'accept-encoding, accept', -608 verbose headers 'cf-cache-status': 'HIT', -608 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -608 verbose headers server: 'cloudflare', -608 verbose headers 'content-encoding': 'gzip', -608 verbose headers 'cf-request-id': '02ddd01a6b0000dfc72a89b200000001' } -609 silly get cb [ 200, -609 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -609 silly get 'content-type': 'application/json; charset=UTF-8', -609 silly get 'transfer-encoding': 'chunked', -609 silly get connection: 'keep-alive', -609 silly get 'set-cookie': -609 silly get [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -609 silly get 'cf-ray': '59764fa3da5bdfc7-FRA', -609 silly get age: '5027', -609 silly get 'cache-control': 'public, max-age=300', -609 silly get etag: 'W/"b9309e9e7d929bcdb698cfa401f3696f"', -609 silly get 'last-modified': 'Sat, 26 May 2018 17:25:23 GMT', -609 silly get vary: 'accept-encoding, accept', -609 silly get 'cf-cache-status': 'HIT', -609 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -609 silly get server: 'cloudflare', -609 silly get 'content-encoding': 'gzip', -609 silly get 'cf-request-id': '02ddd01a6b0000dfc72a89b200000001' } ] -610 verbose get saving asap to /home/christine/.npm/registry.npmjs.org/asap/.cache.json -611 silly resolveWithNewModule asap@2.0.6 checking installable status -612 silly cache add args [ 'asap@~2.0.3', null ] -613 verbose cache add spec asap@~2.0.3 -614 silly cache add parsed spec Result { -614 silly cache add raw: 'asap@~2.0.3', -614 silly cache add scope: null, -614 silly cache add name: 'asap', -614 silly cache add rawSpec: '~2.0.3', -614 silly cache add spec: '>=2.0.3 <2.1.0', -614 silly cache add type: 'range' } -615 silly addNamed asap@>=2.0.3 <2.1.0 -616 verbose addNamed ">=2.0.3 <2.1.0" is a valid semver range for asap -617 silly addNameRange { name: 'asap', range: '>=2.0.3 <2.1.0', hasData: false } -618 silly mapToRegistry name asap -619 silly mapToRegistry using default registry -620 silly mapToRegistry registry https://registry.npmjs.org/ -621 silly mapToRegistry uri https://registry.npmjs.org/asap -622 verbose addNameRange registry:https://registry.npmjs.org/asap not in flight; fetching -623 verbose get https://registry.npmjs.org/asap not expired, no request -624 silly addNameRange number 2 { name: 'asap', range: '>=2.0.3 <2.1.0', hasData: true } -625 silly addNameRange versions [ 'asap', -625 silly addNameRange [ '0.0.0', -625 silly addNameRange '1.0.0', -625 silly addNameRange '2.0.0', -625 silly addNameRange '2.0.1', -625 silly addNameRange '2.0.2', -625 silly addNameRange '2.0.3', -625 silly addNameRange '2.0.4', -625 silly addNameRange '2.0.5', -625 silly addNameRange '2.0.6' ] ] -626 silly addNamed asap@2.0.6 -627 verbose addNamed "2.0.6" is a plain semver version for asap -628 silly mapToRegistry name asap -629 silly mapToRegistry using default registry -630 silly mapToRegistry registry https://registry.npmjs.org/ -631 silly mapToRegistry uri https://registry.npmjs.org/asap -632 verbose addRemoteTarball https://registry.npmjs.org/asap/-/asap-2.0.6.tgz not in flight; adding -633 verbose addRemoteTarball [ 'https://registry.npmjs.org/asap/-/asap-2.0.6.tgz', -633 verbose addRemoteTarball 'e50347611d7e690943208bbdafebcbc2fb866d46' ] -634 info retry fetch attempt 1 at 13:48:57 -635 info attempt registry request try #1 at 13:48:57 -636 http fetch GET https://registry.npmjs.org/asap/-/asap-2.0.6.tgz -637 http fetch 200 https://registry.npmjs.org/asap/-/asap-2.0.6.tgz -638 silly fetchAndShaCheck shasum e50347611d7e690943208bbdafebcbc2fb866d46 -639 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/asap/-/asap-2.0.6.tgz not in flight; adding -640 verbose addTmpTarball already have metadata; skipping unpack for asap@2.0.6 -641 silly cache afterAdd asap@2.0.6 -642 verbose afterAdd /home/christine/.npm/asap/2.0.6/package/package.json not in flight; writing -643 verbose afterAdd /home/christine/.npm/asap/2.0.6/package/package.json written -644 silly fetchNamedPackageData aws-sign2 -645 silly mapToRegistry name aws-sign2 -646 silly mapToRegistry using default registry -647 silly mapToRegistry registry https://registry.npmjs.org/ -648 silly mapToRegistry uri https://registry.npmjs.org/aws-sign2 -649 silly fetchNamedPackageData aws4 -650 silly mapToRegistry name aws4 -651 silly mapToRegistry using default registry -652 silly mapToRegistry registry https://registry.npmjs.org/ -653 silly mapToRegistry uri https://registry.npmjs.org/aws4 -654 silly fetchNamedPackageData caseless -655 silly mapToRegistry name caseless -656 silly mapToRegistry using default registry -657 silly mapToRegistry registry https://registry.npmjs.org/ -658 silly mapToRegistry uri https://registry.npmjs.org/caseless -659 silly fetchNamedPackageData combined-stream -660 silly mapToRegistry name combined-stream -661 silly mapToRegistry using default registry -662 silly mapToRegistry registry https://registry.npmjs.org/ -663 silly mapToRegistry uri https://registry.npmjs.org/combined-stream -664 silly fetchNamedPackageData extend -665 silly mapToRegistry name extend -666 silly mapToRegistry using default registry -667 silly mapToRegistry registry https://registry.npmjs.org/ -668 silly mapToRegistry uri https://registry.npmjs.org/extend -669 silly fetchNamedPackageData forever-agent -670 silly mapToRegistry name forever-agent -671 silly mapToRegistry using default registry -672 silly mapToRegistry registry https://registry.npmjs.org/ -673 silly mapToRegistry uri https://registry.npmjs.org/forever-agent -674 silly fetchNamedPackageData form-data -675 silly mapToRegistry name form-data -676 silly mapToRegistry using default registry -677 silly mapToRegistry registry https://registry.npmjs.org/ -678 silly mapToRegistry uri https://registry.npmjs.org/form-data -679 silly fetchNamedPackageData har-validator -680 silly mapToRegistry name har-validator -681 silly mapToRegistry using default registry -682 silly mapToRegistry registry https://registry.npmjs.org/ -683 silly mapToRegistry uri https://registry.npmjs.org/har-validator -684 silly fetchNamedPackageData http-signature -685 silly mapToRegistry name http-signature -686 silly mapToRegistry using default registry -687 silly mapToRegistry registry https://registry.npmjs.org/ -688 silly mapToRegistry uri https://registry.npmjs.org/http-signature -689 silly fetchNamedPackageData is-typedarray -690 silly mapToRegistry name is-typedarray -691 silly mapToRegistry using default registry -692 silly mapToRegistry registry https://registry.npmjs.org/ -693 silly mapToRegistry uri https://registry.npmjs.org/is-typedarray -694 silly fetchNamedPackageData isstream -695 silly mapToRegistry name isstream -696 silly mapToRegistry using default registry -697 silly mapToRegistry registry https://registry.npmjs.org/ -698 silly mapToRegistry uri https://registry.npmjs.org/isstream -699 silly fetchNamedPackageData json-stringify-safe -700 silly mapToRegistry name json-stringify-safe -701 silly mapToRegistry using default registry -702 silly mapToRegistry registry https://registry.npmjs.org/ -703 silly mapToRegistry uri https://registry.npmjs.org/json-stringify-safe -704 silly fetchNamedPackageData mime-types -705 silly mapToRegistry name mime-types -706 silly mapToRegistry using default registry -707 silly mapToRegistry registry https://registry.npmjs.org/ -708 silly mapToRegistry uri https://registry.npmjs.org/mime-types -709 silly fetchNamedPackageData oauth-sign -710 silly mapToRegistry name oauth-sign -711 silly mapToRegistry using default registry -712 silly mapToRegistry registry https://registry.npmjs.org/ -713 silly mapToRegistry uri https://registry.npmjs.org/oauth-sign -714 silly fetchNamedPackageData performance-now -715 silly mapToRegistry name performance-now -716 silly mapToRegistry using default registry -717 silly mapToRegistry registry https://registry.npmjs.org/ -718 silly mapToRegistry uri https://registry.npmjs.org/performance-now -719 silly fetchNamedPackageData qs -720 silly mapToRegistry name qs -721 silly mapToRegistry using default registry -722 silly mapToRegistry registry https://registry.npmjs.org/ -723 silly mapToRegistry uri https://registry.npmjs.org/qs -724 silly fetchNamedPackageData safe-buffer -725 silly mapToRegistry name safe-buffer -726 silly mapToRegistry using default registry -727 silly mapToRegistry registry https://registry.npmjs.org/ -728 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer -729 silly fetchNamedPackageData tough-cookie -730 silly mapToRegistry name tough-cookie -731 silly mapToRegistry using default registry -732 silly mapToRegistry registry https://registry.npmjs.org/ -733 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie -734 silly fetchNamedPackageData tunnel-agent -735 silly mapToRegistry name tunnel-agent -736 silly mapToRegistry using default registry -737 silly mapToRegistry registry https://registry.npmjs.org/ -738 silly mapToRegistry uri https://registry.npmjs.org/tunnel-agent -739 silly fetchNamedPackageData uuid -740 silly mapToRegistry name uuid -741 silly mapToRegistry using default registry -742 silly mapToRegistry registry https://registry.npmjs.org/ -743 silly mapToRegistry uri https://registry.npmjs.org/uuid -744 verbose request uri https://registry.npmjs.org/aws-sign2 -745 verbose request no auth needed -746 info attempt registry request try #1 at 13:48:57 -747 verbose etag W/"7bf763d2cccd0806178c5c3e43895950" -748 verbose lastModified Sat, 26 May 2018 17:48:52 GMT -749 http request GET https://registry.npmjs.org/aws-sign2 -750 verbose request uri https://registry.npmjs.org/aws4 -751 verbose request no auth needed -752 info attempt registry request try #1 at 13:48:57 -753 verbose etag W/"95c9834de9b7164b9a063970ba631035" -754 verbose lastModified Mon, 13 Jan 2020 23:25:51 GMT -755 http request GET https://registry.npmjs.org/aws4 -756 verbose request uri https://registry.npmjs.org/caseless -757 verbose request no auth needed -758 info attempt registry request try #1 at 13:48:57 -759 verbose etag W/"37dc2c2e48fd048da76bb52a97386418" -760 verbose lastModified Sat, 26 May 2018 19:27:25 GMT -761 http request GET https://registry.npmjs.org/caseless -762 verbose request uri https://registry.npmjs.org/combined-stream -763 verbose request no auth needed -764 info attempt registry request try #1 at 13:48:57 -765 verbose etag W/"01d038e7b9fcfd5e5654a7d7003bfe74" -766 verbose lastModified Sun, 12 May 2019 17:49:50 GMT -767 http request GET https://registry.npmjs.org/combined-stream -768 verbose request uri https://registry.npmjs.org/extend -769 verbose request no auth needed -770 info attempt registry request try #1 at 13:48:57 -771 verbose etag W/"924fa39abddd399eb964b1aa611da651" -772 verbose lastModified Thu, 19 Jul 2018 22:12:47 GMT -773 http request GET https://registry.npmjs.org/extend -774 verbose request uri https://registry.npmjs.org/forever-agent -775 verbose request no auth needed -776 info attempt registry request try #1 at 13:48:57 -777 verbose etag W/"9e6ef96089dd23304c2ea7d2fb731c9c" -778 verbose lastModified Sun, 27 May 2018 01:06:13 GMT -779 http request GET https://registry.npmjs.org/forever-agent -780 verbose request uri https://registry.npmjs.org/form-data -781 verbose request no auth needed -782 info attempt registry request try #1 at 13:48:57 -783 verbose etag W/"5e211bf0fabf58f7b2a855c8b4ce28a4" -784 verbose lastModified Wed, 06 Nov 2019 07:57:03 GMT -785 http request GET https://registry.npmjs.org/form-data -786 verbose request uri https://registry.npmjs.org/har-validator -787 verbose request no auth needed -788 info attempt registry request try #1 at 13:48:57 -789 verbose etag W/"a261ac4614f4e022065b83613ee209ab" -790 verbose lastModified Fri, 04 Jan 2019 02:36:17 GMT -791 http request GET https://registry.npmjs.org/har-validator -792 verbose request uri https://registry.npmjs.org/http-signature -793 verbose request no auth needed -794 info attempt registry request try #1 at 13:48:57 -795 verbose etag W/"a22cccd7d585d00e5e26fe5111bee01d" -796 verbose lastModified Fri, 13 Dec 2019 16:32:29 GMT -797 http request GET https://registry.npmjs.org/http-signature -798 verbose request uri https://registry.npmjs.org/is-typedarray -799 verbose request no auth needed -800 info attempt registry request try #1 at 13:48:57 -801 verbose etag W/"e7b88219ebe721b877b678c51795c9c5" -802 verbose lastModified Sun, 27 May 2018 04:59:55 GMT -803 http request GET https://registry.npmjs.org/is-typedarray -804 verbose request uri https://registry.npmjs.org/isstream -805 verbose request no auth needed -806 info attempt registry request try #1 at 13:48:57 -807 verbose etag W/"9dc7f37e087df077683bf238c847ad45" -808 verbose lastModified Sun, 27 May 2018 05:02:31 GMT -809 http request GET https://registry.npmjs.org/isstream -810 verbose request uri https://registry.npmjs.org/json-stringify-safe -811 verbose request no auth needed -812 info attempt registry request try #1 at 13:48:57 -813 verbose etag W/"7f39a9aafcaefe8efbf43a9f2e56c4eb" -814 verbose lastModified Sun, 27 May 2018 05:41:03 GMT -815 http request GET https://registry.npmjs.org/json-stringify-safe -816 verbose request uri https://registry.npmjs.org/oauth-sign -817 verbose request no auth needed -818 info attempt registry request try #1 at 13:48:57 -819 verbose etag W/"3032c1efe9ec61d748d027a1da2bab61" -820 verbose lastModified Thu, 02 Aug 2018 18:04:02 GMT -821 http request GET https://registry.npmjs.org/oauth-sign -822 verbose request uri https://registry.npmjs.org/mime-types -823 verbose request no auth needed -824 info attempt registry request try #1 at 13:48:57 -825 verbose etag W/"ace0d1d2bbdfabcc2f0fdf5db2297cb9" -826 verbose lastModified Mon, 06 Jan 2020 03:47:58 GMT -827 http request GET https://registry.npmjs.org/mime-types -828 verbose request uri https://registry.npmjs.org/performance-now -829 verbose request no auth needed -830 info attempt registry request try #1 at 13:48:57 -831 verbose etag W/"5f12ad497b3e39323dcdde75c34f5767" -832 verbose lastModified Sun, 27 May 2018 12:05:53 GMT -833 http request GET https://registry.npmjs.org/performance-now -834 verbose request uri https://registry.npmjs.org/qs -835 verbose request no auth needed -836 info attempt registry request try #1 at 13:48:57 -837 verbose etag W/"ccaef4541845c31c4cc05bcf8dd00ce6" -838 verbose lastModified Fri, 08 Nov 2019 06:46:39 GMT -839 http request GET https://registry.npmjs.org/qs -840 verbose request uri https://registry.npmjs.org/tough-cookie -841 verbose request no auth needed -842 info attempt registry request try #1 at 13:48:57 -843 verbose etag W/"f1d93d88b646bb4c354f8c481852a1b7" -844 verbose lastModified Tue, 05 Feb 2019 03:09:49 GMT -845 http request GET https://registry.npmjs.org/tough-cookie -846 verbose request uri https://registry.npmjs.org/tunnel-agent -847 verbose request no auth needed -848 info attempt registry request try #1 at 13:48:57 -849 verbose etag W/"03911fc1f433b33bccf8a4a2a5de2375" -850 verbose lastModified Sun, 27 May 2018 20:02:57 GMT -851 http request GET https://registry.npmjs.org/tunnel-agent -852 verbose request uri https://registry.npmjs.org/safe-buffer -853 verbose request no auth needed -854 info attempt registry request try #1 at 13:48:57 -855 verbose etag W/"00b820fed08175238fc3473b2b3e0278" -856 verbose lastModified Fri, 05 Jul 2019 18:04:37 GMT -857 http request GET https://registry.npmjs.org/safe-buffer -858 verbose request uri https://registry.npmjs.org/uuid -859 verbose request no auth needed -860 info attempt registry request try #1 at 13:48:57 -861 verbose etag W/"e1230e67a078f82b785335adbba5abd3" -862 verbose lastModified Thu, 16 Jan 2020 21:05:42 GMT -863 http request GET https://registry.npmjs.org/uuid -864 http 304 https://registry.npmjs.org/aws-sign2 -865 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -865 verbose headers connection: 'keep-alive', -865 verbose headers 'set-cookie': -865 verbose headers [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -865 verbose headers 'cf-ray': '59764fa49cf4d6e9-FRA', -865 verbose headers age: '5657', -865 verbose headers 'cache-control': 'public, max-age=300', -865 verbose headers etag: '"7bf763d2cccd0806178c5c3e43895950"', -865 verbose headers 'last-modified': 'Sat, 26 May 2018 17:48:52 GMT', -865 verbose headers vary: 'Accept-Encoding', -865 verbose headers 'cf-cache-status': 'HIT', -865 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -865 verbose headers server: 'cloudflare', -865 verbose headers 'cf-request-id': '02ddd01ae00000d6e975b28200000001' } -866 silly get cb [ 304, -866 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -866 silly get connection: 'keep-alive', -866 silly get 'set-cookie': -866 silly get [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -866 silly get 'cf-ray': '59764fa49cf4d6e9-FRA', -866 silly get age: '5657', -866 silly get 'cache-control': 'public, max-age=300', -866 silly get etag: '"7bf763d2cccd0806178c5c3e43895950"', -866 silly get 'last-modified': 'Sat, 26 May 2018 17:48:52 GMT', -866 silly get vary: 'Accept-Encoding', -866 silly get 'cf-cache-status': 'HIT', -866 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -866 silly get server: 'cloudflare', -866 silly get 'cf-request-id': '02ddd01ae00000d6e975b28200000001' } ] -867 verbose etag https://registry.npmjs.org/aws-sign2 from cache -868 verbose get saving aws-sign2 to /home/christine/.npm/registry.npmjs.org/aws-sign2/.cache.json -869 silly resolveWithNewModule aws-sign2@0.7.0 checking installable status -870 silly cache add args [ 'aws-sign2@~0.7.0', null ] -871 verbose cache add spec aws-sign2@~0.7.0 -872 silly cache add parsed spec Result { -872 silly cache add raw: 'aws-sign2@~0.7.0', -872 silly cache add scope: null, -872 silly cache add name: 'aws-sign2', -872 silly cache add rawSpec: '~0.7.0', -872 silly cache add spec: '>=0.7.0 <0.8.0', -872 silly cache add type: 'range' } -873 silly addNamed aws-sign2@>=0.7.0 <0.8.0 -874 verbose addNamed ">=0.7.0 <0.8.0" is a valid semver range for aws-sign2 -875 silly addNameRange { name: 'aws-sign2', range: '>=0.7.0 <0.8.0', hasData: false } -876 silly mapToRegistry name aws-sign2 -877 silly mapToRegistry using default registry -878 silly mapToRegistry registry https://registry.npmjs.org/ -879 silly mapToRegistry uri https://registry.npmjs.org/aws-sign2 -880 verbose addNameRange registry:https://registry.npmjs.org/aws-sign2 not in flight; fetching -881 verbose get https://registry.npmjs.org/aws-sign2 not expired, no request -882 silly addNameRange number 2 { name: 'aws-sign2', range: '>=0.7.0 <0.8.0', hasData: true } -883 silly addNameRange versions [ 'aws-sign2', [ '0.4.0', '0.5.0', '0.6.0', '0.7.0' ] ] -884 silly addNamed aws-sign2@0.7.0 -885 verbose addNamed "0.7.0" is a plain semver version for aws-sign2 -886 silly cache afterAdd aws-sign2@0.7.0 -887 verbose afterAdd /home/christine/.npm/aws-sign2/0.7.0/package/package.json not in flight; writing -888 verbose afterAdd /home/christine/.npm/aws-sign2/0.7.0/package/package.json written -889 http 304 https://registry.npmjs.org/form-data -890 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -890 verbose headers connection: 'keep-alive', -890 verbose headers 'set-cookie': -890 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -890 verbose headers 'cf-ray': '59764fa4ba1305fd-FRA', -890 verbose headers age: '5355', -890 verbose headers 'cache-control': 'public, max-age=300', -890 verbose headers etag: '"5e211bf0fabf58f7b2a855c8b4ce28a4"', -890 verbose headers 'last-modified': 'Wed, 06 Nov 2019 07:57:03 GMT', -890 verbose headers vary: 'Accept-Encoding', -890 verbose headers 'cf-cache-status': 'HIT', -890 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -890 verbose headers server: 'cloudflare', -890 verbose headers 'cf-request-id': '02ddd01af4000005fd8da55200000001' } -891 silly get cb [ 304, -891 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -891 silly get connection: 'keep-alive', -891 silly get 'set-cookie': -891 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -891 silly get 'cf-ray': '59764fa4ba1305fd-FRA', -891 silly get age: '5355', -891 silly get 'cache-control': 'public, max-age=300', -891 silly get etag: '"5e211bf0fabf58f7b2a855c8b4ce28a4"', -891 silly get 'last-modified': 'Wed, 06 Nov 2019 07:57:03 GMT', -891 silly get vary: 'Accept-Encoding', -891 silly get 'cf-cache-status': 'HIT', -891 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -891 silly get server: 'cloudflare', -891 silly get 'cf-request-id': '02ddd01af4000005fd8da55200000001' } ] -892 verbose etag https://registry.npmjs.org/form-data from cache -893 verbose get saving form-data to /home/christine/.npm/registry.npmjs.org/form-data/.cache.json -894 http 304 https://registry.npmjs.org/har-validator -895 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -895 verbose headers connection: 'keep-alive', -895 verbose headers 'set-cookie': -895 verbose headers [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -895 verbose headers 'cf-ray': '59764fa4b9a6c272-FRA', -895 verbose headers age: '5655', -895 verbose headers 'cache-control': 'public, max-age=300', -895 verbose headers etag: '"a261ac4614f4e022065b83613ee209ab"', -895 verbose headers 'last-modified': 'Fri, 04 Jan 2019 02:36:17 GMT', -895 verbose headers vary: 'Accept-Encoding', -895 verbose headers 'cf-cache-status': 'HIT', -895 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -895 verbose headers server: 'cloudflare', -895 verbose headers 'cf-request-id': '02ddd01af40000c272388b2200000001' } -896 silly get cb [ 304, -896 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -896 silly get connection: 'keep-alive', -896 silly get 'set-cookie': -896 silly get [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -896 silly get 'cf-ray': '59764fa4b9a6c272-FRA', -896 silly get age: '5655', -896 silly get 'cache-control': 'public, max-age=300', -896 silly get etag: '"a261ac4614f4e022065b83613ee209ab"', -896 silly get 'last-modified': 'Fri, 04 Jan 2019 02:36:17 GMT', -896 silly get vary: 'Accept-Encoding', -896 silly get 'cf-cache-status': 'HIT', -896 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -896 silly get server: 'cloudflare', -896 silly get 'cf-request-id': '02ddd01af40000c272388b2200000001' } ] -897 verbose etag https://registry.npmjs.org/har-validator from cache -898 verbose get saving har-validator to /home/christine/.npm/registry.npmjs.org/har-validator/.cache.json -899 http 304 https://registry.npmjs.org/caseless -900 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -900 verbose headers connection: 'keep-alive', -900 verbose headers 'set-cookie': -900 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -900 verbose headers 'cf-ray': '59764fa4b9de325c-FRA', -900 verbose headers age: '5655', -900 verbose headers 'cache-control': 'public, max-age=300', -900 verbose headers etag: '"37dc2c2e48fd048da76bb52a97386418"', -900 verbose headers 'last-modified': 'Sat, 26 May 2018 19:27:25 GMT', -900 verbose headers vary: 'Accept-Encoding', -900 verbose headers 'cf-cache-status': 'HIT', -900 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -900 verbose headers server: 'cloudflare', -900 verbose headers 'cf-request-id': '02ddd01af40000325c4c810200000001' } -901 silly get cb [ 304, -901 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -901 silly get connection: 'keep-alive', -901 silly get 'set-cookie': -901 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -901 silly get 'cf-ray': '59764fa4b9de325c-FRA', -901 silly get age: '5655', -901 silly get 'cache-control': 'public, max-age=300', -901 silly get etag: '"37dc2c2e48fd048da76bb52a97386418"', -901 silly get 'last-modified': 'Sat, 26 May 2018 19:27:25 GMT', -901 silly get vary: 'Accept-Encoding', -901 silly get 'cf-cache-status': 'HIT', -901 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -901 silly get server: 'cloudflare', -901 silly get 'cf-request-id': '02ddd01af40000325c4c810200000001' } ] -902 verbose etag https://registry.npmjs.org/caseless from cache -903 verbose get saving caseless to /home/christine/.npm/registry.npmjs.org/caseless/.cache.json -904 http 304 https://registry.npmjs.org/is-typedarray -905 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -905 verbose headers connection: 'keep-alive', -905 verbose headers 'set-cookie': -905 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -905 verbose headers 'cf-ray': '59764fa4bc4a6347-FRA', -905 verbose headers age: '5655', -905 verbose headers 'cache-control': 'public, max-age=300', -905 verbose headers etag: '"e7b88219ebe721b877b678c51795c9c5"', -905 verbose headers 'last-modified': 'Sun, 27 May 2018 04:59:55 GMT', -905 verbose headers vary: 'Accept-Encoding', -905 verbose headers 'cf-cache-status': 'HIT', -905 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -905 verbose headers server: 'cloudflare', -905 verbose headers 'cf-request-id': '02ddd01af400006347e88ad200000001' } -906 silly get cb [ 304, -906 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -906 silly get connection: 'keep-alive', -906 silly get 'set-cookie': -906 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -906 silly get 'cf-ray': '59764fa4bc4a6347-FRA', -906 silly get age: '5655', -906 silly get 'cache-control': 'public, max-age=300', -906 silly get etag: '"e7b88219ebe721b877b678c51795c9c5"', -906 silly get 'last-modified': 'Sun, 27 May 2018 04:59:55 GMT', -906 silly get vary: 'Accept-Encoding', -906 silly get 'cf-cache-status': 'HIT', -906 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -906 silly get server: 'cloudflare', -906 silly get 'cf-request-id': '02ddd01af400006347e88ad200000001' } ] -907 verbose etag https://registry.npmjs.org/is-typedarray from cache -908 verbose get saving is-typedarray to /home/christine/.npm/registry.npmjs.org/is-typedarray/.cache.json -909 http 304 https://registry.npmjs.org/forever-agent -910 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -910 verbose headers connection: 'keep-alive', -910 verbose headers 'set-cookie': -910 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -910 verbose headers 'cf-ray': '59764fa4b87c648b-FRA', -910 verbose headers age: '5655', -910 verbose headers 'cache-control': 'public, max-age=300', -910 verbose headers etag: '"9e6ef96089dd23304c2ea7d2fb731c9c"', -910 verbose headers 'last-modified': 'Sun, 27 May 2018 01:06:13 GMT', -910 verbose headers vary: 'Accept-Encoding', -910 verbose headers 'cf-cache-status': 'HIT', -910 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -910 verbose headers server: 'cloudflare', -910 verbose headers 'cf-request-id': '02ddd01af40000648bda003200000001' } -911 silly get cb [ 304, -911 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -911 silly get connection: 'keep-alive', -911 silly get 'set-cookie': -911 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -911 silly get 'cf-ray': '59764fa4b87c648b-FRA', -911 silly get age: '5655', -911 silly get 'cache-control': 'public, max-age=300', -911 silly get etag: '"9e6ef96089dd23304c2ea7d2fb731c9c"', -911 silly get 'last-modified': 'Sun, 27 May 2018 01:06:13 GMT', -911 silly get vary: 'Accept-Encoding', -911 silly get 'cf-cache-status': 'HIT', -911 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -911 silly get server: 'cloudflare', -911 silly get 'cf-request-id': '02ddd01af40000648bda003200000001' } ] -912 verbose etag https://registry.npmjs.org/forever-agent from cache -913 verbose get saving forever-agent to /home/christine/.npm/registry.npmjs.org/forever-agent/.cache.json -914 silly resolveWithNewModule form-data@2.3.3 checking installable status -915 silly cache add args [ 'form-data@~2.3.2', null ] -916 verbose cache add spec form-data@~2.3.2 -917 silly cache add parsed spec Result { -917 silly cache add raw: 'form-data@~2.3.2', -917 silly cache add scope: null, -917 silly cache add name: 'form-data', -917 silly cache add rawSpec: '~2.3.2', -917 silly cache add spec: '>=2.3.2 <2.4.0', -917 silly cache add type: 'range' } -918 silly addNamed form-data@>=2.3.2 <2.4.0 -919 verbose addNamed ">=2.3.2 <2.4.0" is a valid semver range for form-data -920 silly addNameRange { name: 'form-data', range: '>=2.3.2 <2.4.0', hasData: false } -921 silly mapToRegistry name form-data -922 silly mapToRegistry using default registry -923 silly mapToRegistry registry https://registry.npmjs.org/ -924 silly mapToRegistry uri https://registry.npmjs.org/form-data -925 verbose addNameRange registry:https://registry.npmjs.org/form-data not in flight; fetching -926 silly resolveWithNewModule har-validator@5.1.3 checking installable status -927 silly cache add args [ 'har-validator@~5.1.3', null ] -928 verbose cache add spec har-validator@~5.1.3 -929 silly cache add parsed spec Result { -929 silly cache add raw: 'har-validator@~5.1.3', -929 silly cache add scope: null, -929 silly cache add name: 'har-validator', -929 silly cache add rawSpec: '~5.1.3', -929 silly cache add spec: '>=5.1.3 <5.2.0', -929 silly cache add type: 'range' } -930 silly addNamed har-validator@>=5.1.3 <5.2.0 -931 verbose addNamed ">=5.1.3 <5.2.0" is a valid semver range for har-validator -932 silly addNameRange { name: 'har-validator', -932 silly addNameRange range: '>=5.1.3 <5.2.0', -932 silly addNameRange hasData: false } -933 silly mapToRegistry name har-validator -934 silly mapToRegistry using default registry -935 silly mapToRegistry registry https://registry.npmjs.org/ -936 silly mapToRegistry uri https://registry.npmjs.org/har-validator -937 verbose addNameRange registry:https://registry.npmjs.org/har-validator not in flight; fetching -938 http 304 https://registry.npmjs.org/extend -939 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -939 verbose headers connection: 'keep-alive', -939 verbose headers 'set-cookie': -939 verbose headers [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -939 verbose headers 'cf-ray': '59764fa4bc61175a-FRA', -939 verbose headers age: '5656', -939 verbose headers 'cache-control': 'public, max-age=300', -939 verbose headers etag: '"924fa39abddd399eb964b1aa611da651"', -939 verbose headers 'last-modified': 'Thu, 19 Jul 2018 22:12:47 GMT', -939 verbose headers vary: 'Accept-Encoding', -939 verbose headers 'cf-cache-status': 'HIT', -939 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -939 verbose headers server: 'cloudflare', -939 verbose headers 'cf-request-id': '02ddd01af40000175a1e1fb200000001' } -940 silly get cb [ 304, -940 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -940 silly get connection: 'keep-alive', -940 silly get 'set-cookie': -940 silly get [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -940 silly get 'cf-ray': '59764fa4bc61175a-FRA', -940 silly get age: '5656', -940 silly get 'cache-control': 'public, max-age=300', -940 silly get etag: '"924fa39abddd399eb964b1aa611da651"', -940 silly get 'last-modified': 'Thu, 19 Jul 2018 22:12:47 GMT', -940 silly get vary: 'Accept-Encoding', -940 silly get 'cf-cache-status': 'HIT', -940 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -940 silly get server: 'cloudflare', -940 silly get 'cf-request-id': '02ddd01af40000175a1e1fb200000001' } ] -941 verbose etag https://registry.npmjs.org/extend from cache -942 verbose get saving extend to /home/christine/.npm/registry.npmjs.org/extend/.cache.json -943 http 304 https://registry.npmjs.org/combined-stream -944 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -944 verbose headers connection: 'keep-alive', -944 verbose headers 'set-cookie': -944 verbose headers [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -944 verbose headers 'cf-ray': '59764fa4b963d715-FRA', -944 verbose headers age: '5355', -944 verbose headers 'cache-control': 'public, max-age=300', -944 verbose headers etag: '"01d038e7b9fcfd5e5654a7d7003bfe74"', -944 verbose headers 'last-modified': 'Sun, 12 May 2019 17:49:50 GMT', -944 verbose headers vary: 'Accept-Encoding', -944 verbose headers 'cf-cache-status': 'HIT', -944 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -944 verbose headers server: 'cloudflare', -944 verbose headers 'cf-request-id': '02ddd01af40000d715c11f3200000001' } -945 silly get cb [ 304, -945 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -945 silly get connection: 'keep-alive', -945 silly get 'set-cookie': -945 silly get [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -945 silly get 'cf-ray': '59764fa4b963d715-FRA', -945 silly get age: '5355', -945 silly get 'cache-control': 'public, max-age=300', -945 silly get etag: '"01d038e7b9fcfd5e5654a7d7003bfe74"', -945 silly get 'last-modified': 'Sun, 12 May 2019 17:49:50 GMT', -945 silly get vary: 'Accept-Encoding', -945 silly get 'cf-cache-status': 'HIT', -945 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -945 silly get server: 'cloudflare', -945 silly get 'cf-request-id': '02ddd01af40000d715c11f3200000001' } ] -946 verbose etag https://registry.npmjs.org/combined-stream from cache -947 verbose get saving combined-stream to /home/christine/.npm/registry.npmjs.org/combined-stream/.cache.json -948 silly resolveWithNewModule is-typedarray@1.0.0 checking installable status -949 silly cache add args [ 'is-typedarray@~1.0.0', null ] -950 verbose cache add spec is-typedarray@~1.0.0 -951 silly cache add parsed spec Result { -951 silly cache add raw: 'is-typedarray@~1.0.0', -951 silly cache add scope: null, -951 silly cache add name: 'is-typedarray', -951 silly cache add rawSpec: '~1.0.0', -951 silly cache add spec: '>=1.0.0 <1.1.0', -951 silly cache add type: 'range' } -952 silly addNamed is-typedarray@>=1.0.0 <1.1.0 -953 verbose addNamed ">=1.0.0 <1.1.0" is a valid semver range for is-typedarray -954 silly addNameRange { name: 'is-typedarray', -954 silly addNameRange range: '>=1.0.0 <1.1.0', -954 silly addNameRange hasData: false } -955 silly mapToRegistry name is-typedarray -956 silly mapToRegistry using default registry -957 silly mapToRegistry registry https://registry.npmjs.org/ -958 silly mapToRegistry uri https://registry.npmjs.org/is-typedarray -959 verbose addNameRange registry:https://registry.npmjs.org/is-typedarray not in flight; fetching -960 silly resolveWithNewModule caseless@0.12.0 checking installable status -961 silly cache add args [ 'caseless@~0.12.0', null ] -962 verbose cache add spec caseless@~0.12.0 -963 silly cache add parsed spec Result { -963 silly cache add raw: 'caseless@~0.12.0', -963 silly cache add scope: null, -963 silly cache add name: 'caseless', -963 silly cache add rawSpec: '~0.12.0', -963 silly cache add spec: '>=0.12.0 <0.13.0', -963 silly cache add type: 'range' } -964 silly addNamed caseless@>=0.12.0 <0.13.0 -965 verbose addNamed ">=0.12.0 <0.13.0" is a valid semver range for caseless -966 silly addNameRange { name: 'caseless', range: '>=0.12.0 <0.13.0', hasData: false } -967 silly mapToRegistry name caseless -968 silly mapToRegistry using default registry -969 silly mapToRegistry registry https://registry.npmjs.org/ -970 silly mapToRegistry uri https://registry.npmjs.org/caseless -971 verbose addNameRange registry:https://registry.npmjs.org/caseless not in flight; fetching -972 http 304 https://registry.npmjs.org/aws4 -973 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -973 verbose headers connection: 'keep-alive', -973 verbose headers 'set-cookie': -973 verbose headers [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -973 verbose headers 'cf-ray': '59764fa4bb7d6413-FRA', -973 verbose headers age: '5655', -973 verbose headers 'cache-control': 'public, max-age=300', -973 verbose headers etag: '"95c9834de9b7164b9a063970ba631035"', -973 verbose headers 'last-modified': 'Mon, 13 Jan 2020 23:25:51 GMT', -973 verbose headers vary: 'Accept-Encoding', -973 verbose headers 'cf-cache-status': 'HIT', -973 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -973 verbose headers server: 'cloudflare', -973 verbose headers 'cf-request-id': '02ddd01af4000064135f8e3200000001' } -974 silly get cb [ 304, -974 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -974 silly get connection: 'keep-alive', -974 silly get 'set-cookie': -974 silly get [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -974 silly get 'cf-ray': '59764fa4bb7d6413-FRA', -974 silly get age: '5655', -974 silly get 'cache-control': 'public, max-age=300', -974 silly get etag: '"95c9834de9b7164b9a063970ba631035"', -974 silly get 'last-modified': 'Mon, 13 Jan 2020 23:25:51 GMT', -974 silly get vary: 'Accept-Encoding', -974 silly get 'cf-cache-status': 'HIT', -974 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -974 silly get server: 'cloudflare', -974 silly get 'cf-request-id': '02ddd01af4000064135f8e3200000001' } ] -975 verbose etag https://registry.npmjs.org/aws4 from cache -976 verbose get saving aws4 to /home/christine/.npm/registry.npmjs.org/aws4/.cache.json -977 silly resolveWithNewModule forever-agent@0.6.1 checking installable status -978 silly cache add args [ 'forever-agent@~0.6.1', null ] -979 verbose cache add spec forever-agent@~0.6.1 -980 silly cache add parsed spec Result { -980 silly cache add raw: 'forever-agent@~0.6.1', -980 silly cache add scope: null, -980 silly cache add name: 'forever-agent', -980 silly cache add rawSpec: '~0.6.1', -980 silly cache add spec: '>=0.6.1 <0.7.0', -980 silly cache add type: 'range' } -981 silly addNamed forever-agent@>=0.6.1 <0.7.0 -982 verbose addNamed ">=0.6.1 <0.7.0" is a valid semver range for forever-agent -983 silly addNameRange { name: 'forever-agent', -983 silly addNameRange range: '>=0.6.1 <0.7.0', -983 silly addNameRange hasData: false } -984 silly mapToRegistry name forever-agent -985 silly mapToRegistry using default registry -986 silly mapToRegistry registry https://registry.npmjs.org/ -987 silly mapToRegistry uri https://registry.npmjs.org/forever-agent -988 verbose addNameRange registry:https://registry.npmjs.org/forever-agent not in flight; fetching -989 verbose get https://registry.npmjs.org/form-data not expired, no request -990 silly addNameRange number 2 { name: 'form-data', range: '>=2.3.2 <2.4.0', hasData: true } -991 silly addNameRange versions [ 'form-data', -991 silly addNameRange [ '0.0.0', -991 silly addNameRange '0.0.2', -991 silly addNameRange '0.0.3', -991 silly addNameRange '0.0.4', -991 silly addNameRange '0.0.5', -991 silly addNameRange '0.0.6', -991 silly addNameRange '0.0.7', -991 silly addNameRange '0.0.8', -991 silly addNameRange '0.0.9', -991 silly addNameRange '0.0.10', -991 silly addNameRange '0.1.0', -991 silly addNameRange '0.1.1', -991 silly addNameRange '0.1.2', -991 silly addNameRange '0.1.3', -991 silly addNameRange '0.1.4', -991 silly addNameRange '0.2.0', -991 silly addNameRange '1.0.0-rc1', -991 silly addNameRange '1.0.0-rc2', -991 silly addNameRange '1.0.0-rc3', -991 silly addNameRange '1.0.0-rc4', -991 silly addNameRange '1.0.0', -991 silly addNameRange '1.0.1', -991 silly addNameRange '2.0.0', -991 silly addNameRange '2.1.0', -991 silly addNameRange '2.1.1', -991 silly addNameRange '2.1.2', -991 silly addNameRange '2.1.4', -991 silly addNameRange '2.2.0', -991 silly addNameRange '2.3.1', -991 silly addNameRange '2.3.2-rc1', -991 silly addNameRange '2.3.2', -991 silly addNameRange '2.3.3', -991 silly addNameRange '2.4.0', -991 silly addNameRange '2.5.0', -991 silly addNameRange '2.5.1', -991 silly addNameRange '3.0.0' ] ] -992 silly addNamed form-data@2.3.3 -993 verbose addNamed "2.3.3" is a plain semver version for form-data -994 http 200 https://registry.npmjs.org/http-signature -995 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -995 verbose headers 'content-type': 'application/json', -995 verbose headers 'transfer-encoding': 'chunked', -995 verbose headers connection: 'keep-alive', -995 verbose headers 'set-cookie': -995 verbose headers [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -995 verbose headers 'cf-ray': '59764fa4bcfedfc7-FRA', -995 verbose headers age: '5657', -995 verbose headers 'cache-control': 'public, max-age=300', -995 verbose headers etag: 'W/"3b46cb4c3a2db9af415ea171ef07cebe"', -995 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:40 GMT', -995 verbose headers vary: 'accept-encoding, accept', -995 verbose headers 'cf-cache-status': 'HIT', -995 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -995 verbose headers server: 'cloudflare', -995 verbose headers 'content-encoding': 'gzip', -995 verbose headers 'cf-request-id': '02ddd01af40000dfc72a8a0200000001' } -996 silly get cb [ 200, -996 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -996 silly get 'content-type': 'application/json', -996 silly get 'transfer-encoding': 'chunked', -996 silly get connection: 'keep-alive', -996 silly get 'set-cookie': -996 silly get [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -996 silly get 'cf-ray': '59764fa4bcfedfc7-FRA', -996 silly get age: '5657', -996 silly get 'cache-control': 'public, max-age=300', -996 silly get etag: 'W/"3b46cb4c3a2db9af415ea171ef07cebe"', -996 silly get 'last-modified': 'Wed, 06 May 2020 14:47:40 GMT', -996 silly get vary: 'accept-encoding, accept', -996 silly get 'cf-cache-status': 'HIT', -996 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -996 silly get server: 'cloudflare', -996 silly get 'content-encoding': 'gzip', -996 silly get 'cf-request-id': '02ddd01af40000dfc72a8a0200000001' } ] -997 verbose get saving http-signature to /home/christine/.npm/registry.npmjs.org/http-signature/.cache.json -998 verbose get https://registry.npmjs.org/har-validator not expired, no request -999 silly addNameRange number 2 { name: 'har-validator', range: '>=5.1.3 <5.2.0', hasData: true } -1000 silly addNameRange versions [ 'har-validator', -1000 silly addNameRange [ '1.0.0', -1000 silly addNameRange '1.0.1', -1000 silly addNameRange '1.0.2', -1000 silly addNameRange '1.1.0', -1000 silly addNameRange '1.1.1', -1000 silly addNameRange '1.1.2', -1000 silly addNameRange '1.1.3', -1000 silly addNameRange '1.2.0', -1000 silly addNameRange '1.3.0', -1000 silly addNameRange '1.3.1', -1000 silly addNameRange '1.4.0', -1000 silly addNameRange '1.5.0', -1000 silly addNameRange '1.5.1', -1000 silly addNameRange '1.6.0', -1000 silly addNameRange '1.6.1', -1000 silly addNameRange '1.7.0', -1000 silly addNameRange '1.7.1', -1000 silly addNameRange '1.8.0', -1000 silly addNameRange '2.0.0', -1000 silly addNameRange '2.0.1', -1000 silly addNameRange '2.0.2', -1000 silly addNameRange '2.0.3', -1000 silly addNameRange '2.0.4', -1000 silly addNameRange '2.0.5', -1000 silly addNameRange '2.0.6', -1000 silly addNameRange '2.1.0', -1000 silly addNameRange '2.1.1', -1000 silly addNameRange '2.1.2', -1000 silly addNameRange '2.1.3', -1000 silly addNameRange '3.0.0', -1000 silly addNameRange '3.1.0', -1000 silly addNameRange '3.2.0', -1000 silly addNameRange '3.3.0', -1000 silly addNameRange '3.3.1', -1000 silly addNameRange '3.4.0', -1000 silly addNameRange '4.0.0', -1000 silly addNameRange '4.0.1', -1000 silly addNameRange '4.0.2', -1000 silly addNameRange '4.0.3', -1000 silly addNameRange '4.0.4', -1000 silly addNameRange '4.1.0', -1000 silly addNameRange '4.1.1', -1000 silly addNameRange '4.1.2', -1000 silly addNameRange '4.2.0', -1000 silly addNameRange '4.2.1', -1000 silly addNameRange '5.0.0', -1000 silly addNameRange '5.0.1', -1000 silly addNameRange '5.0.2', -1000 silly addNameRange '5.0.3', -1000 silly addNameRange '5.1.0', -1000 silly addNameRange '5.1.3' ] ] -1001 silly addNamed har-validator@5.1.3 -1002 verbose addNamed "5.1.3" is a plain semver version for har-validator -1003 verbose get https://registry.npmjs.org/is-typedarray not expired, no request -1004 silly addNameRange number 2 { name: 'is-typedarray', range: '>=1.0.0 <1.1.0', hasData: true } -1005 silly addNameRange versions [ 'is-typedarray', [ '0.0.0', '1.0.0' ] ] -1006 silly addNamed is-typedarray@1.0.0 -1007 verbose addNamed "1.0.0" is a plain semver version for is-typedarray -1008 verbose get https://registry.npmjs.org/caseless not expired, no request -1009 silly addNameRange number 2 { name: 'caseless', range: '>=0.12.0 <0.13.0', hasData: true } -1010 silly addNameRange versions [ 'caseless', -1010 silly addNameRange [ '0.1.0', -1010 silly addNameRange '0.2.0', -1010 silly addNameRange '0.3.0', -1010 silly addNameRange '0.4.0', -1010 silly addNameRange '0.5.0', -1010 silly addNameRange '0.6.0', -1010 silly addNameRange '0.7.0', -1010 silly addNameRange '0.8.0', -1010 silly addNameRange '0.9.0', -1010 silly addNameRange '0.10.0', -1010 silly addNameRange '0.11.0', -1010 silly addNameRange '0.12.0' ] ] -1011 silly addNamed caseless@0.12.0 -1012 verbose addNamed "0.12.0" is a plain semver version for caseless -1013 verbose get https://registry.npmjs.org/forever-agent not expired, no request -1014 silly addNameRange number 2 { name: 'forever-agent', range: '>=0.6.1 <0.7.0', hasData: true } -1015 silly addNameRange versions [ 'forever-agent', -1015 silly addNameRange [ '0.2.0', '0.3.0', '0.4.0', '0.5.0', '0.5.2', '0.6.0', '0.6.1' ] ] -1016 silly addNamed forever-agent@0.6.1 -1017 verbose addNamed "0.6.1" is a plain semver version for forever-agent -1018 silly resolveWithNewModule combined-stream@1.0.8 checking installable status -1019 silly cache add args [ 'combined-stream@~1.0.6', null ] -1020 verbose cache add spec combined-stream@~1.0.6 -1021 silly cache add parsed spec Result { -1021 silly cache add raw: 'combined-stream@~1.0.6', -1021 silly cache add scope: null, -1021 silly cache add name: 'combined-stream', -1021 silly cache add rawSpec: '~1.0.6', -1021 silly cache add spec: '>=1.0.6 <1.1.0', -1021 silly cache add type: 'range' } -1022 silly addNamed combined-stream@>=1.0.6 <1.1.0 -1023 verbose addNamed ">=1.0.6 <1.1.0" is a valid semver range for combined-stream -1024 silly addNameRange { name: 'combined-stream', -1024 silly addNameRange range: '>=1.0.6 <1.1.0', -1024 silly addNameRange hasData: false } -1025 silly mapToRegistry name combined-stream -1026 silly mapToRegistry using default registry -1027 silly mapToRegistry registry https://registry.npmjs.org/ -1028 silly mapToRegistry uri https://registry.npmjs.org/combined-stream -1029 verbose addNameRange registry:https://registry.npmjs.org/combined-stream not in flight; fetching -1030 silly resolveWithNewModule extend@3.0.2 checking installable status -1031 silly cache add args [ 'extend@~3.0.2', null ] -1032 verbose cache add spec extend@~3.0.2 -1033 silly cache add parsed spec Result { -1033 silly cache add raw: 'extend@~3.0.2', -1033 silly cache add scope: null, -1033 silly cache add name: 'extend', -1033 silly cache add rawSpec: '~3.0.2', -1033 silly cache add spec: '>=3.0.2 <3.1.0', -1033 silly cache add type: 'range' } -1034 silly addNamed extend@>=3.0.2 <3.1.0 -1035 verbose addNamed ">=3.0.2 <3.1.0" is a valid semver range for extend -1036 silly addNameRange { name: 'extend', range: '>=3.0.2 <3.1.0', hasData: false } -1037 silly mapToRegistry name extend -1038 silly mapToRegistry using default registry -1039 silly mapToRegistry registry https://registry.npmjs.org/ -1040 silly mapToRegistry uri https://registry.npmjs.org/extend -1041 verbose addNameRange registry:https://registry.npmjs.org/extend not in flight; fetching -1042 silly cache afterAdd form-data@2.3.3 -1043 verbose afterAdd /home/christine/.npm/form-data/2.3.3/package/package.json not in flight; writing -1044 silly resolveWithNewModule aws4@1.9.1 checking installable status -1045 silly cache add args [ 'aws4@^1.8.0', null ] -1046 verbose cache add spec aws4@^1.8.0 -1047 silly cache add parsed spec Result { -1047 silly cache add raw: 'aws4@^1.8.0', -1047 silly cache add scope: null, -1047 silly cache add name: 'aws4', -1047 silly cache add rawSpec: '^1.8.0', -1047 silly cache add spec: '>=1.8.0 <2.0.0', -1047 silly cache add type: 'range' } -1048 silly addNamed aws4@>=1.8.0 <2.0.0 -1049 verbose addNamed ">=1.8.0 <2.0.0" is a valid semver range for aws4 -1050 silly addNameRange { name: 'aws4', range: '>=1.8.0 <2.0.0', hasData: false } -1051 silly mapToRegistry name aws4 -1052 silly mapToRegistry using default registry -1053 silly mapToRegistry registry https://registry.npmjs.org/ -1054 silly mapToRegistry uri https://registry.npmjs.org/aws4 -1055 verbose addNameRange registry:https://registry.npmjs.org/aws4 not in flight; fetching -1056 silly resolveWithNewModule http-signature@1.2.0 checking installable status -1057 silly cache add args [ 'http-signature@~1.2.0', null ] -1058 verbose cache add spec http-signature@~1.2.0 -1059 silly cache add parsed spec Result { -1059 silly cache add raw: 'http-signature@~1.2.0', -1059 silly cache add scope: null, -1059 silly cache add name: 'http-signature', -1059 silly cache add rawSpec: '~1.2.0', -1059 silly cache add spec: '>=1.2.0 <1.3.0', -1059 silly cache add type: 'range' } -1060 silly addNamed http-signature@>=1.2.0 <1.3.0 -1061 verbose addNamed ">=1.2.0 <1.3.0" is a valid semver range for http-signature -1062 silly addNameRange { name: 'http-signature', -1062 silly addNameRange range: '>=1.2.0 <1.3.0', -1062 silly addNameRange hasData: false } -1063 silly mapToRegistry name http-signature -1064 silly mapToRegistry using default registry -1065 silly mapToRegistry registry https://registry.npmjs.org/ -1066 silly mapToRegistry uri https://registry.npmjs.org/http-signature -1067 verbose addNameRange registry:https://registry.npmjs.org/http-signature not in flight; fetching -1068 silly cache afterAdd har-validator@5.1.3 -1069 verbose afterAdd /home/christine/.npm/har-validator/5.1.3/package/package.json not in flight; writing -1070 verbose get https://registry.npmjs.org/extend not expired, no request -1071 silly addNameRange number 2 { name: 'extend', range: '>=3.0.2 <3.1.0', hasData: true } -1072 silly addNameRange versions [ 'extend', -1072 silly addNameRange [ '1.0.0', -1072 silly addNameRange '1.1.0', -1072 silly addNameRange '1.1.1', -1072 silly addNameRange '1.1.3', -1072 silly addNameRange '1.2.0', -1072 silly addNameRange '1.2.1', -1072 silly addNameRange '1.3.0', -1072 silly addNameRange '2.0.0', -1072 silly addNameRange '2.0.1', -1072 silly addNameRange '3.0.0', -1072 silly addNameRange '3.0.1', -1072 silly addNameRange '3.0.2', -1072 silly addNameRange '2.0.2' ] ] -1073 silly addNamed extend@3.0.2 -1074 verbose addNamed "3.0.2" is a plain semver version for extend -1075 verbose get https://registry.npmjs.org/combined-stream not expired, no request -1076 silly addNameRange number 2 { name: 'combined-stream', -1076 silly addNameRange range: '>=1.0.6 <1.1.0', -1076 silly addNameRange hasData: true } -1077 silly addNameRange versions [ 'combined-stream', -1077 silly addNameRange [ '0.0.0', -1077 silly addNameRange '0.0.1', -1077 silly addNameRange '0.0.2', -1077 silly addNameRange '0.0.3', -1077 silly addNameRange '0.0.4', -1077 silly addNameRange '0.0.5', -1077 silly addNameRange '0.0.7', -1077 silly addNameRange '1.0.0', -1077 silly addNameRange '1.0.1', -1077 silly addNameRange '1.0.2', -1077 silly addNameRange '1.0.3', -1077 silly addNameRange '1.0.4', -1077 silly addNameRange '1.0.5', -1077 silly addNameRange '1.0.6-rc1', -1077 silly addNameRange '1.0.6', -1077 silly addNameRange '1.0.7', -1077 silly addNameRange '1.0.8' ] ] -1078 silly addNamed combined-stream@1.0.8 -1079 verbose addNamed "1.0.8" is a plain semver version for combined-stream -1080 silly cache afterAdd is-typedarray@1.0.0 -1081 verbose afterAdd /home/christine/.npm/is-typedarray/1.0.0/package/package.json not in flight; writing -1082 silly cache afterAdd caseless@0.12.0 -1083 verbose afterAdd /home/christine/.npm/caseless/0.12.0/package/package.json not in flight; writing -1084 silly cache afterAdd forever-agent@0.6.1 -1085 verbose afterAdd /home/christine/.npm/forever-agent/0.6.1/package/package.json not in flight; writing -1086 verbose get https://registry.npmjs.org/aws4 not expired, no request -1087 silly addNameRange number 2 { name: 'aws4', range: '>=1.8.0 <2.0.0', hasData: true } -1088 silly addNameRange versions [ 'aws4', -1088 silly addNameRange [ '0.0.1', -1088 silly addNameRange '0.1.0', -1088 silly addNameRange '0.1.1', -1088 silly addNameRange '0.1.2', -1088 silly addNameRange '0.1.3', -1088 silly addNameRange '0.1.4', -1088 silly addNameRange '0.1.5', -1088 silly addNameRange '0.1.6', -1088 silly addNameRange '0.1.7', -1088 silly addNameRange '0.1.8', -1088 silly addNameRange '0.1.9', -1088 silly addNameRange '0.1.10', -1088 silly addNameRange '0.1.12', -1088 silly addNameRange '0.2.0', -1088 silly addNameRange '0.2.1', -1088 silly addNameRange '0.2.2', -1088 silly addNameRange '0.2.3', -1088 silly addNameRange '0.3.0', -1088 silly addNameRange '0.4.0', -1088 silly addNameRange '0.4.1', -1088 silly addNameRange '0.4.2', -1088 silly addNameRange '0.5.0', -1088 silly addNameRange '0.5.1', -1088 silly addNameRange '1.0.0', -1088 silly addNameRange '1.0.1', -1088 silly addNameRange '1.0.2', -1088 silly addNameRange '1.0.3', -1088 silly addNameRange '1.0.4', -1088 silly addNameRange '1.1.0', -1088 silly addNameRange '1.2.0', -1088 silly addNameRange '1.2.1', -1088 silly addNameRange '1.3.1', -1088 silly addNameRange '1.3.2', -1088 silly addNameRange '1.4.0', -1088 silly addNameRange '1.4.1', -1088 silly addNameRange '1.5.0', -1088 silly addNameRange '1.6.0', -1088 silly addNameRange '1.7.0', -1088 silly addNameRange '1.8.0', -1088 silly addNameRange '1.9.0', -1088 silly addNameRange '1.9.1' ] ] -1089 silly addNamed aws4@1.9.1 -1090 verbose addNamed "1.9.1" is a plain semver version for aws4 -1091 verbose afterAdd /home/christine/.npm/form-data/2.3.3/package/package.json written -1092 verbose get https://registry.npmjs.org/http-signature not expired, no request -1093 silly addNameRange number 2 { name: 'http-signature', -1093 silly addNameRange range: '>=1.2.0 <1.3.0', -1093 silly addNameRange hasData: true } -1094 silly addNameRange versions [ 'http-signature', -1094 silly addNameRange [ '0.9.0', -1094 silly addNameRange '0.9.2', -1094 silly addNameRange '0.9.3', -1094 silly addNameRange '0.9.4', -1094 silly addNameRange '0.9.5', -1094 silly addNameRange '0.9.6', -1094 silly addNameRange '0.9.7', -1094 silly addNameRange '0.9.8', -1094 silly addNameRange '0.9.9', -1094 silly addNameRange '0.9.10', -1094 silly addNameRange '0.9.11', -1094 silly addNameRange '0.10.0', -1094 silly addNameRange '0.10.1', -1094 silly addNameRange '0.11.0', -1094 silly addNameRange '1.0.0', -1094 silly addNameRange '1.0.1', -1094 silly addNameRange '1.0.2', -1094 silly addNameRange '1.1.0', -1094 silly addNameRange '1.1.1', -1094 silly addNameRange '1.2.0', -1094 silly addNameRange '1.3.0', -1094 silly addNameRange '1.3.1', -1094 silly addNameRange '1.3.2', -1094 silly addNameRange '1.3.3', -1094 silly addNameRange '1.3.4' ] ] -1095 silly addNamed http-signature@1.2.0 -1096 verbose addNamed "1.2.0" is a plain semver version for http-signature -1097 verbose afterAdd /home/christine/.npm/har-validator/5.1.3/package/package.json written -1098 http 304 https://registry.npmjs.org/isstream -1099 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1099 verbose headers connection: 'keep-alive', -1099 verbose headers 'set-cookie': -1099 verbose headers [ '__cfduid=daf4947ff118e7cd8a36c058a538ff6131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1099 verbose headers 'cf-ray': '59764fa4fe4d05bb-FRA', -1099 verbose headers age: '5355', -1099 verbose headers 'cache-control': 'public, max-age=300', -1099 verbose headers etag: '"9dc7f37e087df077683bf238c847ad45"', -1099 verbose headers 'last-modified': 'Sun, 27 May 2018 05:02:31 GMT', -1099 verbose headers vary: 'Accept-Encoding', -1099 verbose headers 'cf-cache-status': 'HIT', -1099 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1099 verbose headers server: 'cloudflare', -1099 verbose headers 'cf-request-id': '02ddd01b1f000005bb0ca62200000001' } -1100 silly get cb [ 304, -1100 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1100 silly get connection: 'keep-alive', -1100 silly get 'set-cookie': -1100 silly get [ '__cfduid=daf4947ff118e7cd8a36c058a538ff6131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1100 silly get 'cf-ray': '59764fa4fe4d05bb-FRA', -1100 silly get age: '5355', -1100 silly get 'cache-control': 'public, max-age=300', -1100 silly get etag: '"9dc7f37e087df077683bf238c847ad45"', -1100 silly get 'last-modified': 'Sun, 27 May 2018 05:02:31 GMT', -1100 silly get vary: 'Accept-Encoding', -1100 silly get 'cf-cache-status': 'HIT', -1100 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1100 silly get server: 'cloudflare', -1100 silly get 'cf-request-id': '02ddd01b1f000005bb0ca62200000001' } ] -1101 verbose etag https://registry.npmjs.org/isstream from cache -1102 verbose get saving isstream to /home/christine/.npm/registry.npmjs.org/isstream/.cache.json -1103 verbose afterAdd /home/christine/.npm/is-typedarray/1.0.0/package/package.json written -1104 silly cache afterAdd combined-stream@1.0.8 -1105 verbose afterAdd /home/christine/.npm/combined-stream/1.0.8/package/package.json not in flight; writing -1106 verbose afterAdd /home/christine/.npm/caseless/0.12.0/package/package.json written -1107 verbose afterAdd /home/christine/.npm/forever-agent/0.6.1/package/package.json written -1108 silly cache afterAdd extend@3.0.2 -1109 verbose afterAdd /home/christine/.npm/extend/3.0.2/package/package.json not in flight; writing -1110 silly cache afterAdd aws4@1.9.1 -1111 verbose afterAdd /home/christine/.npm/aws4/1.9.1/package/package.json not in flight; writing -1112 http 304 https://registry.npmjs.org/json-stringify-safe -1113 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1113 verbose headers connection: 'keep-alive', -1113 verbose headers 'set-cookie': -1113 verbose headers [ '__cfduid=dd03692ace9824ebd46c46f408f2989131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1113 verbose headers 'cf-ray': '59764fa4fe54d6e1-FRA', -1113 verbose headers age: '5657', -1113 verbose headers 'cache-control': 'public, max-age=300', -1113 verbose headers etag: '"7f39a9aafcaefe8efbf43a9f2e56c4eb"', -1113 verbose headers 'last-modified': 'Sun, 27 May 2018 05:41:03 GMT', -1113 verbose headers vary: 'Accept-Encoding', -1113 verbose headers 'cf-cache-status': 'HIT', -1113 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1113 verbose headers server: 'cloudflare', -1113 verbose headers 'cf-request-id': '02ddd01b1e0000d6e132367200000001' } -1114 silly get cb [ 304, -1114 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1114 silly get connection: 'keep-alive', -1114 silly get 'set-cookie': -1114 silly get [ '__cfduid=dd03692ace9824ebd46c46f408f2989131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1114 silly get 'cf-ray': '59764fa4fe54d6e1-FRA', -1114 silly get age: '5657', -1114 silly get 'cache-control': 'public, max-age=300', -1114 silly get etag: '"7f39a9aafcaefe8efbf43a9f2e56c4eb"', -1114 silly get 'last-modified': 'Sun, 27 May 2018 05:41:03 GMT', -1114 silly get vary: 'Accept-Encoding', -1114 silly get 'cf-cache-status': 'HIT', -1114 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1114 silly get server: 'cloudflare', -1114 silly get 'cf-request-id': '02ddd01b1e0000d6e132367200000001' } ] -1115 verbose etag https://registry.npmjs.org/json-stringify-safe from cache -1116 verbose get saving json-stringify-safe to /home/christine/.npm/registry.npmjs.org/json-stringify-safe/.cache.json -1117 silly cache afterAdd http-signature@1.2.0 -1118 verbose afterAdd /home/christine/.npm/http-signature/1.2.0/package/package.json not in flight; writing -1119 verbose afterAdd /home/christine/.npm/combined-stream/1.0.8/package/package.json written -1120 verbose afterAdd /home/christine/.npm/extend/3.0.2/package/package.json written -1121 verbose afterAdd /home/christine/.npm/aws4/1.9.1/package/package.json written -1122 silly resolveWithNewModule isstream@0.1.2 checking installable status -1123 silly cache add args [ 'isstream@~0.1.2', null ] -1124 verbose cache add spec isstream@~0.1.2 -1125 silly cache add parsed spec Result { -1125 silly cache add raw: 'isstream@~0.1.2', -1125 silly cache add scope: null, -1125 silly cache add name: 'isstream', -1125 silly cache add rawSpec: '~0.1.2', -1125 silly cache add spec: '>=0.1.2 <0.2.0', -1125 silly cache add type: 'range' } -1126 silly addNamed isstream@>=0.1.2 <0.2.0 -1127 verbose addNamed ">=0.1.2 <0.2.0" is a valid semver range for isstream -1128 silly addNameRange { name: 'isstream', range: '>=0.1.2 <0.2.0', hasData: false } -1129 silly mapToRegistry name isstream -1130 silly mapToRegistry using default registry -1131 silly mapToRegistry registry https://registry.npmjs.org/ -1132 silly mapToRegistry uri https://registry.npmjs.org/isstream -1133 verbose addNameRange registry:https://registry.npmjs.org/isstream not in flight; fetching -1134 http 304 https://registry.npmjs.org/tunnel-agent -1135 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1135 verbose headers connection: 'keep-alive', -1135 verbose headers 'set-cookie': -1135 verbose headers [ '__cfduid=dd8a9957676dab4f7a1bd7377a7d9ca671590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1135 verbose headers 'cf-ray': '59764fa51970c2f9-FRA', -1135 verbose headers age: '5655', -1135 verbose headers 'cache-control': 'public, max-age=300', -1135 verbose headers etag: '"03911fc1f433b33bccf8a4a2a5de2375"', -1135 verbose headers 'last-modified': 'Sun, 27 May 2018 20:02:57 GMT', -1135 verbose headers vary: 'Accept-Encoding', -1135 verbose headers 'cf-cache-status': 'HIT', -1135 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1135 verbose headers server: 'cloudflare', -1135 verbose headers 'cf-request-id': '02ddd01b2a0000c2f926071200000001' } -1136 silly get cb [ 304, -1136 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1136 silly get connection: 'keep-alive', -1136 silly get 'set-cookie': -1136 silly get [ '__cfduid=dd8a9957676dab4f7a1bd7377a7d9ca671590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1136 silly get 'cf-ray': '59764fa51970c2f9-FRA', -1136 silly get age: '5655', -1136 silly get 'cache-control': 'public, max-age=300', -1136 silly get etag: '"03911fc1f433b33bccf8a4a2a5de2375"', -1136 silly get 'last-modified': 'Sun, 27 May 2018 20:02:57 GMT', -1136 silly get vary: 'Accept-Encoding', -1136 silly get 'cf-cache-status': 'HIT', -1136 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1136 silly get server: 'cloudflare', -1136 silly get 'cf-request-id': '02ddd01b2a0000c2f926071200000001' } ] -1137 verbose etag https://registry.npmjs.org/tunnel-agent from cache -1138 verbose get saving tunnel-agent to /home/christine/.npm/registry.npmjs.org/tunnel-agent/.cache.json -1139 verbose afterAdd /home/christine/.npm/http-signature/1.2.0/package/package.json written -1140 http 304 https://registry.npmjs.org/performance-now -1141 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1141 verbose headers connection: 'keep-alive', -1141 verbose headers 'set-cookie': -1141 verbose headers [ '__cfduid=d42ce80dcff65dca26b6883967f7411d41590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1141 verbose headers 'cf-ray': '59764fa51f721772-FRA', -1141 verbose headers age: '5657', -1141 verbose headers 'cache-control': 'public, max-age=300', -1141 verbose headers etag: '"5f12ad497b3e39323dcdde75c34f5767"', -1141 verbose headers 'last-modified': 'Sun, 27 May 2018 12:05:53 GMT', -1141 verbose headers vary: 'Accept-Encoding', -1141 verbose headers 'cf-cache-status': 'HIT', -1141 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1141 verbose headers server: 'cloudflare', -1141 verbose headers 'cf-request-id': '02ddd01b2a0000177264160200000001' } -1142 silly get cb [ 304, -1142 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1142 silly get connection: 'keep-alive', -1142 silly get 'set-cookie': -1142 silly get [ '__cfduid=d42ce80dcff65dca26b6883967f7411d41590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1142 silly get 'cf-ray': '59764fa51f721772-FRA', -1142 silly get age: '5657', -1142 silly get 'cache-control': 'public, max-age=300', -1142 silly get etag: '"5f12ad497b3e39323dcdde75c34f5767"', -1142 silly get 'last-modified': 'Sun, 27 May 2018 12:05:53 GMT', -1142 silly get vary: 'Accept-Encoding', -1142 silly get 'cf-cache-status': 'HIT', -1142 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1142 silly get server: 'cloudflare', -1142 silly get 'cf-request-id': '02ddd01b2a0000177264160200000001' } ] -1143 verbose etag https://registry.npmjs.org/performance-now from cache -1144 verbose get saving performance-now to /home/christine/.npm/registry.npmjs.org/performance-now/.cache.json -1145 silly resolveWithNewModule json-stringify-safe@5.0.1 checking installable status -1146 silly cache add args [ 'json-stringify-safe@~5.0.1', null ] -1147 verbose cache add spec json-stringify-safe@~5.0.1 -1148 silly cache add parsed spec Result { -1148 silly cache add raw: 'json-stringify-safe@~5.0.1', -1148 silly cache add scope: null, -1148 silly cache add name: 'json-stringify-safe', -1148 silly cache add rawSpec: '~5.0.1', -1148 silly cache add spec: '>=5.0.1 <5.1.0', -1148 silly cache add type: 'range' } -1149 silly addNamed json-stringify-safe@>=5.0.1 <5.1.0 -1150 verbose addNamed ">=5.0.1 <5.1.0" is a valid semver range for json-stringify-safe -1151 silly addNameRange { name: 'json-stringify-safe', -1151 silly addNameRange range: '>=5.0.1 <5.1.0', -1151 silly addNameRange hasData: false } -1152 silly mapToRegistry name json-stringify-safe -1153 silly mapToRegistry using default registry -1154 silly mapToRegistry registry https://registry.npmjs.org/ -1155 silly mapToRegistry uri https://registry.npmjs.org/json-stringify-safe -1156 verbose addNameRange registry:https://registry.npmjs.org/json-stringify-safe not in flight; fetching -1157 verbose get https://registry.npmjs.org/isstream not expired, no request -1158 silly addNameRange number 2 { name: 'isstream', range: '>=0.1.2 <0.2.0', hasData: true } -1159 silly addNameRange versions [ 'isstream', [ '0.0.0', '0.1.0', '0.1.1', '0.1.2' ] ] -1160 silly addNamed isstream@0.1.2 -1161 verbose addNamed "0.1.2" is a plain semver version for isstream -1162 http 200 https://registry.npmjs.org/safe-buffer -1163 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1163 verbose headers 'content-type': 'application/json', -1163 verbose headers 'transfer-encoding': 'chunked', -1163 verbose headers connection: 'keep-alive', -1163 verbose headers 'set-cookie': -1163 verbose headers [ '__cfduid=d242459e8d4d49451c98a98743f04b3251590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1163 verbose headers 'cf-ray': '59764fa51a7b0eab-FRA', -1163 verbose headers age: '5658', -1163 verbose headers 'cache-control': 'public, max-age=300', -1163 verbose headers etag: 'W/"7d10eeac57e4baa4c8bd0dd7caa1703c"', -1163 verbose headers 'last-modified': 'Sun, 10 May 2020 16:37:34 GMT', -1163 verbose headers vary: 'accept-encoding, accept', -1163 verbose headers 'cf-cache-status': 'HIT', -1163 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1163 verbose headers server: 'cloudflare', -1163 verbose headers 'content-encoding': 'gzip', -1163 verbose headers 'cf-request-id': '02ddd01b2a00000eabe9143200000001' } -1164 silly get cb [ 200, -1164 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1164 silly get 'content-type': 'application/json', -1164 silly get 'transfer-encoding': 'chunked', -1164 silly get connection: 'keep-alive', -1164 silly get 'set-cookie': -1164 silly get [ '__cfduid=d242459e8d4d49451c98a98743f04b3251590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1164 silly get 'cf-ray': '59764fa51a7b0eab-FRA', -1164 silly get age: '5658', -1164 silly get 'cache-control': 'public, max-age=300', -1164 silly get etag: 'W/"7d10eeac57e4baa4c8bd0dd7caa1703c"', -1164 silly get 'last-modified': 'Sun, 10 May 2020 16:37:34 GMT', -1164 silly get vary: 'accept-encoding, accept', -1164 silly get 'cf-cache-status': 'HIT', -1164 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1164 silly get server: 'cloudflare', -1164 silly get 'content-encoding': 'gzip', -1164 silly get 'cf-request-id': '02ddd01b2a00000eabe9143200000001' } ] -1165 verbose get saving safe-buffer to /home/christine/.npm/registry.npmjs.org/safe-buffer/.cache.json -1166 http 304 https://registry.npmjs.org/oauth-sign -1167 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1167 verbose headers connection: 'keep-alive', -1167 verbose headers 'set-cookie': -1167 verbose headers [ '__cfduid=d287f9144cf6663f63602865423a0b4ea1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1167 verbose headers 'cf-ray': '59764fa51ff7dfbb-FRA', -1167 verbose headers age: '5355', -1167 verbose headers 'cache-control': 'public, max-age=300', -1167 verbose headers etag: '"3032c1efe9ec61d748d027a1da2bab61"', -1167 verbose headers 'last-modified': 'Thu, 02 Aug 2018 18:04:02 GMT', -1167 verbose headers vary: 'Accept-Encoding', -1167 verbose headers 'cf-cache-status': 'HIT', -1167 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1167 verbose headers server: 'cloudflare', -1167 verbose headers 'cf-request-id': '02ddd01b2a0000dfbb5fa74200000001' } -1168 silly get cb [ 304, -1168 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1168 silly get connection: 'keep-alive', -1168 silly get 'set-cookie': -1168 silly get [ '__cfduid=d287f9144cf6663f63602865423a0b4ea1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1168 silly get 'cf-ray': '59764fa51ff7dfbb-FRA', -1168 silly get age: '5355', -1168 silly get 'cache-control': 'public, max-age=300', -1168 silly get etag: '"3032c1efe9ec61d748d027a1da2bab61"', -1168 silly get 'last-modified': 'Thu, 02 Aug 2018 18:04:02 GMT', -1168 silly get vary: 'Accept-Encoding', -1168 silly get 'cf-cache-status': 'HIT', -1168 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1168 silly get server: 'cloudflare', -1168 silly get 'cf-request-id': '02ddd01b2a0000dfbb5fa74200000001' } ] -1169 verbose etag https://registry.npmjs.org/oauth-sign from cache -1170 verbose get saving oauth-sign to /home/christine/.npm/registry.npmjs.org/oauth-sign/.cache.json -1171 verbose get https://registry.npmjs.org/json-stringify-safe not expired, no request -1172 silly addNameRange number 2 { name: 'json-stringify-safe', -1172 silly addNameRange range: '>=5.0.1 <5.1.0', -1172 silly addNameRange hasData: true } -1173 silly addNameRange versions [ 'json-stringify-safe', -1173 silly addNameRange [ '2.0.0', '3.0.0', '4.0.0', '5.0.0', '5.0.1' ] ] -1174 silly addNamed json-stringify-safe@5.0.1 -1175 verbose addNamed "5.0.1" is a plain semver version for json-stringify-safe -1176 silly resolveWithNewModule tunnel-agent@0.6.0 checking installable status -1177 silly cache add args [ 'tunnel-agent@^0.6.0', null ] -1178 verbose cache add spec tunnel-agent@^0.6.0 -1179 silly cache add parsed spec Result { -1179 silly cache add raw: 'tunnel-agent@^0.6.0', -1179 silly cache add scope: null, -1179 silly cache add name: 'tunnel-agent', -1179 silly cache add rawSpec: '^0.6.0', -1179 silly cache add spec: '>=0.6.0 <0.7.0', -1179 silly cache add type: 'range' } -1180 silly addNamed tunnel-agent@>=0.6.0 <0.7.0 -1181 verbose addNamed ">=0.6.0 <0.7.0" is a valid semver range for tunnel-agent -1182 silly addNameRange { name: 'tunnel-agent', range: '>=0.6.0 <0.7.0', hasData: false } -1183 silly mapToRegistry name tunnel-agent -1184 silly mapToRegistry using default registry -1185 silly mapToRegistry registry https://registry.npmjs.org/ -1186 silly mapToRegistry uri https://registry.npmjs.org/tunnel-agent -1187 verbose addNameRange registry:https://registry.npmjs.org/tunnel-agent not in flight; fetching -1188 silly resolveWithNewModule performance-now@2.1.0 checking installable status -1189 silly cache add args [ 'performance-now@^2.1.0', null ] -1190 verbose cache add spec performance-now@^2.1.0 -1191 silly cache add parsed spec Result { -1191 silly cache add raw: 'performance-now@^2.1.0', -1191 silly cache add scope: null, -1191 silly cache add name: 'performance-now', -1191 silly cache add rawSpec: '^2.1.0', -1191 silly cache add spec: '>=2.1.0 <3.0.0', -1191 silly cache add type: 'range' } -1192 silly addNamed performance-now@>=2.1.0 <3.0.0 -1193 verbose addNamed ">=2.1.0 <3.0.0" is a valid semver range for performance-now -1194 silly addNameRange { name: 'performance-now', -1194 silly addNameRange range: '>=2.1.0 <3.0.0', -1194 silly addNameRange hasData: false } -1195 silly mapToRegistry name performance-now -1196 silly mapToRegistry using default registry -1197 silly mapToRegistry registry https://registry.npmjs.org/ -1198 silly mapToRegistry uri https://registry.npmjs.org/performance-now -1199 verbose addNameRange registry:https://registry.npmjs.org/performance-now not in flight; fetching -1200 silly cache afterAdd isstream@0.1.2 -1201 verbose afterAdd /home/christine/.npm/isstream/0.1.2/package/package.json not in flight; writing -1202 http 200 https://registry.npmjs.org/tough-cookie -1203 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1203 verbose headers 'content-type': 'application/json', -1203 verbose headers 'transfer-encoding': 'chunked', -1203 verbose headers connection: 'keep-alive', -1203 verbose headers 'set-cookie': -1203 verbose headers [ '__cfduid=d898cd72de597ecab2d8a354f76a0072c1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1203 verbose headers 'cf-ray': '59764fa518cb05e9-FRA', -1203 verbose headers age: '5655', -1203 verbose headers 'cache-control': 'public, max-age=300', -1203 verbose headers etag: 'W/"818fa172eb6f27e219e81140db530363"', -1203 verbose headers 'last-modified': 'Thu, 19 Mar 2020 19:20:30 GMT', -1203 verbose headers vary: 'accept-encoding, accept', -1203 verbose headers 'cf-cache-status': 'HIT', -1203 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1203 verbose headers server: 'cloudflare', -1203 verbose headers 'content-encoding': 'gzip', -1203 verbose headers 'cf-request-id': '02ddd01b2a000005e903b1d200000001' } -1204 silly get cb [ 200, -1204 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1204 silly get 'content-type': 'application/json', -1204 silly get 'transfer-encoding': 'chunked', -1204 silly get connection: 'keep-alive', -1204 silly get 'set-cookie': -1204 silly get [ '__cfduid=d898cd72de597ecab2d8a354f76a0072c1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1204 silly get 'cf-ray': '59764fa518cb05e9-FRA', -1204 silly get age: '5655', -1204 silly get 'cache-control': 'public, max-age=300', -1204 silly get etag: 'W/"818fa172eb6f27e219e81140db530363"', -1204 silly get 'last-modified': 'Thu, 19 Mar 2020 19:20:30 GMT', -1204 silly get vary: 'accept-encoding, accept', -1204 silly get 'cf-cache-status': 'HIT', -1204 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1204 silly get server: 'cloudflare', -1204 silly get 'content-encoding': 'gzip', -1204 silly get 'cf-request-id': '02ddd01b2a000005e903b1d200000001' } ] -1205 verbose get saving tough-cookie to /home/christine/.npm/registry.npmjs.org/tough-cookie/.cache.json -1206 silly cache afterAdd json-stringify-safe@5.0.1 -1207 verbose afterAdd /home/christine/.npm/json-stringify-safe/5.0.1/package/package.json not in flight; writing -1208 silly resolveWithNewModule safe-buffer@5.2.1 checking installable status -1209 silly cache add args [ 'safe-buffer@^5.1.2', null ] -1210 verbose cache add spec safe-buffer@^5.1.2 -1211 silly cache add parsed spec Result { -1211 silly cache add raw: 'safe-buffer@^5.1.2', -1211 silly cache add scope: null, -1211 silly cache add name: 'safe-buffer', -1211 silly cache add rawSpec: '^5.1.2', -1211 silly cache add spec: '>=5.1.2 <6.0.0', -1211 silly cache add type: 'range' } -1212 silly addNamed safe-buffer@>=5.1.2 <6.0.0 -1213 verbose addNamed ">=5.1.2 <6.0.0" is a valid semver range for safe-buffer -1214 silly addNameRange { name: 'safe-buffer', range: '>=5.1.2 <6.0.0', hasData: false } -1215 silly mapToRegistry name safe-buffer -1216 silly mapToRegistry using default registry -1217 silly mapToRegistry registry https://registry.npmjs.org/ -1218 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer -1219 verbose addNameRange registry:https://registry.npmjs.org/safe-buffer not in flight; fetching -1220 http 200 https://registry.npmjs.org/mime-types -1221 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1221 verbose headers 'content-type': 'application/json', -1221 verbose headers 'transfer-encoding': 'chunked', -1221 verbose headers connection: 'keep-alive', -1221 verbose headers 'set-cookie': -1221 verbose headers [ '__cfduid=d8091989cd66bf129670ccfa4d20cf63d1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1221 verbose headers 'cf-ray': '59764fa51e27c2ae-FRA', -1221 verbose headers age: '5656', -1221 verbose headers 'cache-control': 'public, max-age=300', -1221 verbose headers etag: 'W/"b0572cbc8ddbbb6b61205820d06deb3a"', -1221 verbose headers 'last-modified': 'Fri, 24 Apr 2020 03:36:16 GMT', -1221 verbose headers vary: 'accept-encoding, accept', -1221 verbose headers 'cf-cache-status': 'HIT', -1221 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1221 verbose headers server: 'cloudflare', -1221 verbose headers 'content-encoding': 'gzip', -1221 verbose headers 'cf-request-id': '02ddd01b2a0000c2aea0161200000001' } -1222 silly get cb [ 200, -1222 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1222 silly get 'content-type': 'application/json', -1222 silly get 'transfer-encoding': 'chunked', -1222 silly get connection: 'keep-alive', -1222 silly get 'set-cookie': -1222 silly get [ '__cfduid=d8091989cd66bf129670ccfa4d20cf63d1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1222 silly get 'cf-ray': '59764fa51e27c2ae-FRA', -1222 silly get age: '5656', -1222 silly get 'cache-control': 'public, max-age=300', -1222 silly get etag: 'W/"b0572cbc8ddbbb6b61205820d06deb3a"', -1222 silly get 'last-modified': 'Fri, 24 Apr 2020 03:36:16 GMT', -1222 silly get vary: 'accept-encoding, accept', -1222 silly get 'cf-cache-status': 'HIT', -1222 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1222 silly get server: 'cloudflare', -1222 silly get 'content-encoding': 'gzip', -1222 silly get 'cf-request-id': '02ddd01b2a0000c2aea0161200000001' } ] -1223 verbose get saving mime-types to /home/christine/.npm/registry.npmjs.org/mime-types/.cache.json -1224 verbose get https://registry.npmjs.org/tunnel-agent not expired, no request -1225 silly addNameRange number 2 { name: 'tunnel-agent', range: '>=0.6.0 <0.7.0', hasData: true } -1226 silly addNameRange versions [ 'tunnel-agent', -1226 silly addNameRange [ '0.2.0', -1226 silly addNameRange '0.3.0', -1226 silly addNameRange '0.4.0', -1226 silly addNameRange '0.4.1', -1226 silly addNameRange '0.4.2', -1226 silly addNameRange '0.4.3', -1226 silly addNameRange '0.5.0', -1226 silly addNameRange '0.6.0' ] ] -1227 silly addNamed tunnel-agent@0.6.0 -1228 verbose addNamed "0.6.0" is a plain semver version for tunnel-agent -1229 silly resolveWithNewModule oauth-sign@0.9.0 checking installable status -1230 silly cache add args [ 'oauth-sign@~0.9.0', null ] -1231 verbose cache add spec oauth-sign@~0.9.0 -1232 silly cache add parsed spec Result { -1232 silly cache add raw: 'oauth-sign@~0.9.0', -1232 silly cache add scope: null, -1232 silly cache add name: 'oauth-sign', -1232 silly cache add rawSpec: '~0.9.0', -1232 silly cache add spec: '>=0.9.0 <0.10.0', -1232 silly cache add type: 'range' } -1233 silly addNamed oauth-sign@>=0.9.0 <0.10.0 -1234 verbose addNamed ">=0.9.0 <0.10.0" is a valid semver range for oauth-sign -1235 silly addNameRange { name: 'oauth-sign', range: '>=0.9.0 <0.10.0', hasData: false } -1236 silly mapToRegistry name oauth-sign -1237 silly mapToRegistry using default registry -1238 silly mapToRegistry registry https://registry.npmjs.org/ -1239 silly mapToRegistry uri https://registry.npmjs.org/oauth-sign -1240 verbose addNameRange registry:https://registry.npmjs.org/oauth-sign not in flight; fetching -1241 verbose get https://registry.npmjs.org/performance-now not expired, no request -1242 silly addNameRange number 2 { name: 'performance-now', -1242 silly addNameRange range: '>=2.1.0 <3.0.0', -1242 silly addNameRange hasData: true } -1243 silly addNameRange versions [ 'performance-now', -1243 silly addNameRange [ '0.1.0', -1243 silly addNameRange '0.1.1', -1243 silly addNameRange '0.1.2', -1243 silly addNameRange '0.1.3', -1243 silly addNameRange '0.1.4', -1243 silly addNameRange '0.2.0', -1243 silly addNameRange '1.0.0', -1243 silly addNameRange '1.0.1', -1243 silly addNameRange '1.0.2', -1243 silly addNameRange '2.0.0', -1243 silly addNameRange '2.1.0' ] ] -1244 silly addNamed performance-now@2.1.0 -1245 verbose addNamed "2.1.0" is a plain semver version for performance-now -1246 verbose afterAdd /home/christine/.npm/isstream/0.1.2/package/package.json written -1247 http 200 https://registry.npmjs.org/uuid -1248 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1248 verbose headers 'content-type': 'application/json', -1248 verbose headers 'transfer-encoding': 'chunked', -1248 verbose headers connection: 'keep-alive', -1248 verbose headers 'set-cookie': -1248 verbose headers [ '__cfduid=d42e977fd11818895c4979b1006ea23be1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1248 verbose headers 'cf-ray': '59764fa5195d1f2d-FRA', -1248 verbose headers age: '5355', -1248 verbose headers 'cache-control': 'public, max-age=300', -1248 verbose headers etag: 'W/"3fc4e0f16b6e5d55bc0144a7f38b6e49"', -1248 verbose headers 'last-modified': 'Wed, 20 May 2020 18:52:41 GMT', -1248 verbose headers vary: 'accept-encoding, accept', -1248 verbose headers 'cf-cache-status': 'HIT', -1248 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1248 verbose headers server: 'cloudflare', -1248 verbose headers 'content-encoding': 'gzip', -1248 verbose headers 'cf-request-id': '02ddd01b2a00001f2df51ed200000001' } -1249 silly get cb [ 200, -1249 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1249 silly get 'content-type': 'application/json', -1249 silly get 'transfer-encoding': 'chunked', -1249 silly get connection: 'keep-alive', -1249 silly get 'set-cookie': -1249 silly get [ '__cfduid=d42e977fd11818895c4979b1006ea23be1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1249 silly get 'cf-ray': '59764fa5195d1f2d-FRA', -1249 silly get age: '5355', -1249 silly get 'cache-control': 'public, max-age=300', -1249 silly get etag: 'W/"3fc4e0f16b6e5d55bc0144a7f38b6e49"', -1249 silly get 'last-modified': 'Wed, 20 May 2020 18:52:41 GMT', -1249 silly get vary: 'accept-encoding, accept', -1249 silly get 'cf-cache-status': 'HIT', -1249 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1249 silly get server: 'cloudflare', -1249 silly get 'content-encoding': 'gzip', -1249 silly get 'cf-request-id': '02ddd01b2a00001f2df51ed200000001' } ] -1250 verbose get saving uuid to /home/christine/.npm/registry.npmjs.org/uuid/.cache.json -1251 verbose get https://registry.npmjs.org/safe-buffer not expired, no request -1252 silly addNameRange number 2 { name: 'safe-buffer', range: '>=5.1.2 <6.0.0', hasData: true } -1253 silly addNameRange versions [ 'safe-buffer', -1253 silly addNameRange [ '1.0.0', -1253 silly addNameRange '2.0.0', -1253 silly addNameRange '3.0.0', -1253 silly addNameRange '4.0.0', -1253 silly addNameRange '5.0.0', -1253 silly addNameRange '5.0.1', -1253 silly addNameRange '5.1.0', -1253 silly addNameRange '5.1.1', -1253 silly addNameRange '5.1.2', -1253 silly addNameRange '5.2.0', -1253 silly addNameRange '5.2.1' ] ] -1254 silly addNamed safe-buffer@5.2.1 -1255 verbose addNamed "5.2.1" is a plain semver version for safe-buffer -1256 verbose afterAdd /home/christine/.npm/json-stringify-safe/5.0.1/package/package.json written -1257 verbose get https://registry.npmjs.org/oauth-sign not expired, no request -1258 silly addNameRange number 2 { name: 'oauth-sign', range: '>=0.9.0 <0.10.0', hasData: true } -1259 silly addNameRange versions [ 'oauth-sign', -1259 silly addNameRange [ '0.2.0', -1259 silly addNameRange '0.3.0', -1259 silly addNameRange '0.4.0', -1259 silly addNameRange '0.5.0', -1259 silly addNameRange '0.6.0', -1259 silly addNameRange '0.7.0', -1259 silly addNameRange '0.8.0', -1259 silly addNameRange '0.8.1', -1259 silly addNameRange '0.8.2', -1259 silly addNameRange '0.9.0' ] ] -1260 silly addNamed oauth-sign@0.9.0 -1261 verbose addNamed "0.9.0" is a plain semver version for oauth-sign -1262 silly mapToRegistry name safe-buffer -1263 silly mapToRegistry using default registry -1264 silly mapToRegistry registry https://registry.npmjs.org/ -1265 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer -1266 verbose addRemoteTarball https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz not in flight; adding -1267 verbose addRemoteTarball [ 'https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz', -1267 verbose addRemoteTarball '1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6' ] -1268 silly resolveWithNewModule tough-cookie@2.5.0 checking installable status -1269 silly cache add args [ 'tough-cookie@~2.5.0', null ] -1270 verbose cache add spec tough-cookie@~2.5.0 -1271 silly cache add parsed spec Result { -1271 silly cache add raw: 'tough-cookie@~2.5.0', -1271 silly cache add scope: null, -1271 silly cache add name: 'tough-cookie', -1271 silly cache add rawSpec: '~2.5.0', -1271 silly cache add spec: '>=2.5.0 <2.6.0', -1271 silly cache add type: 'range' } -1272 silly addNamed tough-cookie@>=2.5.0 <2.6.0 -1273 verbose addNamed ">=2.5.0 <2.6.0" is a valid semver range for tough-cookie -1274 silly addNameRange { name: 'tough-cookie', range: '>=2.5.0 <2.6.0', hasData: false } -1275 silly mapToRegistry name tough-cookie -1276 silly mapToRegistry using default registry -1277 silly mapToRegistry registry https://registry.npmjs.org/ -1278 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie -1279 verbose addNameRange registry:https://registry.npmjs.org/tough-cookie not in flight; fetching -1280 silly cache afterAdd tunnel-agent@0.6.0 -1281 verbose afterAdd /home/christine/.npm/tunnel-agent/0.6.0/package/package.json not in flight; writing -1282 silly cache afterAdd performance-now@2.1.0 -1283 verbose afterAdd /home/christine/.npm/performance-now/2.1.0/package/package.json not in flight; writing -1284 silly resolveWithNewModule mime-types@2.1.27 checking installable status -1285 silly cache add args [ 'mime-types@~2.1.19', null ] -1286 verbose cache add spec mime-types@~2.1.19 -1287 silly cache add parsed spec Result { -1287 silly cache add raw: 'mime-types@~2.1.19', -1287 silly cache add scope: null, -1287 silly cache add name: 'mime-types', -1287 silly cache add rawSpec: '~2.1.19', -1287 silly cache add spec: '>=2.1.19 <2.2.0', -1287 silly cache add type: 'range' } -1288 silly addNamed mime-types@>=2.1.19 <2.2.0 -1289 verbose addNamed ">=2.1.19 <2.2.0" is a valid semver range for mime-types -1290 silly addNameRange { name: 'mime-types', range: '>=2.1.19 <2.2.0', hasData: false } -1291 silly mapToRegistry name mime-types -1292 silly mapToRegistry using default registry -1293 silly mapToRegistry registry https://registry.npmjs.org/ -1294 silly mapToRegistry uri https://registry.npmjs.org/mime-types -1295 verbose addNameRange registry:https://registry.npmjs.org/mime-types not in flight; fetching -1296 http 200 https://registry.npmjs.org/qs -1297 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1297 verbose headers 'content-type': 'application/json', -1297 verbose headers 'transfer-encoding': 'chunked', -1297 verbose headers connection: 'keep-alive', -1297 verbose headers 'set-cookie': -1297 verbose headers [ '__cfduid=dd8aaa3b832fe3de3ea175ff8604d63411590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1297 verbose headers 'cf-ray': '59764fa5183d176a-FRA', -1297 verbose headers age: '5657', -1297 verbose headers 'cache-control': 'public, max-age=300', -1297 verbose headers etag: 'W/"679aa380b84cf75f89f99363ed5f9c98"', -1297 verbose headers 'last-modified': 'Sun, 03 May 2020 21:52:54 GMT', -1297 verbose headers vary: 'accept-encoding, accept', -1297 verbose headers 'cf-cache-status': 'HIT', -1297 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1297 verbose headers server: 'cloudflare', -1297 verbose headers 'content-encoding': 'gzip', -1297 verbose headers 'cf-request-id': '02ddd01b2a0000176a65b45200000001' } -1298 silly get cb [ 200, -1298 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1298 silly get 'content-type': 'application/json', -1298 silly get 'transfer-encoding': 'chunked', -1298 silly get connection: 'keep-alive', -1298 silly get 'set-cookie': -1298 silly get [ '__cfduid=dd8aaa3b832fe3de3ea175ff8604d63411590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1298 silly get 'cf-ray': '59764fa5183d176a-FRA', -1298 silly get age: '5657', -1298 silly get 'cache-control': 'public, max-age=300', -1298 silly get etag: 'W/"679aa380b84cf75f89f99363ed5f9c98"', -1298 silly get 'last-modified': 'Sun, 03 May 2020 21:52:54 GMT', -1298 silly get vary: 'accept-encoding, accept', -1298 silly get 'cf-cache-status': 'HIT', -1298 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1298 silly get server: 'cloudflare', -1298 silly get 'content-encoding': 'gzip', -1298 silly get 'cf-request-id': '02ddd01b2a0000176a65b45200000001' } ] -1299 verbose get saving qs to /home/christine/.npm/registry.npmjs.org/qs/.cache.json -1300 info retry fetch attempt 1 at 13:48:57 -1301 info attempt registry request try #1 at 13:48:57 -1302 http fetch GET https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz -1303 verbose get https://registry.npmjs.org/tough-cookie not expired, no request -1304 silly addNameRange number 2 { name: 'tough-cookie', range: '>=2.5.0 <2.6.0', hasData: true } -1305 silly addNameRange versions [ 'tough-cookie', -1305 silly addNameRange [ '0.9.0', -1305 silly addNameRange '0.9.1', -1305 silly addNameRange '0.9.3', -1305 silly addNameRange '0.9.4', -1305 silly addNameRange '0.9.5', -1305 silly addNameRange '0.9.6', -1305 silly addNameRange '0.9.7', -1305 silly addNameRange '0.9.8', -1305 silly addNameRange '0.9.9', -1305 silly addNameRange '0.9.11', -1305 silly addNameRange '0.9.12', -1305 silly addNameRange '0.9.13', -1305 silly addNameRange '0.9.14', -1305 silly addNameRange '0.9.15', -1305 silly addNameRange '0.10.0', -1305 silly addNameRange '0.11.0', -1305 silly addNameRange '0.12.0', -1305 silly addNameRange '0.12.1', -1305 silly addNameRange '0.13.0', -1305 silly addNameRange '1.0.0', -1305 silly addNameRange '1.1.0', -1305 silly addNameRange '1.2.0', -1305 silly addNameRange '2.0.0', -1305 silly addNameRange '2.1.0', -1305 silly addNameRange '2.2.0', -1305 silly addNameRange '2.2.1', -1305 silly addNameRange '2.2.2', -1305 silly addNameRange '2.3.0', -1305 silly addNameRange '2.3.1', -1305 silly addNameRange '2.3.2', -1305 silly addNameRange '2.3.3', -1305 silly addNameRange '2.3.4', -1305 silly addNameRange '2.4.2', -1305 silly addNameRange '2.4.3', -1305 silly addNameRange '2.5.0', -1305 silly addNameRange '3.0.0', -1305 silly addNameRange '3.0.1', -1305 silly addNameRange '4.0.0' ] ] -1306 silly addNamed tough-cookie@2.5.0 -1307 verbose addNamed "2.5.0" is a plain semver version for tough-cookie -1308 silly cache afterAdd oauth-sign@0.9.0 -1309 verbose afterAdd /home/christine/.npm/oauth-sign/0.9.0/package/package.json not in flight; writing -1310 silly resolveWithNewModule uuid@3.4.0 checking installable status -1311 silly cache add args [ 'uuid@^3.3.2', null ] -1312 verbose cache add spec uuid@^3.3.2 -1313 silly cache add parsed spec Result { -1313 silly cache add raw: 'uuid@^3.3.2', -1313 silly cache add scope: null, -1313 silly cache add name: 'uuid', -1313 silly cache add rawSpec: '^3.3.2', -1313 silly cache add spec: '>=3.3.2 <4.0.0', -1313 silly cache add type: 'range' } -1314 silly addNamed uuid@>=3.3.2 <4.0.0 -1315 verbose addNamed ">=3.3.2 <4.0.0" is a valid semver range for uuid -1316 silly addNameRange { name: 'uuid', range: '>=3.3.2 <4.0.0', hasData: false } -1317 silly mapToRegistry name uuid -1318 silly mapToRegistry using default registry -1319 silly mapToRegistry registry https://registry.npmjs.org/ -1320 silly mapToRegistry uri https://registry.npmjs.org/uuid -1321 verbose addNameRange registry:https://registry.npmjs.org/uuid not in flight; fetching -1322 verbose afterAdd /home/christine/.npm/tunnel-agent/0.6.0/package/package.json written -1323 silly mapToRegistry name tough-cookie -1324 silly mapToRegistry using default registry -1325 silly mapToRegistry registry https://registry.npmjs.org/ -1326 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie -1327 verbose addRemoteTarball https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz not in flight; adding -1328 verbose addRemoteTarball [ 'https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz', -1328 verbose addRemoteTarball 'cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2' ] -1329 verbose afterAdd /home/christine/.npm/performance-now/2.1.0/package/package.json written -1330 verbose get https://registry.npmjs.org/mime-types not expired, no request -1331 silly addNameRange number 2 { name: 'mime-types', range: '>=2.1.19 <2.2.0', hasData: true } -1332 silly addNameRange versions [ 'mime-types', -1332 silly addNameRange [ '0.1.0', -1332 silly addNameRange '1.0.0', -1332 silly addNameRange '1.0.1', -1332 silly addNameRange '1.0.2', -1332 silly addNameRange '2.0.0', -1332 silly addNameRange '2.0.1', -1332 silly addNameRange '2.0.2', -1332 silly addNameRange '2.0.3', -1332 silly addNameRange '2.0.4', -1332 silly addNameRange '2.0.5', -1332 silly addNameRange '2.0.6', -1332 silly addNameRange '2.0.7', -1332 silly addNameRange '2.0.8', -1332 silly addNameRange '2.0.9', -1332 silly addNameRange '2.0.10', -1332 silly addNameRange '2.0.11', -1332 silly addNameRange '2.0.12', -1332 silly addNameRange '2.0.13', -1332 silly addNameRange '2.0.14', -1332 silly addNameRange '2.1.0', -1332 silly addNameRange '2.1.1', -1332 silly addNameRange '2.1.2', -1332 silly addNameRange '2.1.3', -1332 silly addNameRange '2.1.4', -1332 silly addNameRange '2.1.5', -1332 silly addNameRange '2.1.6', -1332 silly addNameRange '2.1.7', -1332 silly addNameRange '2.1.8', -1332 silly addNameRange '2.1.9', -1332 silly addNameRange '2.1.10', -1332 silly addNameRange '2.1.11', -1332 silly addNameRange '2.1.12', -1332 silly addNameRange '2.1.13', -1332 silly addNameRange '2.1.14', -1332 silly addNameRange '2.1.15', -1332 silly addNameRange '2.1.16', -1332 silly addNameRange '2.1.17', -1332 silly addNameRange '2.1.18', -1332 silly addNameRange '2.1.19', -1332 silly addNameRange '2.1.20', -1332 silly addNameRange '2.1.21', -1332 silly addNameRange '2.1.22', -1332 silly addNameRange '2.1.23', -1332 silly addNameRange '2.1.24', -1332 silly addNameRange '2.1.25', -1332 silly addNameRange '2.1.26', -1332 silly addNameRange '2.1.27' ] ] -1333 silly addNamed mime-types@2.1.27 -1334 verbose addNamed "2.1.27" is a plain semver version for mime-types -1335 silly mapToRegistry name mime-types -1336 silly mapToRegistry using default registry -1337 silly mapToRegistry registry https://registry.npmjs.org/ -1338 silly mapToRegistry uri https://registry.npmjs.org/mime-types -1339 verbose addRemoteTarball https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz not in flight; adding -1340 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz', -1340 verbose addRemoteTarball '47949f98e279ea53119f5722e0f34e529bec009f' ] -1341 info retry fetch attempt 1 at 13:48:57 -1342 info attempt registry request try #1 at 13:48:57 -1343 http fetch GET https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz -1344 verbose get https://registry.npmjs.org/uuid not expired, no request -1345 silly addNameRange number 2 { name: 'uuid', range: '>=3.3.2 <4.0.0', hasData: true } -1346 silly addNameRange versions [ 'uuid', -1346 silly addNameRange [ '0.0.1', -1346 silly addNameRange '0.0.2', -1346 silly addNameRange '1.4.0', -1346 silly addNameRange '1.4.1', -1346 silly addNameRange '1.4.2', -1346 silly addNameRange '2.0.0', -1346 silly addNameRange '2.0.1', -1346 silly addNameRange '2.0.2', -1346 silly addNameRange '2.0.3', -1346 silly addNameRange '3.0.0', -1346 silly addNameRange '3.0.1', -1346 silly addNameRange '3.1.0', -1346 silly addNameRange '3.2.0', -1346 silly addNameRange '3.2.1', -1346 silly addNameRange '3.3.0', -1346 silly addNameRange '3.3.2', -1346 silly addNameRange '3.3.3', -1346 silly addNameRange '3.4.0', -1346 silly addNameRange '7.0.0-beta.0', -1346 silly addNameRange '7.0.0', -1346 silly addNameRange '7.0.1', -1346 silly addNameRange '7.0.2-beta.0', -1346 silly addNameRange '7.0.2', -1346 silly addNameRange '7.0.3', -1346 silly addNameRange '8.0.0-beta.0', -1346 silly addNameRange '8.0.0', -1346 silly addNameRange '8.1.0' ] ] -1347 silly addNamed uuid@3.4.0 -1348 verbose addNamed "3.4.0" is a plain semver version for uuid -1349 silly resolveWithNewModule qs@6.5.2 checking installable status -1350 silly cache add args [ 'qs@~6.5.2', null ] -1351 verbose cache add spec qs@~6.5.2 -1352 silly cache add parsed spec Result { -1352 silly cache add raw: 'qs@~6.5.2', -1352 silly cache add scope: null, -1352 silly cache add name: 'qs', -1352 silly cache add rawSpec: '~6.5.2', -1352 silly cache add spec: '>=6.5.2 <6.6.0', -1352 silly cache add type: 'range' } -1353 silly addNamed qs@>=6.5.2 <6.6.0 -1354 verbose addNamed ">=6.5.2 <6.6.0" is a valid semver range for qs -1355 silly addNameRange { name: 'qs', range: '>=6.5.2 <6.6.0', hasData: false } -1356 silly mapToRegistry name qs -1357 silly mapToRegistry using default registry -1358 silly mapToRegistry registry https://registry.npmjs.org/ -1359 silly mapToRegistry uri https://registry.npmjs.org/qs -1360 verbose addNameRange registry:https://registry.npmjs.org/qs not in flight; fetching -1361 verbose afterAdd /home/christine/.npm/oauth-sign/0.9.0/package/package.json written -1362 http fetch 200 https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz -1363 info retry fetch attempt 1 at 13:48:57 -1364 info attempt registry request try #1 at 13:48:57 -1365 http fetch GET https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz -1366 verbose get https://registry.npmjs.org/qs not expired, no request -1367 silly addNameRange number 2 { name: 'qs', range: '>=6.5.2 <6.6.0', hasData: true } -1368 silly addNameRange versions [ 'qs', -1368 silly addNameRange [ '0.0.1', -1368 silly addNameRange '0.0.2', -1368 silly addNameRange '0.0.3', -1368 silly addNameRange '0.0.4', -1368 silly addNameRange '0.0.5', -1368 silly addNameRange '0.0.6', -1368 silly addNameRange '0.0.7', -1368 silly addNameRange '0.1.0', -1368 silly addNameRange '0.2.0', -1368 silly addNameRange '0.3.0', -1368 silly addNameRange '0.3.1', -1368 silly addNameRange '0.3.2', -1368 silly addNameRange '0.4.0', -1368 silly addNameRange '0.4.1', -1368 silly addNameRange '0.4.2', -1368 silly addNameRange '0.5.0', -1368 silly addNameRange '0.5.1', -1368 silly addNameRange '0.5.2', -1368 silly addNameRange '0.5.3', -1368 silly addNameRange '0.5.4', -1368 silly addNameRange '0.5.5', -1368 silly addNameRange '0.5.6', -1368 silly addNameRange '0.6.0', -1368 silly addNameRange '0.6.1', -1368 silly addNameRange '0.6.2', -1368 silly addNameRange '0.6.3', -1368 silly addNameRange '0.6.4', -1368 silly addNameRange '0.6.5', -1368 silly addNameRange '0.6.6', -1368 silly addNameRange '1.0.0', -1368 silly addNameRange '1.0.1', -1368 silly addNameRange '1.0.2', -1368 silly addNameRange '1.1.0', -1368 silly addNameRange '1.2.0', -1368 silly addNameRange '1.2.1', -1368 silly addNameRange '1.2.2', -1368 silly addNameRange '2.0.0', -1368 silly addNameRange '2.1.0', -1368 silly addNameRange '2.2.0', -1368 silly addNameRange '2.2.1', -1368 silly addNameRange '2.2.2', -1368 silly addNameRange '2.2.3', -1368 silly addNameRange '2.2.4', -1368 silly addNameRange '2.2.5', -1368 silly addNameRange '2.3.0', -1368 silly addNameRange '2.3.1', -1368 silly addNameRange '2.3.2', -1368 silly addNameRange '2.3.3', -1368 silly addNameRange '2.4.0', -1368 silly addNameRange '2.4.1', -1368 silly addNameRange '2.4.2', -1368 silly addNameRange '3.0.0', -1368 silly addNameRange '3.1.0', -1368 silly addNameRange '4.0.0', -1368 silly addNameRange '5.0.0', -1368 silly addNameRange '5.1.0', -1368 silly addNameRange '5.2.0', -1368 silly addNameRange '6.0.0', -1368 silly addNameRange '6.0.1', -1368 silly addNameRange '6.0.2', -1368 silly addNameRange '6.1.0', -1368 silly addNameRange '6.2.0', -1368 silly addNameRange '5.2.1', -1368 silly addNameRange '6.2.1', -1368 silly addNameRange '6.3.0', -1368 silly addNameRange '6.3.1', -1368 silly addNameRange '6.1.1', -1368 silly addNameRange '6.0.3', -1368 silly addNameRange '6.2.2', -1368 silly addNameRange '6.4.0', -1368 silly addNameRange '6.3.2', -1368 silly addNameRange '6.2.3', -1368 silly addNameRange '6.1.2', -1368 silly addNameRange '6.0.4', -1368 silly addNameRange '6.5.0', -1368 silly addNameRange '6.5.1', -1368 silly addNameRange '6.5.2', -1368 silly addNameRange '6.6.0', -1368 silly addNameRange '6.7.0', -1368 silly addNameRange '6.8.0', -1368 silly addNameRange '6.9.0', -1368 silly addNameRange '6.9.1', -1368 silly addNameRange '6.9.2', -1368 silly addNameRange '6.8.1', -1368 silly addNameRange '6.7.1', -1368 silly addNameRange '6.7.2', -1368 silly addNameRange '6.8.2', -1368 silly addNameRange '6.9.3', -1368 silly addNameRange '6.9.4' ] ] -1369 silly addNamed qs@6.5.2 -1370 verbose addNamed "6.5.2" is a plain semver version for qs -1371 silly fetchAndShaCheck shasum 1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6 -1372 http fetch 200 https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz -1373 silly cache afterAdd uuid@3.4.0 -1374 verbose afterAdd /home/christine/.npm/uuid/3.4.0/package/package.json not in flight; writing -1375 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz not in flight; adding -1376 verbose addTmpTarball already have metadata; skipping unpack for safe-buffer@5.2.1 -1377 silly cache afterAdd qs@6.5.2 -1378 verbose afterAdd /home/christine/.npm/qs/6.5.2/package/package.json not in flight; writing -1379 verbose afterAdd /home/christine/.npm/uuid/3.4.0/package/package.json written -1380 silly fetchAndShaCheck shasum cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2 -1381 verbose afterAdd /home/christine/.npm/qs/6.5.2/package/package.json written -1382 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz not in flight; adding -1383 verbose addTmpTarball already have metadata; skipping unpack for tough-cookie@2.5.0 -1384 silly cache afterAdd safe-buffer@5.2.1 -1385 verbose afterAdd /home/christine/.npm/safe-buffer/5.2.1/package/package.json not in flight; writing -1386 verbose afterAdd /home/christine/.npm/safe-buffer/5.2.1/package/package.json written -1387 silly cache afterAdd tough-cookie@2.5.0 -1388 verbose afterAdd /home/christine/.npm/tough-cookie/2.5.0/package/package.json not in flight; writing -1389 verbose afterAdd /home/christine/.npm/tough-cookie/2.5.0/package/package.json written -1390 http fetch 200 https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz -1391 silly fetchAndShaCheck shasum 47949f98e279ea53119f5722e0f34e529bec009f -1392 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz not in flight; adding -1393 verbose addTmpTarball already have metadata; skipping unpack for mime-types@2.1.27 -1394 silly cache afterAdd mime-types@2.1.27 -1395 verbose afterAdd /home/christine/.npm/mime-types/2.1.27/package/package.json not in flight; writing -1396 verbose afterAdd /home/christine/.npm/mime-types/2.1.27/package/package.json written -1397 silly fetchNamedPackageData delayed-stream -1398 silly mapToRegistry name delayed-stream -1399 silly mapToRegistry using default registry -1400 silly mapToRegistry registry https://registry.npmjs.org/ -1401 silly mapToRegistry uri https://registry.npmjs.org/delayed-stream -1402 verbose request uri https://registry.npmjs.org/delayed-stream -1403 verbose request no auth needed -1404 info attempt registry request try #1 at 13:48:57 -1405 verbose etag W/"d93fb1e0b12584f566e6f17a70c49721" -1406 verbose lastModified Sat, 26 May 2018 21:57:10 GMT -1407 http request GET https://registry.npmjs.org/delayed-stream -1408 http 304 https://registry.npmjs.org/delayed-stream -1409 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1409 verbose headers connection: 'keep-alive', -1409 verbose headers 'set-cookie': -1409 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1409 verbose headers 'cf-ray': '59764fa5ecd6325c-FRA', -1409 verbose headers age: '5355', -1409 verbose headers 'cache-control': 'public, max-age=300', -1409 verbose headers etag: '"d93fb1e0b12584f566e6f17a70c49721"', -1409 verbose headers 'last-modified': 'Sat, 26 May 2018 21:57:10 GMT', -1409 verbose headers vary: 'Accept-Encoding', -1409 verbose headers 'cf-cache-status': 'HIT', -1409 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1409 verbose headers server: 'cloudflare', -1409 verbose headers 'cf-request-id': '02ddd01baf0000325c4c82b200000001' } -1410 silly get cb [ 304, -1410 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1410 silly get connection: 'keep-alive', -1410 silly get 'set-cookie': -1410 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1410 silly get 'cf-ray': '59764fa5ecd6325c-FRA', -1410 silly get age: '5355', -1410 silly get 'cache-control': 'public, max-age=300', -1410 silly get etag: '"d93fb1e0b12584f566e6f17a70c49721"', -1410 silly get 'last-modified': 'Sat, 26 May 2018 21:57:10 GMT', -1410 silly get vary: 'Accept-Encoding', -1410 silly get 'cf-cache-status': 'HIT', -1410 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1410 silly get server: 'cloudflare', -1410 silly get 'cf-request-id': '02ddd01baf0000325c4c82b200000001' } ] -1411 verbose etag https://registry.npmjs.org/delayed-stream from cache -1412 verbose get saving delayed-stream to /home/christine/.npm/registry.npmjs.org/delayed-stream/.cache.json -1413 silly resolveWithNewModule delayed-stream@1.0.0 checking installable status -1414 silly cache add args [ 'delayed-stream@~1.0.0', null ] -1415 verbose cache add spec delayed-stream@~1.0.0 -1416 silly cache add parsed spec Result { -1416 silly cache add raw: 'delayed-stream@~1.0.0', -1416 silly cache add scope: null, -1416 silly cache add name: 'delayed-stream', -1416 silly cache add rawSpec: '~1.0.0', -1416 silly cache add spec: '>=1.0.0 <1.1.0', -1416 silly cache add type: 'range' } -1417 silly addNamed delayed-stream@>=1.0.0 <1.1.0 -1418 verbose addNamed ">=1.0.0 <1.1.0" is a valid semver range for delayed-stream -1419 silly addNameRange { name: 'delayed-stream', -1419 silly addNameRange range: '>=1.0.0 <1.1.0', -1419 silly addNameRange hasData: false } -1420 silly mapToRegistry name delayed-stream -1421 silly mapToRegistry using default registry -1422 silly mapToRegistry registry https://registry.npmjs.org/ -1423 silly mapToRegistry uri https://registry.npmjs.org/delayed-stream -1424 verbose addNameRange registry:https://registry.npmjs.org/delayed-stream not in flight; fetching -1425 verbose get https://registry.npmjs.org/delayed-stream not expired, no request -1426 silly addNameRange number 2 { name: 'delayed-stream', -1426 silly addNameRange range: '>=1.0.0 <1.1.0', -1426 silly addNameRange hasData: true } -1427 silly addNameRange versions [ 'delayed-stream', -1427 silly addNameRange [ '0.0.0', -1427 silly addNameRange '0.0.1', -1427 silly addNameRange '0.0.2', -1427 silly addNameRange '0.0.3', -1427 silly addNameRange '0.0.4', -1427 silly addNameRange '0.0.5', -1427 silly addNameRange '0.0.6', -1427 silly addNameRange '0.0.7', -1427 silly addNameRange '1.0.0' ] ] -1428 silly addNamed delayed-stream@1.0.0 -1429 verbose addNamed "1.0.0" is a plain semver version for delayed-stream -1430 silly cache afterAdd delayed-stream@1.0.0 -1431 verbose afterAdd /home/christine/.npm/delayed-stream/1.0.0/package/package.json not in flight; writing -1432 verbose afterAdd /home/christine/.npm/delayed-stream/1.0.0/package/package.json written -1433 silly fetchNamedPackageData asynckit -1434 silly mapToRegistry name asynckit -1435 silly mapToRegistry using default registry -1436 silly mapToRegistry registry https://registry.npmjs.org/ -1437 silly mapToRegistry uri https://registry.npmjs.org/asynckit -1438 verbose request uri https://registry.npmjs.org/asynckit -1439 verbose request no auth needed -1440 info attempt registry request try #1 at 13:48:57 -1441 verbose etag W/"34349b180d8fff99867769eadfb4b93e" -1442 verbose lastModified Sat, 26 May 2018 17:31:47 GMT -1443 http request GET https://registry.npmjs.org/asynckit -1444 http 304 https://registry.npmjs.org/asynckit -1445 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT', -1445 verbose headers connection: 'keep-alive', -1445 verbose headers 'set-cookie': -1445 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1445 verbose headers 'cf-ray': '59764fa64d096347-FRA', -1445 verbose headers age: '5354', -1445 verbose headers 'cache-control': 'public, max-age=300', -1445 verbose headers etag: '"34349b180d8fff99867769eadfb4b93e"', -1445 verbose headers 'last-modified': 'Sat, 26 May 2018 17:31:47 GMT', -1445 verbose headers vary: 'Accept-Encoding', -1445 verbose headers 'cf-cache-status': 'HIT', -1445 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1445 verbose headers server: 'cloudflare', -1445 verbose headers 'cf-request-id': '02ddd01be900006347e88c6200000001' } -1446 silly get cb [ 304, -1446 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT', -1446 silly get connection: 'keep-alive', -1446 silly get 'set-cookie': -1446 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1446 silly get 'cf-ray': '59764fa64d096347-FRA', -1446 silly get age: '5354', -1446 silly get 'cache-control': 'public, max-age=300', -1446 silly get etag: '"34349b180d8fff99867769eadfb4b93e"', -1446 silly get 'last-modified': 'Sat, 26 May 2018 17:31:47 GMT', -1446 silly get vary: 'Accept-Encoding', -1446 silly get 'cf-cache-status': 'HIT', -1446 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1446 silly get server: 'cloudflare', -1446 silly get 'cf-request-id': '02ddd01be900006347e88c6200000001' } ] -1447 verbose etag https://registry.npmjs.org/asynckit from cache -1448 verbose get saving asynckit to /home/christine/.npm/registry.npmjs.org/asynckit/.cache.json -1449 silly resolveWithNewModule asynckit@0.4.0 checking installable status -1450 silly cache add args [ 'asynckit@^0.4.0', null ] -1451 verbose cache add spec asynckit@^0.4.0 -1452 silly cache add parsed spec Result { -1452 silly cache add raw: 'asynckit@^0.4.0', -1452 silly cache add scope: null, -1452 silly cache add name: 'asynckit', -1452 silly cache add rawSpec: '^0.4.0', -1452 silly cache add spec: '>=0.4.0 <0.5.0', -1452 silly cache add type: 'range' } -1453 silly addNamed asynckit@>=0.4.0 <0.5.0 -1454 verbose addNamed ">=0.4.0 <0.5.0" is a valid semver range for asynckit -1455 silly addNameRange { name: 'asynckit', range: '>=0.4.0 <0.5.0', hasData: false } -1456 silly mapToRegistry name asynckit -1457 silly mapToRegistry using default registry -1458 silly mapToRegistry registry https://registry.npmjs.org/ -1459 silly mapToRegistry uri https://registry.npmjs.org/asynckit -1460 verbose addNameRange registry:https://registry.npmjs.org/asynckit not in flight; fetching -1461 verbose get https://registry.npmjs.org/asynckit not expired, no request -1462 silly addNameRange number 2 { name: 'asynckit', range: '>=0.4.0 <0.5.0', hasData: true } -1463 silly addNameRange versions [ 'asynckit', [ '0.1.0', '0.2.0', '0.3.0', '0.4.0' ] ] -1464 silly addNamed asynckit@0.4.0 -1465 verbose addNamed "0.4.0" is a plain semver version for asynckit -1466 silly cache afterAdd asynckit@0.4.0 -1467 verbose afterAdd /home/christine/.npm/asynckit/0.4.0/package/package.json not in flight; writing -1468 verbose afterAdd /home/christine/.npm/asynckit/0.4.0/package/package.json written -1469 silly fetchNamedPackageData mime-db -1470 silly mapToRegistry name mime-db -1471 silly mapToRegistry using default registry -1472 silly mapToRegistry registry https://registry.npmjs.org/ -1473 silly mapToRegistry uri https://registry.npmjs.org/mime-db -1474 verbose request uri https://registry.npmjs.org/mime-db -1475 verbose request no auth needed -1476 info attempt registry request try #1 at 13:48:57 -1477 verbose etag W/"2b27fd56fd1f376697dd3c190a16cbca" -1478 verbose lastModified Mon, 06 Jan 2020 03:24:41 GMT -1479 http request GET https://registry.npmjs.org/mime-db -1480 http 200 https://registry.npmjs.org/mime-db -1481 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1481 verbose headers 'content-type': 'application/json', -1481 verbose headers 'transfer-encoding': 'chunked', -1481 verbose headers connection: 'keep-alive', -1481 verbose headers 'set-cookie': -1481 verbose headers [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1481 verbose headers 'cf-ray': '59764fa68978648b-FRA', -1481 verbose headers age: '5355', -1481 verbose headers 'cache-control': 'public, max-age=300', -1481 verbose headers etag: 'W/"b954c5c9a96f2fe6e200fdac9b6d1184"', -1481 verbose headers 'last-modified': 'Thu, 23 Apr 2020 00:55:28 GMT', -1481 verbose headers vary: 'accept-encoding, accept', -1481 verbose headers 'cf-cache-status': 'HIT', -1481 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1481 verbose headers server: 'cloudflare', -1481 verbose headers 'content-encoding': 'gzip', -1481 verbose headers 'cf-request-id': '02ddd01c160000648bda012200000001' } -1482 silly get cb [ 200, -1482 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1482 silly get 'content-type': 'application/json', -1482 silly get 'transfer-encoding': 'chunked', -1482 silly get connection: 'keep-alive', -1482 silly get 'set-cookie': -1482 silly get [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1482 silly get 'cf-ray': '59764fa68978648b-FRA', -1482 silly get age: '5355', -1482 silly get 'cache-control': 'public, max-age=300', -1482 silly get etag: 'W/"b954c5c9a96f2fe6e200fdac9b6d1184"', -1482 silly get 'last-modified': 'Thu, 23 Apr 2020 00:55:28 GMT', -1482 silly get vary: 'accept-encoding, accept', -1482 silly get 'cf-cache-status': 'HIT', -1482 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1482 silly get server: 'cloudflare', -1482 silly get 'content-encoding': 'gzip', -1482 silly get 'cf-request-id': '02ddd01c160000648bda012200000001' } ] -1483 verbose get saving mime-db to /home/christine/.npm/registry.npmjs.org/mime-db/.cache.json -1484 silly resolveWithNewModule mime-db@1.44.0 checking installable status -1485 silly cache add args [ 'mime-db@1.44.0', null ] -1486 verbose cache add spec mime-db@1.44.0 -1487 silly cache add parsed spec Result { -1487 silly cache add raw: 'mime-db@1.44.0', -1487 silly cache add scope: null, -1487 silly cache add name: 'mime-db', -1487 silly cache add rawSpec: '1.44.0', -1487 silly cache add spec: '1.44.0', -1487 silly cache add type: 'version' } -1488 silly addNamed mime-db@1.44.0 -1489 verbose addNamed "1.44.0" is a plain semver version for mime-db -1490 silly mapToRegistry name mime-db -1491 silly mapToRegistry using default registry -1492 silly mapToRegistry registry https://registry.npmjs.org/ -1493 silly mapToRegistry uri https://registry.npmjs.org/mime-db -1494 verbose addNameVersion registry:https://registry.npmjs.org/mime-db not in flight; fetching -1495 verbose get https://registry.npmjs.org/mime-db not expired, no request -1496 silly mapToRegistry name mime-db -1497 silly mapToRegistry using default registry -1498 silly mapToRegistry registry https://registry.npmjs.org/ -1499 silly mapToRegistry uri https://registry.npmjs.org/mime-db -1500 verbose addRemoteTarball https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz not in flight; adding -1501 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz', -1501 verbose addRemoteTarball 'fa11c5eb0aca1334b4233cb4d52f10c5a6272f92' ] -1502 info retry fetch attempt 1 at 13:48:58 -1503 info attempt registry request try #1 at 13:48:58 -1504 http fetch GET https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz -1505 http fetch 200 https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz -1506 silly fetchAndShaCheck shasum fa11c5eb0aca1334b4233cb4d52f10c5a6272f92 -1507 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz not in flight; adding -1508 verbose addTmpTarball already have metadata; skipping unpack for mime-db@1.44.0 -1509 silly cache afterAdd mime-db@1.44.0 -1510 verbose afterAdd /home/christine/.npm/mime-db/1.44.0/package/package.json not in flight; writing -1511 verbose afterAdd /home/christine/.npm/mime-db/1.44.0/package/package.json written -1512 silly fetchNamedPackageData ajv -1513 silly mapToRegistry name ajv -1514 silly mapToRegistry using default registry -1515 silly mapToRegistry registry https://registry.npmjs.org/ -1516 silly mapToRegistry uri https://registry.npmjs.org/ajv -1517 silly fetchNamedPackageData har-schema -1518 silly mapToRegistry name har-schema -1519 silly mapToRegistry using default registry -1520 silly mapToRegistry registry https://registry.npmjs.org/ -1521 silly mapToRegistry uri https://registry.npmjs.org/har-schema -1522 verbose request uri https://registry.npmjs.org/har-schema -1523 verbose request no auth needed -1524 info attempt registry request try #1 at 13:48:58 -1525 verbose etag W/"63c48c25d01ab9ec3e3fb5fe89f0600c" -1526 verbose lastModified Tue, 08 Jan 2019 06:13:01 GMT -1527 http request GET https://registry.npmjs.org/har-schema -1528 verbose request uri https://registry.npmjs.org/ajv -1529 verbose request no auth needed -1530 info attempt registry request try #1 at 13:48:58 -1531 verbose etag W/"da116ce9064cf3ae300f7c5410f85976" -1532 verbose lastModified Sat, 22 Feb 2020 13:51:53 GMT -1533 http request GET https://registry.npmjs.org/ajv -1534 http 304 https://registry.npmjs.org/har-schema -1535 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1535 verbose headers connection: 'keep-alive', -1535 verbose headers 'set-cookie': -1535 verbose headers [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1535 verbose headers 'cf-ray': '59764fa77b11175a-FRA', -1535 verbose headers age: '5352', -1535 verbose headers 'cache-control': 'public, max-age=300', -1535 verbose headers etag: '"63c48c25d01ab9ec3e3fb5fe89f0600c"', -1535 verbose headers 'last-modified': 'Tue, 08 Jan 2019 06:13:01 GMT', -1535 verbose headers vary: 'Accept-Encoding', -1535 verbose headers 'cf-cache-status': 'HIT', -1535 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1535 verbose headers server: 'cloudflare', -1535 verbose headers 'cf-request-id': '02ddd01caf0000175a1e21a200000001' } -1536 silly get cb [ 304, -1536 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1536 silly get connection: 'keep-alive', -1536 silly get 'set-cookie': -1536 silly get [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1536 silly get 'cf-ray': '59764fa77b11175a-FRA', -1536 silly get age: '5352', -1536 silly get 'cache-control': 'public, max-age=300', -1536 silly get etag: '"63c48c25d01ab9ec3e3fb5fe89f0600c"', -1536 silly get 'last-modified': 'Tue, 08 Jan 2019 06:13:01 GMT', -1536 silly get vary: 'Accept-Encoding', -1536 silly get 'cf-cache-status': 'HIT', -1536 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1536 silly get server: 'cloudflare', -1536 silly get 'cf-request-id': '02ddd01caf0000175a1e21a200000001' } ] -1537 verbose etag https://registry.npmjs.org/har-schema from cache -1538 verbose get saving har-schema to /home/christine/.npm/registry.npmjs.org/har-schema/.cache.json -1539 silly resolveWithNewModule har-schema@2.0.0 checking installable status -1540 silly cache add args [ 'har-schema@^2.0.0', null ] -1541 verbose cache add spec har-schema@^2.0.0 -1542 silly cache add parsed spec Result { -1542 silly cache add raw: 'har-schema@^2.0.0', -1542 silly cache add scope: null, -1542 silly cache add name: 'har-schema', -1542 silly cache add rawSpec: '^2.0.0', -1542 silly cache add spec: '>=2.0.0 <3.0.0', -1542 silly cache add type: 'range' } -1543 silly addNamed har-schema@>=2.0.0 <3.0.0 -1544 verbose addNamed ">=2.0.0 <3.0.0" is a valid semver range for har-schema -1545 silly addNameRange { name: 'har-schema', range: '>=2.0.0 <3.0.0', hasData: false } -1546 silly mapToRegistry name har-schema -1547 silly mapToRegistry using default registry -1548 silly mapToRegistry registry https://registry.npmjs.org/ -1549 silly mapToRegistry uri https://registry.npmjs.org/har-schema -1550 verbose addNameRange registry:https://registry.npmjs.org/har-schema not in flight; fetching -1551 verbose get https://registry.npmjs.org/har-schema not expired, no request -1552 silly addNameRange number 2 { name: 'har-schema', range: '>=2.0.0 <3.0.0', hasData: true } -1553 silly addNameRange versions [ 'har-schema', -1553 silly addNameRange [ '0.0.1', -1553 silly addNameRange '0.1.0', -1553 silly addNameRange '0.2.0', -1553 silly addNameRange '1.0.0', -1553 silly addNameRange '1.0.1', -1553 silly addNameRange '1.0.2', -1553 silly addNameRange '1.0.3', -1553 silly addNameRange '1.0.4', -1553 silly addNameRange '1.0.5', -1553 silly addNameRange '2.0.0' ] ] -1554 silly addNamed har-schema@2.0.0 -1555 verbose addNamed "2.0.0" is a plain semver version for har-schema -1556 silly cache afterAdd har-schema@2.0.0 -1557 verbose afterAdd /home/christine/.npm/har-schema/2.0.0/package/package.json not in flight; writing -1558 verbose afterAdd /home/christine/.npm/har-schema/2.0.0/package/package.json written -1559 http 200 https://registry.npmjs.org/ajv -1560 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1560 verbose headers 'content-type': 'application/json', -1560 verbose headers 'transfer-encoding': 'chunked', -1560 verbose headers connection: 'keep-alive', -1560 verbose headers 'set-cookie': -1560 verbose headers [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1560 verbose headers 'cf-ray': '59764fa798ddd715-FRA', -1560 verbose headers age: '5352', -1560 verbose headers 'cache-control': 'public, max-age=300', -1560 verbose headers etag: 'W/"ba29f88f088d4acc36748d3083785459"', -1560 verbose headers 'last-modified': 'Sun, 19 Apr 2020 23:18:27 GMT', -1560 verbose headers vary: 'accept-encoding, accept', -1560 verbose headers 'cf-cache-status': 'HIT', -1560 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1560 verbose headers server: 'cloudflare', -1560 verbose headers 'content-encoding': 'gzip', -1560 verbose headers 'cf-request-id': '02ddd01cc30000d715c1209200000001' } -1561 silly get cb [ 200, -1561 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1561 silly get 'content-type': 'application/json', -1561 silly get 'transfer-encoding': 'chunked', -1561 silly get connection: 'keep-alive', -1561 silly get 'set-cookie': -1561 silly get [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1561 silly get 'cf-ray': '59764fa798ddd715-FRA', -1561 silly get age: '5352', -1561 silly get 'cache-control': 'public, max-age=300', -1561 silly get etag: 'W/"ba29f88f088d4acc36748d3083785459"', -1561 silly get 'last-modified': 'Sun, 19 Apr 2020 23:18:27 GMT', -1561 silly get vary: 'accept-encoding, accept', -1561 silly get 'cf-cache-status': 'HIT', -1561 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1561 silly get server: 'cloudflare', -1561 silly get 'content-encoding': 'gzip', -1561 silly get 'cf-request-id': '02ddd01cc30000d715c1209200000001' } ] -1562 verbose get saving ajv to /home/christine/.npm/registry.npmjs.org/ajv/.cache.json -1563 silly resolveWithNewModule ajv@6.12.2 checking installable status -1564 silly cache add args [ 'ajv@^6.5.5', null ] -1565 verbose cache add spec ajv@^6.5.5 -1566 silly cache add parsed spec Result { -1566 silly cache add raw: 'ajv@^6.5.5', -1566 silly cache add scope: null, -1566 silly cache add name: 'ajv', -1566 silly cache add rawSpec: '^6.5.5', -1566 silly cache add spec: '>=6.5.5 <7.0.0', -1566 silly cache add type: 'range' } -1567 silly addNamed ajv@>=6.5.5 <7.0.0 -1568 verbose addNamed ">=6.5.5 <7.0.0" is a valid semver range for ajv -1569 silly addNameRange { name: 'ajv', range: '>=6.5.5 <7.0.0', hasData: false } -1570 silly mapToRegistry name ajv -1571 silly mapToRegistry using default registry -1572 silly mapToRegistry registry https://registry.npmjs.org/ -1573 silly mapToRegistry uri https://registry.npmjs.org/ajv -1574 verbose addNameRange registry:https://registry.npmjs.org/ajv not in flight; fetching -1575 verbose get https://registry.npmjs.org/ajv not expired, no request -1576 silly addNameRange number 2 { name: 'ajv', range: '>=6.5.5 <7.0.0', hasData: true } -1577 silly addNameRange versions [ 'ajv', -1577 silly addNameRange [ '0.0.4', -1577 silly addNameRange '0.0.5', -1577 silly addNameRange '0.0.6', -1577 silly addNameRange '0.0.7', -1577 silly addNameRange '0.0.8', -1577 silly addNameRange '0.0.9', -1577 silly addNameRange '0.0.10', -1577 silly addNameRange '0.0.11', -1577 silly addNameRange '0.0.12', -1577 silly addNameRange '0.1.0', -1577 silly addNameRange '0.1.1', -1577 silly addNameRange '0.1.2', -1577 silly addNameRange '0.1.3', -1577 silly addNameRange '0.1.4', -1577 silly addNameRange '0.1.5', -1577 silly addNameRange '0.1.6', -1577 silly addNameRange '0.1.7', -1577 silly addNameRange '0.1.8', -1577 silly addNameRange '0.1.9', -1577 silly addNameRange '0.1.10', -1577 silly addNameRange '0.1.11', -1577 silly addNameRange '0.1.12', -1577 silly addNameRange '0.1.13', -1577 silly addNameRange '0.1.14', -1577 silly addNameRange '0.1.15', -1577 silly addNameRange '0.1.16', -1577 silly addNameRange '0.2.0', -1577 silly addNameRange '0.2.1', -1577 silly addNameRange '0.2.2', -1577 silly addNameRange '0.2.3', -1577 silly addNameRange '0.2.4', -1577 silly addNameRange '0.2.5', -1577 silly addNameRange '0.2.6', -1577 silly addNameRange '0.2.7', -1577 silly addNameRange '0.2.8', -1577 silly addNameRange '0.2.9', -1577 silly addNameRange '0.3.0', -1577 silly addNameRange '0.3.1', -1577 silly addNameRange '0.3.2', -1577 silly addNameRange '0.3.3', -1577 silly addNameRange '0.3.4', -1577 silly addNameRange '0.3.5', -1577 silly addNameRange '0.3.6', -1577 silly addNameRange '0.3.7', -1577 silly addNameRange '0.3.8', -1577 silly addNameRange '0.3.11', -1577 silly addNameRange '0.3.12', -1577 silly addNameRange '0.4.0', -1577 silly addNameRange '0.4.1', -1577 silly addNameRange '0.4.2', -1577 silly addNameRange '0.4.3', -1577 silly addNameRange '0.4.4', -1577 silly addNameRange '0.4.5', -1577 silly addNameRange '0.4.6', -1577 silly addNameRange '0.4.7', -1577 silly addNameRange '0.4.8', -1577 silly addNameRange '0.4.9', -1577 silly addNameRange '0.4.10', -1577 silly addNameRange '0.4.12', -1577 silly addNameRange '0.4.14', -1577 silly addNameRange '0.4.15', -1577 silly addNameRange '0.5.0', -1577 silly addNameRange '0.5.2', -1577 silly addNameRange '0.5.3', -1577 silly addNameRange '0.5.4', -1577 silly addNameRange '0.5.5', -1577 silly addNameRange '0.5.6', -1577 silly addNameRange '0.5.7', -1577 silly addNameRange '0.5.8', -1577 silly addNameRange '0.5.9', -1577 silly addNameRange '0.5.10', -1577 silly addNameRange '0.5.11', -1577 silly addNameRange '0.5.12', -1577 silly addNameRange '0.6.0', -1577 silly addNameRange '0.6.1', -1577 silly addNameRange '0.6.2', -1577 silly addNameRange '0.6.3', -1577 silly addNameRange '0.6.4', -1577 silly addNameRange '0.6.5', -1577 silly addNameRange '0.6.6', -1577 silly addNameRange '0.6.7', -1577 silly addNameRange '0.6.8', -1577 silly addNameRange '0.6.9', -1577 silly addNameRange '0.6.10', -1577 silly addNameRange '0.6.11', -1577 silly addNameRange '0.6.12', -1577 silly addNameRange '0.6.13', -1577 silly addNameRange '0.6.14', -1577 silly addNameRange '0.6.15', -1577 silly addNameRange '0.7.0', -1577 silly addNameRange '0.7.1', -1577 silly addNameRange '0.7.2', -1577 silly addNameRange '1.0.0', -1577 silly addNameRange '1.0.1', -1577 silly addNameRange '1.1.1', -1577 silly addNameRange '1.2.0', -1577 silly addNameRange '1.2.1', -1577 silly addNameRange '1.3.0', -1577 silly addNameRange '1.3.1', -1577 silly addNameRange '1.3.2', -1577 silly addNameRange ... 185 more items ] ] -1578 silly addNamed ajv@6.12.2 -1579 verbose addNamed "6.12.2" is a plain semver version for ajv -1580 silly mapToRegistry name ajv -1581 silly mapToRegistry using default registry -1582 silly mapToRegistry registry https://registry.npmjs.org/ -1583 silly mapToRegistry uri https://registry.npmjs.org/ajv -1584 verbose addRemoteTarball https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz not in flight; adding -1585 verbose addRemoteTarball [ 'https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz', -1585 verbose addRemoteTarball 'c629c5eced17baf314437918d2da88c99d5958cd' ] -1586 info retry fetch attempt 1 at 13:48:58 -1587 info attempt registry request try #1 at 13:48:58 -1588 http fetch GET https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz -1589 http fetch 200 https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz -1590 silly fetchAndShaCheck shasum c629c5eced17baf314437918d2da88c99d5958cd -1591 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/ajv/-/ajv-6.12.2.tgz not in flight; adding -1592 verbose addTmpTarball already have metadata; skipping unpack for ajv@6.12.2 -1593 silly cache afterAdd ajv@6.12.2 -1594 verbose afterAdd /home/christine/.npm/ajv/6.12.2/package/package.json not in flight; writing -1595 verbose afterAdd /home/christine/.npm/ajv/6.12.2/package/package.json written -1596 silly fetchNamedPackageData fast-deep-equal -1597 silly mapToRegistry name fast-deep-equal -1598 silly mapToRegistry using default registry -1599 silly mapToRegistry registry https://registry.npmjs.org/ -1600 silly mapToRegistry uri https://registry.npmjs.org/fast-deep-equal -1601 silly fetchNamedPackageData fast-json-stable-stringify -1602 silly mapToRegistry name fast-json-stable-stringify -1603 silly mapToRegistry using default registry -1604 silly mapToRegistry registry https://registry.npmjs.org/ -1605 silly mapToRegistry uri https://registry.npmjs.org/fast-json-stable-stringify -1606 silly fetchNamedPackageData json-schema-traverse -1607 silly mapToRegistry name json-schema-traverse -1608 silly mapToRegistry using default registry -1609 silly mapToRegistry registry https://registry.npmjs.org/ -1610 silly mapToRegistry uri https://registry.npmjs.org/json-schema-traverse -1611 silly fetchNamedPackageData uri-js -1612 silly mapToRegistry name uri-js -1613 silly mapToRegistry using default registry -1614 silly mapToRegistry registry https://registry.npmjs.org/ -1615 silly mapToRegistry uri https://registry.npmjs.org/uri-js -1616 verbose request uri https://registry.npmjs.org/fast-deep-equal -1617 verbose request no auth needed -1618 info attempt registry request try #1 at 13:48:58 -1619 verbose etag W/"db2dac15e1de3baf39963d09ad4d32a5" -1620 verbose lastModified Wed, 22 Jan 2020 05:22:55 GMT -1621 http request GET https://registry.npmjs.org/fast-deep-equal -1622 verbose request uri https://registry.npmjs.org/json-schema-traverse -1623 verbose request no auth needed -1624 info attempt registry request try #1 at 13:48:58 -1625 verbose etag W/"ff9cf4d0fe6dae90110c679f03d42f51" -1626 verbose lastModified Sun, 10 Jun 2018 08:42:10 GMT -1627 http request GET https://registry.npmjs.org/json-schema-traverse -1628 verbose request uri https://registry.npmjs.org/fast-json-stable-stringify -1629 verbose request no auth needed -1630 info attempt registry request try #1 at 13:48:58 -1631 verbose etag W/"ae0fff93e18698c6aa2dc573fe85ad0a" -1632 verbose lastModified Sat, 14 Dec 2019 16:18:01 GMT -1633 http request GET https://registry.npmjs.org/fast-json-stable-stringify -1634 verbose request uri https://registry.npmjs.org/uri-js -1635 verbose request no auth needed -1636 info attempt registry request try #1 at 13:48:58 -1637 verbose etag W/"98dc8f4198063595fc640811868341b2" -1638 verbose lastModified Wed, 09 Jan 2019 05:32:41 GMT -1639 http request GET https://registry.npmjs.org/uri-js -1640 http 304 https://registry.npmjs.org/fast-deep-equal -1641 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1641 verbose headers connection: 'keep-alive', -1641 verbose headers 'set-cookie': -1641 verbose headers [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1641 verbose headers 'cf-ray': '59764fa919db05bb-FRA', -1641 verbose headers age: '5351', -1641 verbose headers 'cache-control': 'public, max-age=300', -1641 verbose headers etag: '"db2dac15e1de3baf39963d09ad4d32a5"', -1641 verbose headers 'last-modified': 'Wed, 22 Jan 2020 05:22:55 GMT', -1641 verbose headers vary: 'Accept-Encoding', -1641 verbose headers 'cf-cache-status': 'HIT', -1641 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1641 verbose headers server: 'cloudflare', -1641 verbose headers 'cf-request-id': '02ddd01db3000005bb0ca9e200000001' } -1642 silly get cb [ 304, -1642 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1642 silly get connection: 'keep-alive', -1642 silly get 'set-cookie': -1642 silly get [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1642 silly get 'cf-ray': '59764fa919db05bb-FRA', -1642 silly get age: '5351', -1642 silly get 'cache-control': 'public, max-age=300', -1642 silly get etag: '"db2dac15e1de3baf39963d09ad4d32a5"', -1642 silly get 'last-modified': 'Wed, 22 Jan 2020 05:22:55 GMT', -1642 silly get vary: 'Accept-Encoding', -1642 silly get 'cf-cache-status': 'HIT', -1642 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1642 silly get server: 'cloudflare', -1642 silly get 'cf-request-id': '02ddd01db3000005bb0ca9e200000001' } ] -1643 verbose etag https://registry.npmjs.org/fast-deep-equal from cache -1644 verbose get saving fast-deep-equal to /home/christine/.npm/registry.npmjs.org/fast-deep-equal/.cache.json -1645 silly resolveWithNewModule fast-deep-equal@3.1.1 checking installable status -1646 silly cache add args [ 'fast-deep-equal@^3.1.1', null ] -1647 verbose cache add spec fast-deep-equal@^3.1.1 -1648 silly cache add parsed spec Result { -1648 silly cache add raw: 'fast-deep-equal@^3.1.1', -1648 silly cache add scope: null, -1648 silly cache add name: 'fast-deep-equal', -1648 silly cache add rawSpec: '^3.1.1', -1648 silly cache add spec: '>=3.1.1 <4.0.0', -1648 silly cache add type: 'range' } -1649 silly addNamed fast-deep-equal@>=3.1.1 <4.0.0 -1650 verbose addNamed ">=3.1.1 <4.0.0" is a valid semver range for fast-deep-equal -1651 silly addNameRange { name: 'fast-deep-equal', -1651 silly addNameRange range: '>=3.1.1 <4.0.0', -1651 silly addNameRange hasData: false } -1652 silly mapToRegistry name fast-deep-equal -1653 silly mapToRegistry using default registry -1654 silly mapToRegistry registry https://registry.npmjs.org/ -1655 silly mapToRegistry uri https://registry.npmjs.org/fast-deep-equal -1656 verbose addNameRange registry:https://registry.npmjs.org/fast-deep-equal not in flight; fetching -1657 verbose get https://registry.npmjs.org/fast-deep-equal not expired, no request -1658 silly addNameRange number 2 { name: 'fast-deep-equal', -1658 silly addNameRange range: '>=3.1.1 <4.0.0', -1658 silly addNameRange hasData: true } -1659 silly addNameRange versions [ 'fast-deep-equal', -1659 silly addNameRange [ '0.0.1', -1659 silly addNameRange '0.1.0', -1659 silly addNameRange '1.0.0', -1659 silly addNameRange '1.1.0', -1659 silly addNameRange '2.0.0', -1659 silly addNameRange '2.0.1', -1659 silly addNameRange '3.0.0-beta.0', -1659 silly addNameRange '3.0.0-beta.1', -1659 silly addNameRange '3.0.0-beta.2', -1659 silly addNameRange '3.0.0', -1659 silly addNameRange '3.0.1', -1659 silly addNameRange '3.1.0', -1659 silly addNameRange '3.1.1' ] ] -1660 silly addNamed fast-deep-equal@3.1.1 -1661 verbose addNamed "3.1.1" is a plain semver version for fast-deep-equal -1662 silly cache afterAdd fast-deep-equal@3.1.1 -1663 verbose afterAdd /home/christine/.npm/fast-deep-equal/3.1.1/package/package.json not in flight; writing -1664 verbose afterAdd /home/christine/.npm/fast-deep-equal/3.1.1/package/package.json written -1665 http 304 https://registry.npmjs.org/fast-json-stable-stringify -1666 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1666 verbose headers connection: 'keep-alive', -1666 verbose headers 'set-cookie': -1666 verbose headers [ '__cfduid=d2af9fdb41f2d4571645353fe78c8280d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1666 verbose headers 'cf-ray': '59764fa92ba70eab-FRA', -1666 verbose headers age: '5351', -1666 verbose headers 'cache-control': 'public, max-age=300', -1666 verbose headers etag: '"ae0fff93e18698c6aa2dc573fe85ad0a"', -1666 verbose headers 'last-modified': 'Sat, 14 Dec 2019 16:18:01 GMT', -1666 verbose headers vary: 'Accept-Encoding', -1666 verbose headers 'cf-cache-status': 'HIT', -1666 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1666 verbose headers server: 'cloudflare', -1666 verbose headers 'cf-request-id': '02ddd01db900000eabe9180200000001' } -1667 silly get cb [ 304, -1667 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1667 silly get connection: 'keep-alive', -1667 silly get 'set-cookie': -1667 silly get [ '__cfduid=d2af9fdb41f2d4571645353fe78c8280d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1667 silly get 'cf-ray': '59764fa92ba70eab-FRA', -1667 silly get age: '5351', -1667 silly get 'cache-control': 'public, max-age=300', -1667 silly get etag: '"ae0fff93e18698c6aa2dc573fe85ad0a"', -1667 silly get 'last-modified': 'Sat, 14 Dec 2019 16:18:01 GMT', -1667 silly get vary: 'Accept-Encoding', -1667 silly get 'cf-cache-status': 'HIT', -1667 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1667 silly get server: 'cloudflare', -1667 silly get 'cf-request-id': '02ddd01db900000eabe9180200000001' } ] -1668 verbose etag https://registry.npmjs.org/fast-json-stable-stringify from cache -1669 verbose get saving fast-json-stable-stringify to /home/christine/.npm/registry.npmjs.org/fast-json-stable-stringify/.cache.json -1670 silly resolveWithNewModule fast-json-stable-stringify@2.1.0 checking installable status -1671 silly cache add args [ 'fast-json-stable-stringify@^2.0.0', null ] -1672 verbose cache add spec fast-json-stable-stringify@^2.0.0 -1673 silly cache add parsed spec Result { -1673 silly cache add raw: 'fast-json-stable-stringify@^2.0.0', -1673 silly cache add scope: null, -1673 silly cache add name: 'fast-json-stable-stringify', -1673 silly cache add rawSpec: '^2.0.0', -1673 silly cache add spec: '>=2.0.0 <3.0.0', -1673 silly cache add type: 'range' } -1674 silly addNamed fast-json-stable-stringify@>=2.0.0 <3.0.0 -1675 verbose addNamed ">=2.0.0 <3.0.0" is a valid semver range for fast-json-stable-stringify -1676 silly addNameRange { name: 'fast-json-stable-stringify', -1676 silly addNameRange range: '>=2.0.0 <3.0.0', -1676 silly addNameRange hasData: false } -1677 silly mapToRegistry name fast-json-stable-stringify -1678 silly mapToRegistry using default registry -1679 silly mapToRegistry registry https://registry.npmjs.org/ -1680 silly mapToRegistry uri https://registry.npmjs.org/fast-json-stable-stringify -1681 verbose addNameRange registry:https://registry.npmjs.org/fast-json-stable-stringify not in flight; fetching -1682 http 304 https://registry.npmjs.org/json-schema-traverse -1683 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1683 verbose headers connection: 'keep-alive', -1683 verbose headers 'set-cookie': -1683 verbose headers [ '__cfduid=d3221de8ef62ba021521e3facdf4646ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1683 verbose headers 'cf-ray': '59764fa928dbd6e1-FRA', -1683 verbose headers age: '5351', -1683 verbose headers 'cache-control': 'public, max-age=300', -1683 verbose headers etag: '"ff9cf4d0fe6dae90110c679f03d42f51"', -1683 verbose headers 'last-modified': 'Sun, 10 Jun 2018 08:42:10 GMT', -1683 verbose headers vary: 'Accept-Encoding', -1683 verbose headers 'cf-cache-status': 'HIT', -1683 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1683 verbose headers server: 'cloudflare', -1683 verbose headers 'cf-request-id': '02ddd01db80000d6e132393200000001' } -1684 silly get cb [ 304, -1684 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1684 silly get connection: 'keep-alive', -1684 silly get 'set-cookie': -1684 silly get [ '__cfduid=d3221de8ef62ba021521e3facdf4646ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1684 silly get 'cf-ray': '59764fa928dbd6e1-FRA', -1684 silly get age: '5351', -1684 silly get 'cache-control': 'public, max-age=300', -1684 silly get etag: '"ff9cf4d0fe6dae90110c679f03d42f51"', -1684 silly get 'last-modified': 'Sun, 10 Jun 2018 08:42:10 GMT', -1684 silly get vary: 'Accept-Encoding', -1684 silly get 'cf-cache-status': 'HIT', -1684 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1684 silly get server: 'cloudflare', -1684 silly get 'cf-request-id': '02ddd01db80000d6e132393200000001' } ] -1685 verbose etag https://registry.npmjs.org/json-schema-traverse from cache -1686 verbose get saving json-schema-traverse to /home/christine/.npm/registry.npmjs.org/json-schema-traverse/.cache.json -1687 http 304 https://registry.npmjs.org/uri-js -1688 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1688 verbose headers connection: 'keep-alive', -1688 verbose headers 'set-cookie': -1688 verbose headers [ '__cfduid=daac5443483b19b682dfd1142d78174b81590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1688 verbose headers 'cf-ray': '59764fa92aaec2f9-FRA', -1688 verbose headers age: '5351', -1688 verbose headers 'cache-control': 'public, max-age=300', -1688 verbose headers etag: '"98dc8f4198063595fc640811868341b2"', -1688 verbose headers 'last-modified': 'Wed, 09 Jan 2019 05:32:41 GMT', -1688 verbose headers vary: 'Accept-Encoding', -1688 verbose headers 'cf-cache-status': 'HIT', -1688 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1688 verbose headers server: 'cloudflare', -1688 verbose headers 'cf-request-id': '02ddd01db90000c2f92609d200000001' } -1689 silly get cb [ 304, -1689 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1689 silly get connection: 'keep-alive', -1689 silly get 'set-cookie': -1689 silly get [ '__cfduid=daac5443483b19b682dfd1142d78174b81590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1689 silly get 'cf-ray': '59764fa92aaec2f9-FRA', -1689 silly get age: '5351', -1689 silly get 'cache-control': 'public, max-age=300', -1689 silly get etag: '"98dc8f4198063595fc640811868341b2"', -1689 silly get 'last-modified': 'Wed, 09 Jan 2019 05:32:41 GMT', -1689 silly get vary: 'Accept-Encoding', -1689 silly get 'cf-cache-status': 'HIT', -1689 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1689 silly get server: 'cloudflare', -1689 silly get 'cf-request-id': '02ddd01db90000c2f92609d200000001' } ] -1690 verbose etag https://registry.npmjs.org/uri-js from cache -1691 verbose get saving uri-js to /home/christine/.npm/registry.npmjs.org/uri-js/.cache.json -1692 verbose get https://registry.npmjs.org/fast-json-stable-stringify not expired, no request -1693 silly addNameRange number 2 { name: 'fast-json-stable-stringify', -1693 silly addNameRange range: '>=2.0.0 <3.0.0', -1693 silly addNameRange hasData: true } -1694 silly addNameRange versions [ 'fast-json-stable-stringify', [ '1.0.2', '2.0.0', '2.1.0' ] ] -1695 silly addNamed fast-json-stable-stringify@2.1.0 -1696 verbose addNamed "2.1.0" is a plain semver version for fast-json-stable-stringify -1697 silly resolveWithNewModule json-schema-traverse@0.4.1 checking installable status -1698 silly cache add args [ 'json-schema-traverse@^0.4.1', null ] -1699 verbose cache add spec json-schema-traverse@^0.4.1 -1700 silly cache add parsed spec Result { -1700 silly cache add raw: 'json-schema-traverse@^0.4.1', -1700 silly cache add scope: null, -1700 silly cache add name: 'json-schema-traverse', -1700 silly cache add rawSpec: '^0.4.1', -1700 silly cache add spec: '>=0.4.1 <0.5.0', -1700 silly cache add type: 'range' } -1701 silly addNamed json-schema-traverse@>=0.4.1 <0.5.0 -1702 verbose addNamed ">=0.4.1 <0.5.0" is a valid semver range for json-schema-traverse -1703 silly addNameRange { name: 'json-schema-traverse', -1703 silly addNameRange range: '>=0.4.1 <0.5.0', -1703 silly addNameRange hasData: false } -1704 silly mapToRegistry name json-schema-traverse -1705 silly mapToRegistry using default registry -1706 silly mapToRegistry registry https://registry.npmjs.org/ -1707 silly mapToRegistry uri https://registry.npmjs.org/json-schema-traverse -1708 verbose addNameRange registry:https://registry.npmjs.org/json-schema-traverse not in flight; fetching -1709 silly resolveWithNewModule uri-js@4.2.2 checking installable status -1710 silly cache add args [ 'uri-js@^4.2.2', null ] -1711 verbose cache add spec uri-js@^4.2.2 -1712 silly cache add parsed spec Result { -1712 silly cache add raw: 'uri-js@^4.2.2', -1712 silly cache add scope: null, -1712 silly cache add name: 'uri-js', -1712 silly cache add rawSpec: '^4.2.2', -1712 silly cache add spec: '>=4.2.2 <5.0.0', -1712 silly cache add type: 'range' } -1713 silly addNamed uri-js@>=4.2.2 <5.0.0 -1714 verbose addNamed ">=4.2.2 <5.0.0" is a valid semver range for uri-js -1715 silly addNameRange { name: 'uri-js', range: '>=4.2.2 <5.0.0', hasData: false } -1716 silly mapToRegistry name uri-js -1717 silly mapToRegistry using default registry -1718 silly mapToRegistry registry https://registry.npmjs.org/ -1719 silly mapToRegistry uri https://registry.npmjs.org/uri-js -1720 verbose addNameRange registry:https://registry.npmjs.org/uri-js not in flight; fetching -1721 verbose get https://registry.npmjs.org/json-schema-traverse not expired, no request -1722 silly addNameRange number 2 { name: 'json-schema-traverse', -1722 silly addNameRange range: '>=0.4.1 <0.5.0', -1722 silly addNameRange hasData: true } -1723 silly addNameRange versions [ 'json-schema-traverse', -1723 silly addNameRange [ '0.0.1', '0.1.0', '0.2.0', '0.3.0', '0.3.1', '0.4.0', '0.4.1' ] ] -1724 silly addNamed json-schema-traverse@0.4.1 -1725 verbose addNamed "0.4.1" is a plain semver version for json-schema-traverse -1726 verbose get https://registry.npmjs.org/uri-js not expired, no request -1727 silly addNameRange number 2 { name: 'uri-js', range: '>=4.2.2 <5.0.0', hasData: true } -1728 silly addNameRange versions [ 'uri-js', -1728 silly addNameRange [ '1.4.0', -1728 silly addNameRange '1.4.2', -1728 silly addNameRange '2.0.0', -1728 silly addNameRange '2.1.0', -1728 silly addNameRange '2.1.1', -1728 silly addNameRange '3.0.0', -1728 silly addNameRange '3.0.1', -1728 silly addNameRange '3.0.2', -1728 silly addNameRange '4.2.0', -1728 silly addNameRange '4.2.1', -1728 silly addNameRange '4.2.2' ] ] -1729 silly addNamed uri-js@4.2.2 -1730 verbose addNamed "4.2.2" is a plain semver version for uri-js -1731 silly cache afterAdd fast-json-stable-stringify@2.1.0 -1732 verbose afterAdd /home/christine/.npm/fast-json-stable-stringify/2.1.0/package/package.json not in flight; writing -1733 verbose afterAdd /home/christine/.npm/fast-json-stable-stringify/2.1.0/package/package.json written -1734 silly cache afterAdd json-schema-traverse@0.4.1 -1735 verbose afterAdd /home/christine/.npm/json-schema-traverse/0.4.1/package/package.json not in flight; writing -1736 silly cache afterAdd uri-js@4.2.2 -1737 verbose afterAdd /home/christine/.npm/uri-js/4.2.2/package/package.json not in flight; writing -1738 verbose afterAdd /home/christine/.npm/json-schema-traverse/0.4.1/package/package.json written -1739 verbose afterAdd /home/christine/.npm/uri-js/4.2.2/package/package.json written -1740 silly fetchNamedPackageData punycode -1741 silly mapToRegistry name punycode -1742 silly mapToRegistry using default registry -1743 silly mapToRegistry registry https://registry.npmjs.org/ -1744 silly mapToRegistry uri https://registry.npmjs.org/punycode -1745 verbose request uri https://registry.npmjs.org/punycode -1746 verbose request no auth needed -1747 info attempt registry request try #1 at 13:48:58 -1748 verbose etag W/"27ef686d9a29403de9242fe625c85934" -1749 verbose lastModified Sun, 27 May 2018 13:11:15 GMT -1750 http request GET https://registry.npmjs.org/punycode -1751 http 304 https://registry.npmjs.org/punycode -1752 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1752 verbose headers connection: 'keep-alive', -1752 verbose headers 'set-cookie': -1752 verbose headers [ '__cfduid=d27785e001b27740005b62566f67820581590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1752 verbose headers 'cf-ray': '59764fa969ce1772-FRA', -1752 verbose headers age: '5655', -1752 verbose headers 'cache-control': 'public, max-age=300', -1752 verbose headers etag: '"27ef686d9a29403de9242fe625c85934"', -1752 verbose headers 'last-modified': 'Sun, 27 May 2018 13:11:15 GMT', -1752 verbose headers vary: 'Accept-Encoding', -1752 verbose headers 'cf-cache-status': 'HIT', -1752 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1752 verbose headers server: 'cloudflare', -1752 verbose headers 'cf-request-id': '02ddd01de4000017726419b200000001' } -1753 silly get cb [ 304, -1753 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1753 silly get connection: 'keep-alive', -1753 silly get 'set-cookie': -1753 silly get [ '__cfduid=d27785e001b27740005b62566f67820581590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1753 silly get 'cf-ray': '59764fa969ce1772-FRA', -1753 silly get age: '5655', -1753 silly get 'cache-control': 'public, max-age=300', -1753 silly get etag: '"27ef686d9a29403de9242fe625c85934"', -1753 silly get 'last-modified': 'Sun, 27 May 2018 13:11:15 GMT', -1753 silly get vary: 'Accept-Encoding', -1753 silly get 'cf-cache-status': 'HIT', -1753 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1753 silly get server: 'cloudflare', -1753 silly get 'cf-request-id': '02ddd01de4000017726419b200000001' } ] -1754 verbose etag https://registry.npmjs.org/punycode from cache -1755 verbose get saving punycode to /home/christine/.npm/registry.npmjs.org/punycode/.cache.json -1756 silly resolveWithNewModule punycode@2.1.1 checking installable status -1757 silly cache add args [ 'punycode@^2.1.0', null ] -1758 verbose cache add spec punycode@^2.1.0 -1759 silly cache add parsed spec Result { -1759 silly cache add raw: 'punycode@^2.1.0', -1759 silly cache add scope: null, -1759 silly cache add name: 'punycode', -1759 silly cache add rawSpec: '^2.1.0', -1759 silly cache add spec: '>=2.1.0 <3.0.0', -1759 silly cache add type: 'range' } -1760 silly addNamed punycode@>=2.1.0 <3.0.0 -1761 verbose addNamed ">=2.1.0 <3.0.0" is a valid semver range for punycode -1762 silly addNameRange { name: 'punycode', range: '>=2.1.0 <3.0.0', hasData: false } -1763 silly mapToRegistry name punycode -1764 silly mapToRegistry using default registry -1765 silly mapToRegistry registry https://registry.npmjs.org/ -1766 silly mapToRegistry uri https://registry.npmjs.org/punycode -1767 verbose addNameRange registry:https://registry.npmjs.org/punycode not in flight; fetching -1768 verbose get https://registry.npmjs.org/punycode not expired, no request -1769 silly addNameRange number 2 { name: 'punycode', range: '>=2.1.0 <3.0.0', hasData: true } -1770 silly addNameRange versions [ 'punycode', -1770 silly addNameRange [ '0.0.1', -1770 silly addNameRange '0.0.2', -1770 silly addNameRange '0.0.1337', -1770 silly addNameRange '0.1.0', -1770 silly addNameRange '0.1.1', -1770 silly addNameRange '0.1.2', -1770 silly addNameRange '0.2.0', -1770 silly addNameRange '0.2.1', -1770 silly addNameRange '0.2.2', -1770 silly addNameRange '0.3.0', -1770 silly addNameRange '1.0.0', -1770 silly addNameRange '1.1.0', -1770 silly addNameRange '1.1.1', -1770 silly addNameRange '1.2.0', -1770 silly addNameRange '1.2.1', -1770 silly addNameRange '1.2.2', -1770 silly addNameRange '1.2.3', -1770 silly addNameRange '1.2.4', -1770 silly addNameRange '1.3.0', -1770 silly addNameRange '1.3.1', -1770 silly addNameRange '1.3.2', -1770 silly addNameRange '1.4.0', -1770 silly addNameRange '1.4.1', -1770 silly addNameRange '2.0.0', -1770 silly addNameRange '2.0.1', -1770 silly addNameRange '2.1.0', -1770 silly addNameRange '2.1.1' ] ] -1771 silly addNamed punycode@2.1.1 -1772 verbose addNamed "2.1.1" is a plain semver version for punycode -1773 silly cache afterAdd punycode@2.1.1 -1774 verbose afterAdd /home/christine/.npm/punycode/2.1.1/package/package.json not in flight; writing -1775 verbose afterAdd /home/christine/.npm/punycode/2.1.1/package/package.json written -1776 silly fetchNamedPackageData assert-plus -1777 silly mapToRegistry name assert-plus -1778 silly mapToRegistry using default registry -1779 silly mapToRegistry registry https://registry.npmjs.org/ -1780 silly mapToRegistry uri https://registry.npmjs.org/assert-plus -1781 silly fetchNamedPackageData jsprim -1782 silly mapToRegistry name jsprim -1783 silly mapToRegistry using default registry -1784 silly mapToRegistry registry https://registry.npmjs.org/ -1785 silly mapToRegistry uri https://registry.npmjs.org/jsprim -1786 silly fetchNamedPackageData sshpk -1787 silly mapToRegistry name sshpk -1788 silly mapToRegistry using default registry -1789 silly mapToRegistry registry https://registry.npmjs.org/ -1790 silly mapToRegistry uri https://registry.npmjs.org/sshpk -1791 verbose request uri https://registry.npmjs.org/assert-plus -1792 verbose request no auth needed -1793 info attempt registry request try #1 at 13:48:58 -1794 verbose etag W/"5f1c38f02647d4e0324c53fe90ea160c" -1795 verbose lastModified Fri, 13 Dec 2019 16:32:10 GMT -1796 http request GET https://registry.npmjs.org/assert-plus -1797 verbose request uri https://registry.npmjs.org/jsprim -1798 verbose request no auth needed -1799 info attempt registry request try #1 at 13:48:58 -1800 verbose etag W/"ec307a0d291a7abbcabe4ca63c75468e" -1801 verbose lastModified Fri, 13 Dec 2019 16:32:36 GMT -1802 http request GET https://registry.npmjs.org/jsprim -1803 verbose request uri https://registry.npmjs.org/sshpk -1804 verbose request no auth needed -1805 info attempt registry request try #1 at 13:48:58 -1806 verbose etag W/"e8e015112a9fbc16cc4a367405b14614" -1807 verbose lastModified Fri, 13 Dec 2019 16:33:04 GMT -1808 http request GET https://registry.npmjs.org/sshpk -1809 http 200 https://registry.npmjs.org/assert-plus -1810 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1810 verbose headers 'content-type': 'application/json', -1810 verbose headers 'transfer-encoding': 'chunked', -1810 verbose headers connection: 'keep-alive', -1810 verbose headers 'set-cookie': -1810 verbose headers [ '__cfduid=d7b1200d8018131cb680b33099b4da6111590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1810 verbose headers 'cf-ray': '59764fa9af0505e9-FRA', -1810 verbose headers age: '5654', -1810 verbose headers 'cache-control': 'public, max-age=300', -1810 verbose headers etag: 'W/"a6e598834cba689561f3d676e817bde6"', -1810 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', -1810 verbose headers vary: 'accept-encoding, accept', -1810 verbose headers 'cf-cache-status': 'HIT', -1810 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1810 verbose headers server: 'cloudflare', -1810 verbose headers 'content-encoding': 'gzip', -1810 verbose headers 'cf-request-id': '02ddd01e0b000005e903b57200000001' } -1811 silly get cb [ 200, -1811 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1811 silly get 'content-type': 'application/json', -1811 silly get 'transfer-encoding': 'chunked', -1811 silly get connection: 'keep-alive', -1811 silly get 'set-cookie': -1811 silly get [ '__cfduid=d7b1200d8018131cb680b33099b4da6111590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1811 silly get 'cf-ray': '59764fa9af0505e9-FRA', -1811 silly get age: '5654', -1811 silly get 'cache-control': 'public, max-age=300', -1811 silly get etag: 'W/"a6e598834cba689561f3d676e817bde6"', -1811 silly get 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', -1811 silly get vary: 'accept-encoding, accept', -1811 silly get 'cf-cache-status': 'HIT', -1811 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1811 silly get server: 'cloudflare', -1811 silly get 'content-encoding': 'gzip', -1811 silly get 'cf-request-id': '02ddd01e0b000005e903b57200000001' } ] -1812 verbose get saving assert-plus to /home/christine/.npm/registry.npmjs.org/assert-plus/.cache.json -1813 silly resolveWithNewModule assert-plus@1.0.0 checking installable status -1814 silly cache add args [ 'assert-plus@^1.0.0', null ] -1815 verbose cache add spec assert-plus@^1.0.0 -1816 silly cache add parsed spec Result { -1816 silly cache add raw: 'assert-plus@^1.0.0', -1816 silly cache add scope: null, -1816 silly cache add name: 'assert-plus', -1816 silly cache add rawSpec: '^1.0.0', -1816 silly cache add spec: '>=1.0.0 <2.0.0', -1816 silly cache add type: 'range' } -1817 silly addNamed assert-plus@>=1.0.0 <2.0.0 -1818 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for assert-plus -1819 silly addNameRange { name: 'assert-plus', range: '>=1.0.0 <2.0.0', hasData: false } -1820 silly mapToRegistry name assert-plus -1821 silly mapToRegistry using default registry -1822 silly mapToRegistry registry https://registry.npmjs.org/ -1823 silly mapToRegistry uri https://registry.npmjs.org/assert-plus -1824 verbose addNameRange registry:https://registry.npmjs.org/assert-plus not in flight; fetching -1825 verbose get https://registry.npmjs.org/assert-plus not expired, no request -1826 silly addNameRange number 2 { name: 'assert-plus', range: '>=1.0.0 <2.0.0', hasData: true } -1827 silly addNameRange versions [ 'assert-plus', -1827 silly addNameRange [ '0.1.0', -1827 silly addNameRange '0.1.1', -1827 silly addNameRange '0.1.2', -1827 silly addNameRange '0.1.3', -1827 silly addNameRange '0.1.4', -1827 silly addNameRange '0.1.5', -1827 silly addNameRange '0.2.0', -1827 silly addNameRange '1.0.0' ] ] -1828 silly addNamed assert-plus@1.0.0 -1829 verbose addNamed "1.0.0" is a plain semver version for assert-plus -1830 silly cache afterAdd assert-plus@1.0.0 -1831 verbose afterAdd /home/christine/.npm/assert-plus/1.0.0/package/package.json not in flight; writing -1832 verbose afterAdd /home/christine/.npm/assert-plus/1.0.0/package/package.json written -1833 http 200 https://registry.npmjs.org/jsprim -1834 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1834 verbose headers 'content-type': 'application/json', -1834 verbose headers 'transfer-encoding': 'chunked', -1834 verbose headers connection: 'keep-alive', -1834 verbose headers 'set-cookie': -1834 verbose headers [ '__cfduid=d570054c58525c9612ff8b11e8fa974871590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1834 verbose headers 'cf-ray': '59764fa9bc0d176a-FRA', -1834 verbose headers age: '5654', -1834 verbose headers 'cache-control': 'public, max-age=300', -1834 verbose headers etag: 'W/"64e1b4713c2eacf5f810b5a6ad366cd9"', -1834 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:51 GMT', -1834 verbose headers vary: 'accept-encoding, accept', -1834 verbose headers 'cf-cache-status': 'HIT', -1834 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1834 verbose headers server: 'cloudflare', -1834 verbose headers 'content-encoding': 'gzip', -1834 verbose headers 'cf-request-id': '02ddd01e100000176a65ba5200000001' } -1835 silly get cb [ 200, -1835 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1835 silly get 'content-type': 'application/json', -1835 silly get 'transfer-encoding': 'chunked', -1835 silly get connection: 'keep-alive', -1835 silly get 'set-cookie': -1835 silly get [ '__cfduid=d570054c58525c9612ff8b11e8fa974871590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1835 silly get 'cf-ray': '59764fa9bc0d176a-FRA', -1835 silly get age: '5654', -1835 silly get 'cache-control': 'public, max-age=300', -1835 silly get etag: 'W/"64e1b4713c2eacf5f810b5a6ad366cd9"', -1835 silly get 'last-modified': 'Wed, 06 May 2020 14:47:51 GMT', -1835 silly get vary: 'accept-encoding, accept', -1835 silly get 'cf-cache-status': 'HIT', -1835 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1835 silly get server: 'cloudflare', -1835 silly get 'content-encoding': 'gzip', -1835 silly get 'cf-request-id': '02ddd01e100000176a65ba5200000001' } ] -1836 verbose get saving jsprim to /home/christine/.npm/registry.npmjs.org/jsprim/.cache.json -1837 silly resolveWithNewModule jsprim@1.4.1 checking installable status -1838 silly cache add args [ 'jsprim@^1.2.2', null ] -1839 verbose cache add spec jsprim@^1.2.2 -1840 silly cache add parsed spec Result { -1840 silly cache add raw: 'jsprim@^1.2.2', -1840 silly cache add scope: null, -1840 silly cache add name: 'jsprim', -1840 silly cache add rawSpec: '^1.2.2', -1840 silly cache add spec: '>=1.2.2 <2.0.0', -1840 silly cache add type: 'range' } -1841 silly addNamed jsprim@>=1.2.2 <2.0.0 -1842 verbose addNamed ">=1.2.2 <2.0.0" is a valid semver range for jsprim -1843 silly addNameRange { name: 'jsprim', range: '>=1.2.2 <2.0.0', hasData: false } -1844 silly mapToRegistry name jsprim -1845 silly mapToRegistry using default registry -1846 silly mapToRegistry registry https://registry.npmjs.org/ -1847 silly mapToRegistry uri https://registry.npmjs.org/jsprim -1848 verbose addNameRange registry:https://registry.npmjs.org/jsprim not in flight; fetching -1849 verbose get https://registry.npmjs.org/jsprim not expired, no request -1850 silly addNameRange number 2 { name: 'jsprim', range: '>=1.2.2 <2.0.0', hasData: true } -1851 silly addNameRange versions [ 'jsprim', -1851 silly addNameRange [ '0.0.1', -1851 silly addNameRange '0.0.2', -1851 silly addNameRange '0.0.3', -1851 silly addNameRange '0.0.4', -1851 silly addNameRange '0.0.5', -1851 silly addNameRange '0.1.0', -1851 silly addNameRange '0.2.0', -1851 silly addNameRange '0.3.0', -1851 silly addNameRange '0.3.1', -1851 silly addNameRange '0.4.0', -1851 silly addNameRange '0.5.0', -1851 silly addNameRange '0.5.1', -1851 silly addNameRange '0.6.0', -1851 silly addNameRange '0.6.1', -1851 silly addNameRange '0.7.0', -1851 silly addNameRange '0.8.0', -1851 silly addNameRange '1.0.0', -1851 silly addNameRange '1.1.0', -1851 silly addNameRange '1.2.0', -1851 silly addNameRange '1.2.1', -1851 silly addNameRange '1.2.2', -1851 silly addNameRange '1.3.0', -1851 silly addNameRange '1.3.1', -1851 silly addNameRange '1.4.0', -1851 silly addNameRange '1.4.1', -1851 silly addNameRange '2.0.0' ] ] -1852 silly addNamed jsprim@1.4.1 -1853 verbose addNamed "1.4.1" is a plain semver version for jsprim -1854 http 200 https://registry.npmjs.org/sshpk -1855 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1855 verbose headers 'content-type': 'application/json', -1855 verbose headers 'transfer-encoding': 'chunked', -1855 verbose headers connection: 'keep-alive', -1855 verbose headers 'set-cookie': -1855 verbose headers [ '__cfduid=def5a536cfc1c142382a82585aa4561c11590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1855 verbose headers 'cf-ray': '59764fa9bc65dfbb-FRA', -1855 verbose headers age: '5654', -1855 verbose headers 'cache-control': 'public, max-age=300', -1855 verbose headers etag: 'W/"4bb612bfd8ff73b94a8861a146b38953"', -1855 verbose headers 'last-modified': 'Wed, 06 May 2020 14:48:13 GMT', -1855 verbose headers vary: 'accept-encoding, accept', -1855 verbose headers 'cf-cache-status': 'HIT', -1855 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1855 verbose headers server: 'cloudflare', -1855 verbose headers 'content-encoding': 'gzip', -1855 verbose headers 'cf-request-id': '02ddd01e100000dfbb5fae5200000001' } -1856 silly get cb [ 200, -1856 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1856 silly get 'content-type': 'application/json', -1856 silly get 'transfer-encoding': 'chunked', -1856 silly get connection: 'keep-alive', -1856 silly get 'set-cookie': -1856 silly get [ '__cfduid=def5a536cfc1c142382a82585aa4561c11590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1856 silly get 'cf-ray': '59764fa9bc65dfbb-FRA', -1856 silly get age: '5654', -1856 silly get 'cache-control': 'public, max-age=300', -1856 silly get etag: 'W/"4bb612bfd8ff73b94a8861a146b38953"', -1856 silly get 'last-modified': 'Wed, 06 May 2020 14:48:13 GMT', -1856 silly get vary: 'accept-encoding, accept', -1856 silly get 'cf-cache-status': 'HIT', -1856 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1856 silly get server: 'cloudflare', -1856 silly get 'content-encoding': 'gzip', -1856 silly get 'cf-request-id': '02ddd01e100000dfbb5fae5200000001' } ] -1857 verbose get saving sshpk to /home/christine/.npm/registry.npmjs.org/sshpk/.cache.json -1858 silly cache afterAdd jsprim@1.4.1 -1859 verbose afterAdd /home/christine/.npm/jsprim/1.4.1/package/package.json not in flight; writing -1860 silly resolveWithNewModule sshpk@1.16.1 checking installable status -1861 silly cache add args [ 'sshpk@^1.7.0', null ] -1862 verbose cache add spec sshpk@^1.7.0 -1863 silly cache add parsed spec Result { -1863 silly cache add raw: 'sshpk@^1.7.0', -1863 silly cache add scope: null, -1863 silly cache add name: 'sshpk', -1863 silly cache add rawSpec: '^1.7.0', -1863 silly cache add spec: '>=1.7.0 <2.0.0', -1863 silly cache add type: 'range' } -1864 silly addNamed sshpk@>=1.7.0 <2.0.0 -1865 verbose addNamed ">=1.7.0 <2.0.0" is a valid semver range for sshpk -1866 silly addNameRange { name: 'sshpk', range: '>=1.7.0 <2.0.0', hasData: false } -1867 silly mapToRegistry name sshpk -1868 silly mapToRegistry using default registry -1869 silly mapToRegistry registry https://registry.npmjs.org/ -1870 silly mapToRegistry uri https://registry.npmjs.org/sshpk -1871 verbose addNameRange registry:https://registry.npmjs.org/sshpk not in flight; fetching -1872 verbose afterAdd /home/christine/.npm/jsprim/1.4.1/package/package.json written -1873 verbose get https://registry.npmjs.org/sshpk not expired, no request -1874 silly addNameRange number 2 { name: 'sshpk', range: '>=1.7.0 <2.0.0', hasData: true } -1875 silly addNameRange versions [ 'sshpk', -1875 silly addNameRange [ '1.0.0', -1875 silly addNameRange '1.0.1', -1875 silly addNameRange '1.0.2', -1875 silly addNameRange '1.0.3', -1875 silly addNameRange '1.0.4', -1875 silly addNameRange '1.1.0', -1875 silly addNameRange '1.2.0', -1875 silly addNameRange '1.2.1', -1875 silly addNameRange '1.3.0', -1875 silly addNameRange '1.4.0', -1875 silly addNameRange '1.4.1', -1875 silly addNameRange '1.4.2', -1875 silly addNameRange '1.4.3', -1875 silly addNameRange '1.4.4', -1875 silly addNameRange '1.4.5', -1875 silly addNameRange '1.4.6', -1875 silly addNameRange '1.4.7', -1875 silly addNameRange '1.5.0', -1875 silly addNameRange '1.5.1', -1875 silly addNameRange '1.6.0', -1875 silly addNameRange '1.6.1', -1875 silly addNameRange '1.6.2', -1875 silly addNameRange '1.7.0', -1875 silly addNameRange '1.7.1', -1875 silly addNameRange '1.7.2', -1875 silly addNameRange '1.7.3', -1875 silly addNameRange '1.7.4', -1875 silly addNameRange '1.8.0', -1875 silly addNameRange '1.8.1', -1875 silly addNameRange '1.8.2', -1875 silly addNameRange '1.8.3', -1875 silly addNameRange '1.9.0', -1875 silly addNameRange '1.9.1', -1875 silly addNameRange '1.9.2', -1875 silly addNameRange '1.10.0', -1875 silly addNameRange '1.10.1', -1875 silly addNameRange '1.10.2', -1875 silly addNameRange '1.11.0', -1875 silly addNameRange '1.13.0', -1875 silly addNameRange '1.13.1', -1875 silly addNameRange '1.13.2', -1875 silly addNameRange '1.14.1', -1875 silly addNameRange '1.14.2', -1875 silly addNameRange '1.15.0', -1875 silly addNameRange '1.15.1', -1875 silly addNameRange '1.15.2', -1875 silly addNameRange '1.16.0', -1875 silly addNameRange '1.16.1' ] ] -1876 silly addNamed sshpk@1.16.1 -1877 verbose addNamed "1.16.1" is a plain semver version for sshpk -1878 silly cache afterAdd sshpk@1.16.1 -1879 verbose afterAdd /home/christine/.npm/sshpk/1.16.1/package/package.json not in flight; writing -1880 verbose afterAdd /home/christine/.npm/sshpk/1.16.1/package/package.json written -1881 silly fetchNamedPackageData extsprintf -1882 silly mapToRegistry name extsprintf -1883 silly mapToRegistry using default registry -1884 silly mapToRegistry registry https://registry.npmjs.org/ -1885 silly mapToRegistry uri https://registry.npmjs.org/extsprintf -1886 silly fetchNamedPackageData json-schema -1887 silly mapToRegistry name json-schema -1888 silly mapToRegistry using default registry -1889 silly mapToRegistry registry https://registry.npmjs.org/ -1890 silly mapToRegistry uri https://registry.npmjs.org/json-schema -1891 silly fetchNamedPackageData verror -1892 silly mapToRegistry name verror -1893 silly mapToRegistry using default registry -1894 silly mapToRegistry registry https://registry.npmjs.org/ -1895 silly mapToRegistry uri https://registry.npmjs.org/verror -1896 verbose request uri https://registry.npmjs.org/json-schema -1897 verbose request no auth needed -1898 info attempt registry request try #1 at 13:48:58 -1899 verbose etag W/"5274dd0ff41b090868548552fd39da3b" -1900 verbose lastModified Fri, 06 Sep 2019 03:31:48 GMT -1901 http request GET https://registry.npmjs.org/json-schema -1902 verbose request uri https://registry.npmjs.org/extsprintf -1903 verbose request no auth needed -1904 info attempt registry request try #1 at 13:48:58 -1905 verbose etag W/"181f798a7717cf280fb342d9306fa973" -1906 verbose lastModified Fri, 13 Dec 2019 16:32:18 GMT -1907 http request GET https://registry.npmjs.org/extsprintf -1908 verbose request uri https://registry.npmjs.org/verror -1909 verbose request no auth needed -1910 info attempt registry request try #1 at 13:48:58 -1911 verbose etag W/"cee3cbe58715caedf23b4d5aa0f1317b" -1912 verbose lastModified Fri, 13 Dec 2019 16:33:19 GMT -1913 http request GET https://registry.npmjs.org/verror -1914 http 200 https://registry.npmjs.org/extsprintf -1915 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1915 verbose headers 'content-type': 'application/json', -1915 verbose headers 'transfer-encoding': 'chunked', -1915 verbose headers connection: 'keep-alive', -1915 verbose headers 'set-cookie': -1915 verbose headers [ '__cfduid=d97096327dc35362784756beebc4958ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1915 verbose headers 'cf-ray': '59764faa2855c2ae-FRA', -1915 verbose headers age: '5351', -1915 verbose headers 'cache-control': 'public, max-age=300', -1915 verbose headers etag: 'W/"c1458bfec410835c4eaea2e0b344814b"', -1915 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:29 GMT', -1915 verbose headers vary: 'accept-encoding, accept', -1915 verbose headers 'cf-cache-status': 'HIT', -1915 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1915 verbose headers server: 'cloudflare', -1915 verbose headers 'content-encoding': 'gzip', -1915 verbose headers 'cf-request-id': '02ddd01e550000c2aea018c200000001' } -1916 silly get cb [ 200, -1916 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1916 silly get 'content-type': 'application/json', -1916 silly get 'transfer-encoding': 'chunked', -1916 silly get connection: 'keep-alive', -1916 silly get 'set-cookie': -1916 silly get [ '__cfduid=d97096327dc35362784756beebc4958ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1916 silly get 'cf-ray': '59764faa2855c2ae-FRA', -1916 silly get age: '5351', -1916 silly get 'cache-control': 'public, max-age=300', -1916 silly get etag: 'W/"c1458bfec410835c4eaea2e0b344814b"', -1916 silly get 'last-modified': 'Wed, 06 May 2020 14:47:29 GMT', -1916 silly get vary: 'accept-encoding, accept', -1916 silly get 'cf-cache-status': 'HIT', -1916 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1916 silly get server: 'cloudflare', -1916 silly get 'content-encoding': 'gzip', -1916 silly get 'cf-request-id': '02ddd01e550000c2aea018c200000001' } ] -1917 verbose get saving extsprintf to /home/christine/.npm/registry.npmjs.org/extsprintf/.cache.json -1918 silly resolveWithNewModule extsprintf@1.3.0 checking installable status -1919 silly cache add args [ 'extsprintf@1.3.0', null ] -1920 verbose cache add spec extsprintf@1.3.0 -1921 silly cache add parsed spec Result { -1921 silly cache add raw: 'extsprintf@1.3.0', -1921 silly cache add scope: null, -1921 silly cache add name: 'extsprintf', -1921 silly cache add rawSpec: '1.3.0', -1921 silly cache add spec: '1.3.0', -1921 silly cache add type: 'version' } -1922 silly addNamed extsprintf@1.3.0 -1923 verbose addNamed "1.3.0" is a plain semver version for extsprintf -1924 silly mapToRegistry name extsprintf -1925 silly mapToRegistry using default registry -1926 silly mapToRegistry registry https://registry.npmjs.org/ -1927 silly mapToRegistry uri https://registry.npmjs.org/extsprintf -1928 verbose addNameVersion registry:https://registry.npmjs.org/extsprintf not in flight; fetching -1929 verbose get https://registry.npmjs.org/extsprintf not expired, no request -1930 silly cache afterAdd extsprintf@1.3.0 -1931 verbose afterAdd /home/christine/.npm/extsprintf/1.3.0/package/package.json not in flight; writing -1932 verbose afterAdd /home/christine/.npm/extsprintf/1.3.0/package/package.json written -1933 http 200 https://registry.npmjs.org/verror -1934 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1934 verbose headers 'content-type': 'application/json', -1934 verbose headers 'transfer-encoding': 'chunked', -1934 verbose headers connection: 'keep-alive', -1934 verbose headers 'set-cookie': -1934 verbose headers [ '__cfduid=dddfaf86196e34967260afba6c78f92301590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1934 verbose headers 'cf-ray': '59764faa2b02d6e9-FRA', -1934 verbose headers age: '5351', -1934 verbose headers 'cache-control': 'public, max-age=300', -1934 verbose headers etag: 'W/"2464db9fac3b8d5a76540c0581baa37d"', -1934 verbose headers 'last-modified': 'Wed, 06 May 2020 14:48:30 GMT', -1934 verbose headers vary: 'accept-encoding, accept', -1934 verbose headers 'cf-cache-status': 'HIT', -1934 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1934 verbose headers server: 'cloudflare', -1934 verbose headers 'content-encoding': 'gzip', -1934 verbose headers 'cf-request-id': '02ddd01e550000d6e975b63200000001' } -1935 silly get cb [ 200, -1935 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1935 silly get 'content-type': 'application/json', -1935 silly get 'transfer-encoding': 'chunked', -1935 silly get connection: 'keep-alive', -1935 silly get 'set-cookie': -1935 silly get [ '__cfduid=dddfaf86196e34967260afba6c78f92301590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1935 silly get 'cf-ray': '59764faa2b02d6e9-FRA', -1935 silly get age: '5351', -1935 silly get 'cache-control': 'public, max-age=300', -1935 silly get etag: 'W/"2464db9fac3b8d5a76540c0581baa37d"', -1935 silly get 'last-modified': 'Wed, 06 May 2020 14:48:30 GMT', -1935 silly get vary: 'accept-encoding, accept', -1935 silly get 'cf-cache-status': 'HIT', -1935 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1935 silly get server: 'cloudflare', -1935 silly get 'content-encoding': 'gzip', -1935 silly get 'cf-request-id': '02ddd01e550000d6e975b63200000001' } ] -1936 verbose get saving verror to /home/christine/.npm/registry.npmjs.org/verror/.cache.json -1937 silly resolveWithNewModule verror@1.10.0 checking installable status -1938 silly cache add args [ 'verror@1.10.0', null ] -1939 verbose cache add spec verror@1.10.0 -1940 silly cache add parsed spec Result { -1940 silly cache add raw: 'verror@1.10.0', -1940 silly cache add scope: null, -1940 silly cache add name: 'verror', -1940 silly cache add rawSpec: '1.10.0', -1940 silly cache add spec: '1.10.0', -1940 silly cache add type: 'version' } -1941 silly addNamed verror@1.10.0 -1942 verbose addNamed "1.10.0" is a plain semver version for verror -1943 silly mapToRegistry name verror -1944 silly mapToRegistry using default registry -1945 silly mapToRegistry registry https://registry.npmjs.org/ -1946 silly mapToRegistry uri https://registry.npmjs.org/verror -1947 verbose addNameVersion registry:https://registry.npmjs.org/verror not in flight; fetching -1948 verbose get https://registry.npmjs.org/verror not expired, no request -1949 http 304 https://registry.npmjs.org/json-schema -1950 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1950 verbose headers connection: 'keep-alive', -1950 verbose headers 'set-cookie': -1950 verbose headers [ '__cfduid=dcd1e19ee0a127106f70d3cbc3e6456db1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1950 verbose headers 'cf-ray': '59764faa2c451f2d-FRA', -1950 verbose headers age: '5351', -1950 verbose headers 'cache-control': 'public, max-age=300', -1950 verbose headers etag: '"5274dd0ff41b090868548552fd39da3b"', -1950 verbose headers 'last-modified': 'Fri, 06 Sep 2019 03:31:48 GMT', -1950 verbose headers vary: 'Accept-Encoding', -1950 verbose headers 'cf-cache-status': 'HIT', -1950 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1950 verbose headers server: 'cloudflare', -1950 verbose headers 'cf-request-id': '02ddd01e5500001f2df5221200000001' } -1951 silly get cb [ 304, -1951 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1951 silly get connection: 'keep-alive', -1951 silly get 'set-cookie': -1951 silly get [ '__cfduid=dcd1e19ee0a127106f70d3cbc3e6456db1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1951 silly get 'cf-ray': '59764faa2c451f2d-FRA', -1951 silly get age: '5351', -1951 silly get 'cache-control': 'public, max-age=300', -1951 silly get etag: '"5274dd0ff41b090868548552fd39da3b"', -1951 silly get 'last-modified': 'Fri, 06 Sep 2019 03:31:48 GMT', -1951 silly get vary: 'Accept-Encoding', -1951 silly get 'cf-cache-status': 'HIT', -1951 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1951 silly get server: 'cloudflare', -1951 silly get 'cf-request-id': '02ddd01e5500001f2df5221200000001' } ] -1952 verbose etag https://registry.npmjs.org/json-schema from cache -1953 verbose get saving json-schema to /home/christine/.npm/registry.npmjs.org/json-schema/.cache.json -1954 silly cache afterAdd verror@1.10.0 -1955 verbose afterAdd /home/christine/.npm/verror/1.10.0/package/package.json not in flight; writing -1956 silly resolveWithNewModule json-schema@0.2.3 checking installable status -1957 silly cache add args [ 'json-schema@0.2.3', null ] -1958 verbose cache add spec json-schema@0.2.3 -1959 silly cache add parsed spec Result { -1959 silly cache add raw: 'json-schema@0.2.3', -1959 silly cache add scope: null, -1959 silly cache add name: 'json-schema', -1959 silly cache add rawSpec: '0.2.3', -1959 silly cache add spec: '0.2.3', -1959 silly cache add type: 'version' } -1960 silly addNamed json-schema@0.2.3 -1961 verbose addNamed "0.2.3" is a plain semver version for json-schema -1962 silly mapToRegistry name json-schema -1963 silly mapToRegistry using default registry -1964 silly mapToRegistry registry https://registry.npmjs.org/ -1965 silly mapToRegistry uri https://registry.npmjs.org/json-schema -1966 verbose addNameVersion registry:https://registry.npmjs.org/json-schema not in flight; fetching -1967 verbose afterAdd /home/christine/.npm/verror/1.10.0/package/package.json written -1968 verbose get https://registry.npmjs.org/json-schema not expired, no request -1969 silly cache afterAdd json-schema@0.2.3 -1970 verbose afterAdd /home/christine/.npm/json-schema/0.2.3/package/package.json not in flight; writing -1971 verbose afterAdd /home/christine/.npm/json-schema/0.2.3/package/package.json written -1972 silly fetchNamedPackageData core-util-is -1973 silly mapToRegistry name core-util-is -1974 silly mapToRegistry using default registry -1975 silly mapToRegistry registry https://registry.npmjs.org/ -1976 silly mapToRegistry uri https://registry.npmjs.org/core-util-is -1977 verbose request uri https://registry.npmjs.org/core-util-is -1978 verbose request no auth needed -1979 info attempt registry request try #1 at 13:48:58 -1980 verbose etag W/"8076d16a76bac5764f6fda9911b2b501" -1981 verbose lastModified Sat, 26 May 2018 21:08:01 GMT -1982 http request GET https://registry.npmjs.org/core-util-is -1983 http 304 https://registry.npmjs.org/core-util-is -1984 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -1984 verbose headers connection: 'keep-alive', -1984 verbose headers 'set-cookie': -1984 verbose headers [ '__cfduid=dd8c554223c8c1f8d1054bd78bd816a791590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1984 verbose headers 'cf-ray': '59764faa6c9405fd-FRA', -1984 verbose headers age: '5358', -1984 verbose headers 'cache-control': 'public, max-age=300', -1984 verbose headers etag: '"8076d16a76bac5764f6fda9911b2b501"', -1984 verbose headers 'last-modified': 'Sat, 26 May 2018 21:08:01 GMT', -1984 verbose headers vary: 'Accept-Encoding', -1984 verbose headers 'cf-cache-status': 'HIT', -1984 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1984 verbose headers server: 'cloudflare', -1984 verbose headers 'cf-request-id': '02ddd01e80000005fd8daad200000001' } -1985 silly get cb [ 304, -1985 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -1985 silly get connection: 'keep-alive', -1985 silly get 'set-cookie': -1985 silly get [ '__cfduid=dd8c554223c8c1f8d1054bd78bd816a791590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -1985 silly get 'cf-ray': '59764faa6c9405fd-FRA', -1985 silly get age: '5358', -1985 silly get 'cache-control': 'public, max-age=300', -1985 silly get etag: '"8076d16a76bac5764f6fda9911b2b501"', -1985 silly get 'last-modified': 'Sat, 26 May 2018 21:08:01 GMT', -1985 silly get vary: 'Accept-Encoding', -1985 silly get 'cf-cache-status': 'HIT', -1985 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -1985 silly get server: 'cloudflare', -1985 silly get 'cf-request-id': '02ddd01e80000005fd8daad200000001' } ] -1986 verbose etag https://registry.npmjs.org/core-util-is from cache -1987 verbose get saving core-util-is to /home/christine/.npm/registry.npmjs.org/core-util-is/.cache.json -1988 silly resolveWithNewModule core-util-is@1.0.2 checking installable status -1989 silly cache add args [ 'core-util-is@1.0.2', null ] -1990 verbose cache add spec core-util-is@1.0.2 -1991 silly cache add parsed spec Result { -1991 silly cache add raw: 'core-util-is@1.0.2', -1991 silly cache add scope: null, -1991 silly cache add name: 'core-util-is', -1991 silly cache add rawSpec: '1.0.2', -1991 silly cache add spec: '1.0.2', -1991 silly cache add type: 'version' } -1992 silly addNamed core-util-is@1.0.2 -1993 verbose addNamed "1.0.2" is a plain semver version for core-util-is -1994 silly mapToRegistry name core-util-is -1995 silly mapToRegistry using default registry -1996 silly mapToRegistry registry https://registry.npmjs.org/ -1997 silly mapToRegistry uri https://registry.npmjs.org/core-util-is -1998 verbose addNameVersion registry:https://registry.npmjs.org/core-util-is not in flight; fetching -1999 verbose get https://registry.npmjs.org/core-util-is not expired, no request -2000 silly cache afterAdd core-util-is@1.0.2 -2001 verbose afterAdd /home/christine/.npm/core-util-is/1.0.2/package/package.json not in flight; writing -2002 verbose afterAdd /home/christine/.npm/core-util-is/1.0.2/package/package.json written -2003 silly fetchNamedPackageData asn1 -2004 silly mapToRegistry name asn1 -2005 silly mapToRegistry using default registry -2006 silly mapToRegistry registry https://registry.npmjs.org/ -2007 silly mapToRegistry uri https://registry.npmjs.org/asn1 -2008 silly fetchNamedPackageData dashdash -2009 silly mapToRegistry name dashdash -2010 silly mapToRegistry using default registry -2011 silly mapToRegistry registry https://registry.npmjs.org/ -2012 silly mapToRegistry uri https://registry.npmjs.org/dashdash -2013 silly fetchNamedPackageData getpass -2014 silly mapToRegistry name getpass -2015 silly mapToRegistry using default registry -2016 silly mapToRegistry registry https://registry.npmjs.org/ -2017 silly mapToRegistry uri https://registry.npmjs.org/getpass -2018 silly fetchNamedPackageData safer-buffer -2019 silly mapToRegistry name safer-buffer -2020 silly mapToRegistry using default registry -2021 silly mapToRegistry registry https://registry.npmjs.org/ -2022 silly mapToRegistry uri https://registry.npmjs.org/safer-buffer -2023 silly fetchNamedPackageData jsbn -2024 silly mapToRegistry name jsbn -2025 silly mapToRegistry using default registry -2026 silly mapToRegistry registry https://registry.npmjs.org/ -2027 silly mapToRegistry uri https://registry.npmjs.org/jsbn -2028 silly fetchNamedPackageData tweetnacl -2029 silly mapToRegistry name tweetnacl -2030 silly mapToRegistry using default registry -2031 silly mapToRegistry registry https://registry.npmjs.org/ -2032 silly mapToRegistry uri https://registry.npmjs.org/tweetnacl -2033 silly fetchNamedPackageData ecc-jsbn -2034 silly mapToRegistry name ecc-jsbn -2035 silly mapToRegistry using default registry -2036 silly mapToRegistry registry https://registry.npmjs.org/ -2037 silly mapToRegistry uri https://registry.npmjs.org/ecc-jsbn -2038 silly fetchNamedPackageData bcrypt-pbkdf -2039 silly mapToRegistry name bcrypt-pbkdf -2040 silly mapToRegistry using default registry -2041 silly mapToRegistry registry https://registry.npmjs.org/ -2042 silly mapToRegistry uri https://registry.npmjs.org/bcrypt-pbkdf -2043 verbose request uri https://registry.npmjs.org/asn1 -2044 verbose request no auth needed -2045 info attempt registry request try #1 at 13:48:58 -2046 verbose etag W/"de813efa4f95d8b4547fcf05d55dc504" -2047 verbose lastModified Fri, 13 Dec 2019 16:32:09 GMT -2048 http request GET https://registry.npmjs.org/asn1 -2049 verbose request uri https://registry.npmjs.org/jsbn -2050 verbose request no auth needed -2051 info attempt registry request try #1 at 13:48:58 -2052 verbose etag W/"0611ae2a6c0b557511e766ff564197a0" -2053 verbose lastModified Sun, 27 May 2018 05:34:52 GMT -2054 http request GET https://registry.npmjs.org/jsbn -2055 verbose request uri https://registry.npmjs.org/getpass -2056 verbose request no auth needed -2057 info attempt registry request try #1 at 13:48:58 -2058 verbose etag W/"cbefe53bd31f73e662e9120b48930d2f" -2059 verbose lastModified Fri, 13 Dec 2019 16:32:27 GMT -2060 http request GET https://registry.npmjs.org/getpass -2061 verbose request uri https://registry.npmjs.org/safer-buffer -2062 verbose request no auth needed -2063 info attempt registry request try #1 at 13:48:58 -2064 verbose etag W/"af6bd5bd8c6f8fc6f2baa03c0e1637e9" -2065 verbose lastModified Sun, 27 May 2018 16:29:44 GMT -2066 http request GET https://registry.npmjs.org/safer-buffer -2067 verbose request uri https://registry.npmjs.org/ecc-jsbn -2068 verbose request no auth needed -2069 info attempt registry request try #1 at 13:48:58 -2070 verbose etag W/"972b128f4c15e931ec8836237cce37e0" -2071 verbose lastModified Sun, 29 Jul 2018 17:44:41 GMT -2072 http request GET https://registry.npmjs.org/ecc-jsbn -2073 verbose request uri https://registry.npmjs.org/dashdash -2074 verbose request no auth needed -2075 info attempt registry request try #1 at 13:48:58 -2076 verbose etag W/"4ed0f11669a0fcb66513077f2f321ea9" -2077 verbose lastModified Sat, 26 May 2018 21:43:37 GMT -2078 http request GET https://registry.npmjs.org/dashdash -2079 verbose request uri https://registry.npmjs.org/tweetnacl -2080 verbose request no auth needed -2081 info attempt registry request try #1 at 13:48:58 -2082 verbose etag W/"fbf94e62e5226cbf0f67805b6d51d6fe" -2083 verbose lastModified Thu, 16 Jan 2020 19:29:00 GMT -2084 http request GET https://registry.npmjs.org/tweetnacl -2085 verbose request uri https://registry.npmjs.org/bcrypt-pbkdf -2086 verbose request no auth needed -2087 info attempt registry request try #1 at 13:48:58 -2088 verbose etag W/"46ae03958b9d75cded3b6f53d3277a12" -2089 verbose lastModified Fri, 13 Dec 2019 16:32:11 GMT -2090 http request GET https://registry.npmjs.org/bcrypt-pbkdf -2091 http 304 https://registry.npmjs.org/jsbn -2092 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2092 verbose headers connection: 'keep-alive', -2092 verbose headers 'set-cookie': -2092 verbose headers [ '__cfduid=d7325b855bbed19ce898226d1ffb9a3291590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2092 verbose headers 'cf-ray': '59764faad8fd325c-FRA', -2092 verbose headers age: '5657', -2092 verbose headers 'cache-control': 'public, max-age=300', -2092 verbose headers etag: '"0611ae2a6c0b557511e766ff564197a0"', -2092 verbose headers 'last-modified': 'Sun, 27 May 2018 05:34:52 GMT', -2092 verbose headers vary: 'Accept-Encoding', -2092 verbose headers 'cf-cache-status': 'HIT', -2092 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2092 verbose headers server: 'cloudflare', -2092 verbose headers 'cf-request-id': '02ddd01ec40000325c4c86d200000001' } -2093 silly get cb [ 304, -2093 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2093 silly get connection: 'keep-alive', -2093 silly get 'set-cookie': -2093 silly get [ '__cfduid=d7325b855bbed19ce898226d1ffb9a3291590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2093 silly get 'cf-ray': '59764faad8fd325c-FRA', -2093 silly get age: '5657', -2093 silly get 'cache-control': 'public, max-age=300', -2093 silly get etag: '"0611ae2a6c0b557511e766ff564197a0"', -2093 silly get 'last-modified': 'Sun, 27 May 2018 05:34:52 GMT', -2093 silly get vary: 'Accept-Encoding', -2093 silly get 'cf-cache-status': 'HIT', -2093 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2093 silly get server: 'cloudflare', -2093 silly get 'cf-request-id': '02ddd01ec40000325c4c86d200000001' } ] -2094 verbose etag https://registry.npmjs.org/jsbn from cache -2095 verbose get saving jsbn to /home/christine/.npm/registry.npmjs.org/jsbn/.cache.json -2096 silly resolveWithNewModule jsbn@0.1.1 checking installable status -2097 silly cache add args [ 'jsbn@~0.1.0', null ] -2098 verbose cache add spec jsbn@~0.1.0 -2099 silly cache add parsed spec Result { -2099 silly cache add raw: 'jsbn@~0.1.0', -2099 silly cache add scope: null, -2099 silly cache add name: 'jsbn', -2099 silly cache add rawSpec: '~0.1.0', -2099 silly cache add spec: '>=0.1.0 <0.2.0', -2099 silly cache add type: 'range' } -2100 silly addNamed jsbn@>=0.1.0 <0.2.0 -2101 verbose addNamed ">=0.1.0 <0.2.0" is a valid semver range for jsbn -2102 silly addNameRange { name: 'jsbn', range: '>=0.1.0 <0.2.0', hasData: false } -2103 silly mapToRegistry name jsbn -2104 silly mapToRegistry using default registry -2105 silly mapToRegistry registry https://registry.npmjs.org/ -2106 silly mapToRegistry uri https://registry.npmjs.org/jsbn -2107 verbose addNameRange registry:https://registry.npmjs.org/jsbn not in flight; fetching -2108 http 304 https://registry.npmjs.org/safer-buffer -2109 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2109 verbose headers connection: 'keep-alive', -2109 verbose headers 'set-cookie': -2109 verbose headers [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2109 verbose headers 'cf-ray': '59764faadb96648b-FRA', -2109 verbose headers age: '5660', -2109 verbose headers 'cache-control': 'public, max-age=300', -2109 verbose headers etag: '"af6bd5bd8c6f8fc6f2baa03c0e1637e9"', -2109 verbose headers 'last-modified': 'Sun, 27 May 2018 16:29:44 GMT', -2109 verbose headers vary: 'Accept-Encoding', -2109 verbose headers 'cf-cache-status': 'HIT', -2109 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2109 verbose headers server: 'cloudflare', -2109 verbose headers 'cf-request-id': '02ddd01ec80000648bda035200000001' } -2110 silly get cb [ 304, -2110 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2110 silly get connection: 'keep-alive', -2110 silly get 'set-cookie': -2110 silly get [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2110 silly get 'cf-ray': '59764faadb96648b-FRA', -2110 silly get age: '5660', -2110 silly get 'cache-control': 'public, max-age=300', -2110 silly get etag: '"af6bd5bd8c6f8fc6f2baa03c0e1637e9"', -2110 silly get 'last-modified': 'Sun, 27 May 2018 16:29:44 GMT', -2110 silly get vary: 'Accept-Encoding', -2110 silly get 'cf-cache-status': 'HIT', -2110 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2110 silly get server: 'cloudflare', -2110 silly get 'cf-request-id': '02ddd01ec80000648bda035200000001' } ] -2111 verbose etag https://registry.npmjs.org/safer-buffer from cache -2112 verbose get saving safer-buffer to /home/christine/.npm/registry.npmjs.org/safer-buffer/.cache.json -2113 http 200 https://registry.npmjs.org/getpass -2114 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2114 verbose headers 'content-type': 'application/json', -2114 verbose headers 'transfer-encoding': 'chunked', -2114 verbose headers connection: 'keep-alive', -2114 verbose headers 'set-cookie': -2114 verbose headers [ '__cfduid=dd010058b9e3e0b8be866b1c539f3a13d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2114 verbose headers 'cf-ray': '59764faadf226347-FRA', -2114 verbose headers age: '5656', -2114 verbose headers 'cache-control': 'public, max-age=300', -2114 verbose headers etag: 'W/"869ca13d164a27967315d623e8ce7ed7"', -2114 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:37 GMT', -2114 verbose headers vary: 'accept-encoding, accept', -2114 verbose headers 'cf-cache-status': 'HIT', -2114 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2114 verbose headers server: 'cloudflare', -2114 verbose headers 'content-encoding': 'gzip', -2114 verbose headers 'cf-request-id': '02ddd01ec800006347e88e6200000001' } -2115 silly get cb [ 200, -2115 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2115 silly get 'content-type': 'application/json', -2115 silly get 'transfer-encoding': 'chunked', -2115 silly get connection: 'keep-alive', -2115 silly get 'set-cookie': -2115 silly get [ '__cfduid=dd010058b9e3e0b8be866b1c539f3a13d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2115 silly get 'cf-ray': '59764faadf226347-FRA', -2115 silly get age: '5656', -2115 silly get 'cache-control': 'public, max-age=300', -2115 silly get etag: 'W/"869ca13d164a27967315d623e8ce7ed7"', -2115 silly get 'last-modified': 'Wed, 06 May 2020 14:47:37 GMT', -2115 silly get vary: 'accept-encoding, accept', -2115 silly get 'cf-cache-status': 'HIT', -2115 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2115 silly get server: 'cloudflare', -2115 silly get 'content-encoding': 'gzip', -2115 silly get 'cf-request-id': '02ddd01ec800006347e88e6200000001' } ] -2116 verbose get saving getpass to /home/christine/.npm/registry.npmjs.org/getpass/.cache.json -2117 http 200 https://registry.npmjs.org/bcrypt-pbkdf -2118 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2118 verbose headers 'content-type': 'application/json', -2118 verbose headers 'transfer-encoding': 'chunked', -2118 verbose headers connection: 'keep-alive', -2118 verbose headers 'set-cookie': -2118 verbose headers [ '__cfduid=d0e932d8ab348df1bf36d2b5c827b275c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2118 verbose headers 'cf-ray': '59764faaef896413-FRA', -2118 verbose headers age: '5653', -2118 verbose headers 'cache-control': 'public, max-age=300', -2118 verbose headers etag: 'W/"f08505ab6749543a27b96d63fd64d6c1"', -2118 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', -2118 verbose headers vary: 'accept-encoding, accept', -2118 verbose headers 'cf-cache-status': 'HIT', -2118 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2118 verbose headers server: 'cloudflare', -2118 verbose headers 'content-encoding': 'gzip', -2118 verbose headers 'cf-request-id': '02ddd01ece000064135f93f200000001' } -2119 silly get cb [ 200, -2119 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2119 silly get 'content-type': 'application/json', -2119 silly get 'transfer-encoding': 'chunked', -2119 silly get connection: 'keep-alive', -2119 silly get 'set-cookie': -2119 silly get [ '__cfduid=d0e932d8ab348df1bf36d2b5c827b275c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2119 silly get 'cf-ray': '59764faaef896413-FRA', -2119 silly get age: '5653', -2119 silly get 'cache-control': 'public, max-age=300', -2119 silly get etag: 'W/"f08505ab6749543a27b96d63fd64d6c1"', -2119 silly get 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT', -2119 silly get vary: 'accept-encoding, accept', -2119 silly get 'cf-cache-status': 'HIT', -2119 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2119 silly get server: 'cloudflare', -2119 silly get 'content-encoding': 'gzip', -2119 silly get 'cf-request-id': '02ddd01ece000064135f93f200000001' } ] -2120 verbose get saving bcrypt-pbkdf to /home/christine/.npm/registry.npmjs.org/bcrypt-pbkdf/.cache.json -2121 http 200 https://registry.npmjs.org/asn1 -2122 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2122 verbose headers 'content-type': 'application/json', -2122 verbose headers 'transfer-encoding': 'chunked', -2122 verbose headers connection: 'keep-alive', -2122 verbose headers 'set-cookie': -2122 verbose headers [ '__cfduid=d2a12158e0b1816dc3511d38bce84223a1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2122 verbose headers 'cf-ray': '59764faadddcc272-FRA', -2122 verbose headers age: '5652', -2122 verbose headers 'cache-control': 'public, max-age=300', -2122 verbose headers etag: 'W/"53988a6250256bd0f9e9b253aaf39e0b"', -2122 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:19 GMT', -2122 verbose headers vary: 'accept-encoding, accept', -2122 verbose headers 'cf-cache-status': 'HIT', -2122 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2122 verbose headers server: 'cloudflare', -2122 verbose headers 'content-encoding': 'gzip', -2122 verbose headers 'cf-request-id': '02ddd01ec40000c272388f9200000001' } -2123 silly get cb [ 200, -2123 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2123 silly get 'content-type': 'application/json', -2123 silly get 'transfer-encoding': 'chunked', -2123 silly get connection: 'keep-alive', -2123 silly get 'set-cookie': -2123 silly get [ '__cfduid=d2a12158e0b1816dc3511d38bce84223a1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2123 silly get 'cf-ray': '59764faadddcc272-FRA', -2123 silly get age: '5652', -2123 silly get 'cache-control': 'public, max-age=300', -2123 silly get etag: 'W/"53988a6250256bd0f9e9b253aaf39e0b"', -2123 silly get 'last-modified': 'Wed, 06 May 2020 14:47:19 GMT', -2123 silly get vary: 'accept-encoding, accept', -2123 silly get 'cf-cache-status': 'HIT', -2123 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2123 silly get server: 'cloudflare', -2123 silly get 'content-encoding': 'gzip', -2123 silly get 'cf-request-id': '02ddd01ec40000c272388f9200000001' } ] -2124 verbose get saving asn1 to /home/christine/.npm/registry.npmjs.org/asn1/.cache.json -2125 verbose get https://registry.npmjs.org/jsbn not expired, no request -2126 silly addNameRange number 2 { name: 'jsbn', range: '>=0.1.0 <0.2.0', hasData: true } -2127 silly addNameRange versions [ 'jsbn', [ '0.0.0', '0.1.0', '0.1.1', '1.1.0' ] ] -2128 silly addNamed jsbn@0.1.1 -2129 verbose addNamed "0.1.1" is a plain semver version for jsbn -2130 http 304 https://registry.npmjs.org/dashdash -2131 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2131 verbose headers connection: 'keep-alive', -2131 verbose headers 'set-cookie': -2131 verbose headers [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2131 verbose headers 'cf-ray': '59764faaeb21175a-FRA', -2131 verbose headers age: '5350', -2131 verbose headers 'cache-control': 'public, max-age=300', -2131 verbose headers etag: '"4ed0f11669a0fcb66513077f2f321ea9"', -2131 verbose headers 'last-modified': 'Sat, 26 May 2018 21:43:37 GMT', -2131 verbose headers vary: 'Accept-Encoding', -2131 verbose headers 'cf-cache-status': 'HIT', -2131 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2131 verbose headers server: 'cloudflare', -2131 verbose headers 'cf-request-id': '02ddd01ece0000175a1e236200000001' } -2132 silly get cb [ 304, -2132 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2132 silly get connection: 'keep-alive', -2132 silly get 'set-cookie': -2132 silly get [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2132 silly get 'cf-ray': '59764faaeb21175a-FRA', -2132 silly get age: '5350', -2132 silly get 'cache-control': 'public, max-age=300', -2132 silly get etag: '"4ed0f11669a0fcb66513077f2f321ea9"', -2132 silly get 'last-modified': 'Sat, 26 May 2018 21:43:37 GMT', -2132 silly get vary: 'Accept-Encoding', -2132 silly get 'cf-cache-status': 'HIT', -2132 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2132 silly get server: 'cloudflare', -2132 silly get 'cf-request-id': '02ddd01ece0000175a1e236200000001' } ] -2133 verbose etag https://registry.npmjs.org/dashdash from cache -2134 verbose get saving dashdash to /home/christine/.npm/registry.npmjs.org/dashdash/.cache.json -2135 silly resolveWithNewModule safer-buffer@2.1.2 checking installable status -2136 silly cache add args [ 'safer-buffer@^2.0.2', null ] -2137 verbose cache add spec safer-buffer@^2.0.2 -2138 silly cache add parsed spec Result { -2138 silly cache add raw: 'safer-buffer@^2.0.2', -2138 silly cache add scope: null, -2138 silly cache add name: 'safer-buffer', -2138 silly cache add rawSpec: '^2.0.2', -2138 silly cache add spec: '>=2.0.2 <3.0.0', -2138 silly cache add type: 'range' } -2139 silly addNamed safer-buffer@>=2.0.2 <3.0.0 -2140 verbose addNamed ">=2.0.2 <3.0.0" is a valid semver range for safer-buffer -2141 silly addNameRange { name: 'safer-buffer', range: '>=2.0.2 <3.0.0', hasData: false } -2142 silly mapToRegistry name safer-buffer -2143 silly mapToRegistry using default registry -2144 silly mapToRegistry registry https://registry.npmjs.org/ -2145 silly mapToRegistry uri https://registry.npmjs.org/safer-buffer -2146 verbose addNameRange registry:https://registry.npmjs.org/safer-buffer not in flight; fetching -2147 silly resolveWithNewModule getpass@0.1.7 checking installable status -2148 silly cache add args [ 'getpass@^0.1.1', null ] -2149 verbose cache add spec getpass@^0.1.1 -2150 silly cache add parsed spec Result { -2150 silly cache add raw: 'getpass@^0.1.1', -2150 silly cache add scope: null, -2150 silly cache add name: 'getpass', -2150 silly cache add rawSpec: '^0.1.1', -2150 silly cache add spec: '>=0.1.1 <0.2.0', -2150 silly cache add type: 'range' } -2151 silly addNamed getpass@>=0.1.1 <0.2.0 -2152 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for getpass -2153 silly addNameRange { name: 'getpass', range: '>=0.1.1 <0.2.0', hasData: false } -2154 silly mapToRegistry name getpass -2155 silly mapToRegistry using default registry -2156 silly mapToRegistry registry https://registry.npmjs.org/ -2157 silly mapToRegistry uri https://registry.npmjs.org/getpass -2158 verbose addNameRange registry:https://registry.npmjs.org/getpass not in flight; fetching -2159 silly resolveWithNewModule bcrypt-pbkdf@1.0.2 checking installable status -2160 silly cache add args [ 'bcrypt-pbkdf@^1.0.0', null ] -2161 verbose cache add spec bcrypt-pbkdf@^1.0.0 -2162 silly cache add parsed spec Result { -2162 silly cache add raw: 'bcrypt-pbkdf@^1.0.0', -2162 silly cache add scope: null, -2162 silly cache add name: 'bcrypt-pbkdf', -2162 silly cache add rawSpec: '^1.0.0', -2162 silly cache add spec: '>=1.0.0 <2.0.0', -2162 silly cache add type: 'range' } -2163 silly addNamed bcrypt-pbkdf@>=1.0.0 <2.0.0 -2164 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for bcrypt-pbkdf -2165 silly addNameRange { name: 'bcrypt-pbkdf', range: '>=1.0.0 <2.0.0', hasData: false } -2166 silly mapToRegistry name bcrypt-pbkdf -2167 silly mapToRegistry using default registry -2168 silly mapToRegistry registry https://registry.npmjs.org/ -2169 silly mapToRegistry uri https://registry.npmjs.org/bcrypt-pbkdf -2170 verbose addNameRange registry:https://registry.npmjs.org/bcrypt-pbkdf not in flight; fetching -2171 silly cache afterAdd jsbn@0.1.1 -2172 verbose afterAdd /home/christine/.npm/jsbn/0.1.1/package/package.json not in flight; writing -2173 silly resolveWithNewModule asn1@0.2.4 checking installable status -2174 silly cache add args [ 'asn1@~0.2.3', null ] -2175 verbose cache add spec asn1@~0.2.3 -2176 silly cache add parsed spec Result { -2176 silly cache add raw: 'asn1@~0.2.3', -2176 silly cache add scope: null, -2176 silly cache add name: 'asn1', -2176 silly cache add rawSpec: '~0.2.3', -2176 silly cache add spec: '>=0.2.3 <0.3.0', -2176 silly cache add type: 'range' } -2177 silly addNamed asn1@>=0.2.3 <0.3.0 -2178 verbose addNamed ">=0.2.3 <0.3.0" is a valid semver range for asn1 -2179 silly addNameRange { name: 'asn1', range: '>=0.2.3 <0.3.0', hasData: false } -2180 silly mapToRegistry name asn1 -2181 silly mapToRegistry using default registry -2182 silly mapToRegistry registry https://registry.npmjs.org/ -2183 silly mapToRegistry uri https://registry.npmjs.org/asn1 -2184 verbose addNameRange registry:https://registry.npmjs.org/asn1 not in flight; fetching -2185 silly resolveWithNewModule dashdash@1.14.1 checking installable status -2186 silly cache add args [ 'dashdash@^1.12.0', null ] -2187 verbose cache add spec dashdash@^1.12.0 -2188 silly cache add parsed spec Result { -2188 silly cache add raw: 'dashdash@^1.12.0', -2188 silly cache add scope: null, -2188 silly cache add name: 'dashdash', -2188 silly cache add rawSpec: '^1.12.0', -2188 silly cache add spec: '>=1.12.0 <2.0.0', -2188 silly cache add type: 'range' } -2189 silly addNamed dashdash@>=1.12.0 <2.0.0 -2190 verbose addNamed ">=1.12.0 <2.0.0" is a valid semver range for dashdash -2191 silly addNameRange { name: 'dashdash', range: '>=1.12.0 <2.0.0', hasData: false } -2192 silly mapToRegistry name dashdash -2193 silly mapToRegistry using default registry -2194 silly mapToRegistry registry https://registry.npmjs.org/ -2195 silly mapToRegistry uri https://registry.npmjs.org/dashdash -2196 verbose addNameRange registry:https://registry.npmjs.org/dashdash not in flight; fetching -2197 http 200 https://registry.npmjs.org/tweetnacl -2198 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2198 verbose headers 'content-type': 'application/json', -2198 verbose headers 'transfer-encoding': 'chunked', -2198 verbose headers connection: 'keep-alive', -2198 verbose headers 'set-cookie': -2198 verbose headers [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2198 verbose headers 'cf-ray': '59764faae943d715-FRA', -2198 verbose headers age: '5653', -2198 verbose headers 'cache-control': 'public, max-age=300', -2198 verbose headers etag: 'W/"1b4cf5c8f09886b489d11782a23a9cbf"', -2198 verbose headers 'last-modified': 'Sat, 09 May 2020 13:43:32 GMT', -2198 verbose headers vary: 'accept-encoding, accept', -2198 verbose headers 'cf-cache-status': 'HIT', -2198 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2198 verbose headers server: 'cloudflare', -2198 verbose headers 'content-encoding': 'gzip', -2198 verbose headers 'cf-request-id': '02ddd01ecf0000d715c122c200000001' } -2199 silly get cb [ 200, -2199 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2199 silly get 'content-type': 'application/json', -2199 silly get 'transfer-encoding': 'chunked', -2199 silly get connection: 'keep-alive', -2199 silly get 'set-cookie': -2199 silly get [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2199 silly get 'cf-ray': '59764faae943d715-FRA', -2199 silly get age: '5653', -2199 silly get 'cache-control': 'public, max-age=300', -2199 silly get etag: 'W/"1b4cf5c8f09886b489d11782a23a9cbf"', -2199 silly get 'last-modified': 'Sat, 09 May 2020 13:43:32 GMT', -2199 silly get vary: 'accept-encoding, accept', -2199 silly get 'cf-cache-status': 'HIT', -2199 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2199 silly get server: 'cloudflare', -2199 silly get 'content-encoding': 'gzip', -2199 silly get 'cf-request-id': '02ddd01ecf0000d715c122c200000001' } ] -2200 verbose get saving tweetnacl to /home/christine/.npm/registry.npmjs.org/tweetnacl/.cache.json -2201 verbose get https://registry.npmjs.org/safer-buffer not expired, no request -2202 silly addNameRange number 2 { name: 'safer-buffer', range: '>=2.0.2 <3.0.0', hasData: true } -2203 silly addNameRange versions [ 'safer-buffer', -2203 silly addNameRange [ '2.0.0', '2.0.1', '2.0.2', '2.1.0', '2.1.1', '2.1.2' ] ] -2204 silly addNamed safer-buffer@2.1.2 -2205 verbose addNamed "2.1.2" is a plain semver version for safer-buffer -2206 verbose get https://registry.npmjs.org/getpass not expired, no request -2207 silly addNameRange number 2 { name: 'getpass', range: '>=0.1.1 <0.2.0', hasData: true } -2208 silly addNameRange versions [ 'getpass', -2208 silly addNameRange [ '0.1.0', -2208 silly addNameRange '0.1.1', -2208 silly addNameRange '0.1.2', -2208 silly addNameRange '0.1.3', -2208 silly addNameRange '0.1.4', -2208 silly addNameRange '0.1.5', -2208 silly addNameRange '0.1.6', -2208 silly addNameRange '0.1.7' ] ] -2209 silly addNamed getpass@0.1.7 -2210 verbose addNamed "0.1.7" is a plain semver version for getpass -2211 verbose get https://registry.npmjs.org/bcrypt-pbkdf not expired, no request -2212 silly addNameRange number 2 { name: 'bcrypt-pbkdf', range: '>=1.0.0 <2.0.0', hasData: true } -2213 silly addNameRange versions [ 'bcrypt-pbkdf', [ '1.0.0', '1.0.1', '1.0.2' ] ] -2214 silly addNamed bcrypt-pbkdf@1.0.2 -2215 verbose addNamed "1.0.2" is a plain semver version for bcrypt-pbkdf -2216 verbose get https://registry.npmjs.org/asn1 not expired, no request -2217 silly addNameRange number 2 { name: 'asn1', range: '>=0.2.3 <0.3.0', hasData: true } -2218 silly addNameRange versions [ 'asn1', -2218 silly addNameRange [ '0.1.0', -2218 silly addNameRange '0.1.1', -2218 silly addNameRange '0.1.2', -2218 silly addNameRange '0.1.3', -2218 silly addNameRange '0.1.4', -2218 silly addNameRange '0.1.5', -2218 silly addNameRange '0.1.6', -2218 silly addNameRange '0.1.7', -2218 silly addNameRange '0.1.8', -2218 silly addNameRange '0.1.9', -2218 silly addNameRange '0.1.10', -2218 silly addNameRange '0.1.11', -2218 silly addNameRange '0.2.0', -2218 silly addNameRange '0.2.1', -2218 silly addNameRange '0.2.2', -2218 silly addNameRange '0.2.3', -2218 silly addNameRange '0.2.4' ] ] -2219 silly addNamed asn1@0.2.4 -2220 verbose addNamed "0.2.4" is a plain semver version for asn1 -2221 verbose afterAdd /home/christine/.npm/jsbn/0.1.1/package/package.json written -2222 http 304 https://registry.npmjs.org/ecc-jsbn -2223 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2223 verbose headers connection: 'keep-alive', -2223 verbose headers 'set-cookie': -2223 verbose headers [ '__cfduid=d3be9a0b80d7155f3e9da29972b7410c41590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2223 verbose headers 'cf-ray': '59764faaec18dfc7-FRA', -2223 verbose headers age: '5653', -2223 verbose headers 'cache-control': 'public, max-age=300', -2223 verbose headers etag: '"972b128f4c15e931ec8836237cce37e0"', -2223 verbose headers 'last-modified': 'Sun, 29 Jul 2018 17:44:41 GMT', -2223 verbose headers vary: 'Accept-Encoding', -2223 verbose headers 'cf-cache-status': 'HIT', -2223 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2223 verbose headers server: 'cloudflare', -2223 verbose headers 'cf-request-id': '02ddd01ece0000dfc72a8d3200000001' } -2224 silly get cb [ 304, -2224 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2224 silly get connection: 'keep-alive', -2224 silly get 'set-cookie': -2224 silly get [ '__cfduid=d3be9a0b80d7155f3e9da29972b7410c41590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2224 silly get 'cf-ray': '59764faaec18dfc7-FRA', -2224 silly get age: '5653', -2224 silly get 'cache-control': 'public, max-age=300', -2224 silly get etag: '"972b128f4c15e931ec8836237cce37e0"', -2224 silly get 'last-modified': 'Sun, 29 Jul 2018 17:44:41 GMT', -2224 silly get vary: 'Accept-Encoding', -2224 silly get 'cf-cache-status': 'HIT', -2224 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2224 silly get server: 'cloudflare', -2224 silly get 'cf-request-id': '02ddd01ece0000dfc72a8d3200000001' } ] -2225 verbose etag https://registry.npmjs.org/ecc-jsbn from cache -2226 verbose get saving ecc-jsbn to /home/christine/.npm/registry.npmjs.org/ecc-jsbn/.cache.json -2227 verbose get https://registry.npmjs.org/dashdash not expired, no request -2228 silly addNameRange number 2 { name: 'dashdash', range: '>=1.12.0 <2.0.0', hasData: true } -2229 silly addNameRange versions [ 'dashdash', -2229 silly addNameRange [ '1.0.0', -2229 silly addNameRange '1.0.1', -2229 silly addNameRange '1.0.2', -2229 silly addNameRange '1.1.0', -2229 silly addNameRange '1.2.0', -2229 silly addNameRange '1.2.1', -2229 silly addNameRange '1.3.0', -2229 silly addNameRange '1.3.1', -2229 silly addNameRange '1.3.2', -2229 silly addNameRange '1.4.0', -2229 silly addNameRange '1.5.0', -2229 silly addNameRange '1.6.0', -2229 silly addNameRange '1.7.0', -2229 silly addNameRange '1.7.1', -2229 silly addNameRange '1.7.2', -2229 silly addNameRange '1.7.3', -2229 silly addNameRange '1.8.0', -2229 silly addNameRange '1.9.0', -2229 silly addNameRange '1.10.0', -2229 silly addNameRange '1.10.1', -2229 silly addNameRange '1.11.0', -2229 silly addNameRange '1.12.0', -2229 silly addNameRange '1.12.1', -2229 silly addNameRange '1.12.2', -2229 silly addNameRange '1.13.0', -2229 silly addNameRange '1.13.1', -2229 silly addNameRange '1.14.0', -2229 silly addNameRange '1.14.1' ] ] -2230 silly addNamed dashdash@1.14.1 -2231 verbose addNamed "1.14.1" is a plain semver version for dashdash -2232 silly cache afterAdd safer-buffer@2.1.2 -2233 verbose afterAdd /home/christine/.npm/safer-buffer/2.1.2/package/package.json not in flight; writing -2234 silly resolveWithNewModule tweetnacl@0.14.5 checking installable status -2235 silly cache add args [ 'tweetnacl@~0.14.0', null ] -2236 verbose cache add spec tweetnacl@~0.14.0 -2237 silly cache add parsed spec Result { -2237 silly cache add raw: 'tweetnacl@~0.14.0', -2237 silly cache add scope: null, -2237 silly cache add name: 'tweetnacl', -2237 silly cache add rawSpec: '~0.14.0', -2237 silly cache add spec: '>=0.14.0 <0.15.0', -2237 silly cache add type: 'range' } -2238 silly addNamed tweetnacl@>=0.14.0 <0.15.0 -2239 verbose addNamed ">=0.14.0 <0.15.0" is a valid semver range for tweetnacl -2240 silly addNameRange { name: 'tweetnacl', range: '>=0.14.0 <0.15.0', hasData: false } -2241 silly mapToRegistry name tweetnacl -2242 silly mapToRegistry using default registry -2243 silly mapToRegistry registry https://registry.npmjs.org/ -2244 silly mapToRegistry uri https://registry.npmjs.org/tweetnacl -2245 verbose addNameRange registry:https://registry.npmjs.org/tweetnacl not in flight; fetching -2246 silly cache afterAdd getpass@0.1.7 -2247 verbose afterAdd /home/christine/.npm/getpass/0.1.7/package/package.json not in flight; writing -2248 silly cache afterAdd asn1@0.2.4 -2249 verbose afterAdd /home/christine/.npm/asn1/0.2.4/package/package.json not in flight; writing -2250 silly cache afterAdd bcrypt-pbkdf@1.0.2 -2251 verbose afterAdd /home/christine/.npm/bcrypt-pbkdf/1.0.2/package/package.json not in flight; writing -2252 silly resolveWithNewModule ecc-jsbn@0.1.2 checking installable status -2253 silly cache add args [ 'ecc-jsbn@~0.1.1', null ] -2254 verbose cache add spec ecc-jsbn@~0.1.1 -2255 silly cache add parsed spec Result { -2255 silly cache add raw: 'ecc-jsbn@~0.1.1', -2255 silly cache add scope: null, -2255 silly cache add name: 'ecc-jsbn', -2255 silly cache add rawSpec: '~0.1.1', -2255 silly cache add spec: '>=0.1.1 <0.2.0', -2255 silly cache add type: 'range' } -2256 silly addNamed ecc-jsbn@>=0.1.1 <0.2.0 -2257 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for ecc-jsbn -2258 silly addNameRange { name: 'ecc-jsbn', range: '>=0.1.1 <0.2.0', hasData: false } -2259 silly mapToRegistry name ecc-jsbn -2260 silly mapToRegistry using default registry -2261 silly mapToRegistry registry https://registry.npmjs.org/ -2262 silly mapToRegistry uri https://registry.npmjs.org/ecc-jsbn -2263 verbose addNameRange registry:https://registry.npmjs.org/ecc-jsbn not in flight; fetching -2264 silly cache afterAdd dashdash@1.14.1 -2265 verbose afterAdd /home/christine/.npm/dashdash/1.14.1/package/package.json not in flight; writing -2266 verbose afterAdd /home/christine/.npm/safer-buffer/2.1.2/package/package.json written -2267 verbose get https://registry.npmjs.org/tweetnacl not expired, no request -2268 silly addNameRange number 2 { name: 'tweetnacl', range: '>=0.14.0 <0.15.0', hasData: true } -2269 silly addNameRange versions [ 'tweetnacl', -2269 silly addNameRange [ '0.9.1', -2269 silly addNameRange '0.9.2', -2269 silly addNameRange '0.10.0', -2269 silly addNameRange '0.10.1', -2269 silly addNameRange '0.11.0', -2269 silly addNameRange '0.11.1', -2269 silly addNameRange '0.11.2', -2269 silly addNameRange '0.12.0', -2269 silly addNameRange '0.12.1', -2269 silly addNameRange '0.12.2', -2269 silly addNameRange '0.13.0', -2269 silly addNameRange '0.13.1', -2269 silly addNameRange '0.13.2', -2269 silly addNameRange '0.13.3', -2269 silly addNameRange '0.14.0', -2269 silly addNameRange '0.14.1', -2269 silly addNameRange '0.14.2', -2269 silly addNameRange '0.14.3', -2269 silly addNameRange '0.14.4', -2269 silly addNameRange '0.14.5', -2269 silly addNameRange '1.0.0-rc.1', -2269 silly addNameRange '1.0.0', -2269 silly addNameRange '1.0.1', -2269 silly addNameRange '1.0.2', -2269 silly addNameRange '1.0.3' ] ] -2270 silly addNamed tweetnacl@0.14.5 -2271 verbose addNamed "0.14.5" is a plain semver version for tweetnacl -2272 verbose afterAdd /home/christine/.npm/getpass/0.1.7/package/package.json written -2273 verbose afterAdd /home/christine/.npm/asn1/0.2.4/package/package.json written -2274 verbose afterAdd /home/christine/.npm/bcrypt-pbkdf/1.0.2/package/package.json written -2275 verbose get https://registry.npmjs.org/ecc-jsbn not expired, no request -2276 silly addNameRange number 2 { name: 'ecc-jsbn', range: '>=0.1.1 <0.2.0', hasData: true } -2277 silly addNameRange versions [ 'ecc-jsbn', [ '0.0.1', '0.1.1', '0.1.2', '0.2.0' ] ] -2278 silly addNamed ecc-jsbn@0.1.2 -2279 verbose addNamed "0.1.2" is a plain semver version for ecc-jsbn -2280 verbose afterAdd /home/christine/.npm/dashdash/1.14.1/package/package.json written -2281 silly cache afterAdd tweetnacl@0.14.5 -2282 verbose afterAdd /home/christine/.npm/tweetnacl/0.14.5/package/package.json not in flight; writing -2283 silly cache afterAdd ecc-jsbn@0.1.2 -2284 verbose afterAdd /home/christine/.npm/ecc-jsbn/0.1.2/package/package.json not in flight; writing -2285 verbose afterAdd /home/christine/.npm/tweetnacl/0.14.5/package/package.json written -2286 verbose afterAdd /home/christine/.npm/ecc-jsbn/0.1.2/package/package.json written -2287 silly fetchNamedPackageData psl -2288 silly mapToRegistry name psl -2289 silly mapToRegistry using default registry -2290 silly mapToRegistry registry https://registry.npmjs.org/ -2291 silly mapToRegistry uri https://registry.npmjs.org/psl -2292 verbose request uri https://registry.npmjs.org/psl -2293 verbose request no auth needed -2294 info attempt registry request try #1 at 13:48:58 -2295 verbose etag W/"101ba2d632d4780d2de3d351ee1405be" -2296 verbose lastModified Sat, 28 Dec 2019 13:07:08 GMT -2297 http request GET https://registry.npmjs.org/psl -2298 http 200 https://registry.npmjs.org/psl -2299 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT', -2299 verbose headers 'content-type': 'application/json', -2299 verbose headers 'transfer-encoding': 'chunked', -2299 verbose headers connection: 'keep-alive', -2299 verbose headers 'set-cookie': -2299 verbose headers [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2299 verbose headers 'cf-ray': '59764fab685905bb-FRA', -2299 verbose headers age: '5659', -2299 verbose headers 'cache-control': 'public, max-age=300', -2299 verbose headers etag: 'W/"da7a245ac77d8bce14f4297f73f7e4b3"', -2299 verbose headers 'last-modified': 'Wed, 25 Mar 2020 13:29:16 GMT', -2299 verbose headers vary: 'accept-encoding, accept', -2299 verbose headers 'cf-cache-status': 'HIT', -2299 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2299 verbose headers server: 'cloudflare', -2299 verbose headers 'content-encoding': 'gzip', -2299 verbose headers 'cf-request-id': '02ddd01f1d000005bb0cac0200000001' } -2300 silly get cb [ 200, -2300 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT', -2300 silly get 'content-type': 'application/json', -2300 silly get 'transfer-encoding': 'chunked', -2300 silly get connection: 'keep-alive', -2300 silly get 'set-cookie': -2300 silly get [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ], -2300 silly get 'cf-ray': '59764fab685905bb-FRA', -2300 silly get age: '5659', -2300 silly get 'cache-control': 'public, max-age=300', -2300 silly get etag: 'W/"da7a245ac77d8bce14f4297f73f7e4b3"', -2300 silly get 'last-modified': 'Wed, 25 Mar 2020 13:29:16 GMT', -2300 silly get vary: 'accept-encoding, accept', -2300 silly get 'cf-cache-status': 'HIT', -2300 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', -2300 silly get server: 'cloudflare', -2300 silly get 'content-encoding': 'gzip', -2300 silly get 'cf-request-id': '02ddd01f1d000005bb0cac0200000001' } ] -2301 verbose get saving psl to /home/christine/.npm/registry.npmjs.org/psl/.cache.json -2302 silly resolveWithNewModule psl@1.8.0 checking installable status -2303 silly cache add args [ 'psl@^1.1.28', null ] -2304 verbose cache add spec psl@^1.1.28 -2305 silly cache add parsed spec Result { -2305 silly cache add raw: 'psl@^1.1.28', -2305 silly cache add scope: null, -2305 silly cache add name: 'psl', -2305 silly cache add rawSpec: '^1.1.28', -2305 silly cache add spec: '>=1.1.28 <2.0.0', -2305 silly cache add type: 'range' } -2306 silly addNamed psl@>=1.1.28 <2.0.0 -2307 verbose addNamed ">=1.1.28 <2.0.0" is a valid semver range for psl -2308 silly addNameRange { name: 'psl', range: '>=1.1.28 <2.0.0', hasData: false } -2309 silly mapToRegistry name psl -2310 silly mapToRegistry using default registry -2311 silly mapToRegistry registry https://registry.npmjs.org/ -2312 silly mapToRegistry uri https://registry.npmjs.org/psl -2313 verbose addNameRange registry:https://registry.npmjs.org/psl not in flight; fetching -2314 verbose get https://registry.npmjs.org/psl not expired, no request -2315 silly addNameRange number 2 { name: 'psl', range: '>=1.1.28 <2.0.0', hasData: true } -2316 silly addNameRange versions [ 'psl', -2316 silly addNameRange [ '1.0.0', -2316 silly addNameRange '1.0.1', -2316 silly addNameRange '1.0.2', -2316 silly addNameRange '1.1.0', -2316 silly addNameRange '1.1.1', -2316 silly addNameRange '1.1.2', -2316 silly addNameRange '1.1.3', -2316 silly addNameRange '1.1.4', -2316 silly addNameRange '1.1.5', -2316 silly addNameRange '1.1.6', -2316 silly addNameRange '1.1.7', -2316 silly addNameRange '1.1.8', -2316 silly addNameRange '1.1.9', -2316 silly addNameRange '1.1.10', -2316 silly addNameRange '1.1.11', -2316 silly addNameRange '1.1.12', -2316 silly addNameRange '1.1.13', -2316 silly addNameRange '1.1.14', -2316 silly addNameRange '1.1.15', -2316 silly addNameRange '1.1.16', -2316 silly addNameRange '1.1.17', -2316 silly addNameRange '1.1.18', -2316 silly addNameRange '1.1.19', -2316 silly addNameRange '1.1.20', -2316 silly addNameRange '1.1.21', -2316 silly addNameRange '1.1.22', -2316 silly addNameRange '1.1.23', -2316 silly addNameRange '1.1.24', -2316 silly addNameRange '1.1.25', -2316 silly addNameRange '1.1.26', -2316 silly addNameRange '1.1.27', -2316 silly addNameRange '1.1.28', -2316 silly addNameRange '1.1.29', -2316 silly addNameRange '1.1.30', -2316 silly addNameRange '1.1.31', -2316 silly addNameRange '1.1.32', -2316 silly addNameRange '1.1.33', -2316 silly addNameRange '1.2.0', -2316 silly addNameRange '1.3.0', -2316 silly addNameRange '1.3.1', -2316 silly addNameRange '1.4.0', -2316 silly addNameRange '1.5.0', -2316 silly addNameRange '1.6.0', -2316 silly addNameRange '1.7.0', -2316 silly addNameRange '1.8.0' ] ] -2317 silly addNamed psl@1.8.0 -2318 verbose addNamed "1.8.0" is a plain semver version for psl -2319 silly mapToRegistry name psl -2320 silly mapToRegistry using default registry -2321 silly mapToRegistry registry https://registry.npmjs.org/ -2322 silly mapToRegistry uri https://registry.npmjs.org/psl -2323 verbose addRemoteTarball https://registry.npmjs.org/psl/-/psl-1.8.0.tgz not in flight; adding -2324 verbose addRemoteTarball [ 'https://registry.npmjs.org/psl/-/psl-1.8.0.tgz', -2324 verbose addRemoteTarball '9326f8bcfb013adcc005fdff056acce020e51c24' ] -2325 info retry fetch attempt 1 at 13:48:58 -2326 info attempt registry request try #1 at 13:48:58 -2327 http fetch GET https://registry.npmjs.org/psl/-/psl-1.8.0.tgz -2328 http fetch 200 https://registry.npmjs.org/psl/-/psl-1.8.0.tgz -2329 silly fetchAndShaCheck shasum 9326f8bcfb013adcc005fdff056acce020e51c24 -2330 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/psl/-/psl-1.8.0.tgz not in flight; adding -2331 verbose addTmpTarball already have metadata; skipping unpack for psl@1.8.0 -2332 silly cache afterAdd psl@1.8.0 -2333 verbose afterAdd /home/christine/.npm/psl/1.8.0/package/package.json not in flight; writing -2334 verbose afterAdd /home/christine/.npm/psl/1.8.0/package/package.json written -2335 silly loadAllDepsIntoIdealTree Finishing -2336 silly idealTree:prePrune lib -2336 silly idealTree:prePrune └─┬ less@3.11.1 -2336 silly idealTree:prePrune ├── ajv@6.12.2 -2336 silly idealTree:prePrune ├── asap@2.0.6 -2336 silly idealTree:prePrune ├── asn1@0.2.4 -2336 silly idealTree:prePrune ├── assert-plus@1.0.0 -2336 silly idealTree:prePrune ├── asynckit@0.4.0 -2336 silly idealTree:prePrune ├── aws-sign2@0.7.0 -2336 silly idealTree:prePrune ├── aws4@1.9.1 -2336 silly idealTree:prePrune ├── bcrypt-pbkdf@1.0.2 -2336 silly idealTree:prePrune ├── caseless@0.12.0 -2336 silly idealTree:prePrune ├── clone@2.1.2 -2336 silly idealTree:prePrune ├── combined-stream@1.0.8 -2336 silly idealTree:prePrune ├── core-util-is@1.0.2 -2336 silly idealTree:prePrune ├── dashdash@1.14.1 -2336 silly idealTree:prePrune ├── delayed-stream@1.0.0 -2336 silly idealTree:prePrune ├── ecc-jsbn@0.1.2 -2336 silly idealTree:prePrune ├── errno@0.1.7 -2336 silly idealTree:prePrune ├── extend@3.0.2 -2336 silly idealTree:prePrune ├── extsprintf@1.3.0 -2336 silly idealTree:prePrune ├── fast-deep-equal@3.1.1 -2336 silly idealTree:prePrune ├── fast-json-stable-stringify@2.1.0 -2336 silly idealTree:prePrune ├── forever-agent@0.6.1 -2336 silly idealTree:prePrune ├── form-data@2.3.3 -2336 silly idealTree:prePrune ├── getpass@0.1.7 -2336 silly idealTree:prePrune ├── graceful-fs@4.2.4 -2336 silly idealTree:prePrune ├── har-schema@2.0.0 -2336 silly idealTree:prePrune ├── har-validator@5.1.3 -2336 silly idealTree:prePrune ├── http-signature@1.2.0 -2336 silly idealTree:prePrune ├── image-size@0.5.5 -2336 silly idealTree:prePrune ├── is-typedarray@1.0.0 -2336 silly idealTree:prePrune ├── isstream@0.1.2 -2336 silly idealTree:prePrune ├── jsbn@0.1.1 -2336 silly idealTree:prePrune ├── json-schema-traverse@0.4.1 -2336 silly idealTree:prePrune ├── json-schema@0.2.3 -2336 silly idealTree:prePrune ├── json-stringify-safe@5.0.1 -2336 silly idealTree:prePrune ├── jsprim@1.4.1 -2336 silly idealTree:prePrune ├── mime-db@1.44.0 -2336 silly idealTree:prePrune ├── mime-types@2.1.27 -2336 silly idealTree:prePrune ├── mime@1.6.0 -2336 silly idealTree:prePrune ├── minimist@1.2.5 -2336 silly idealTree:prePrune ├── mkdirp@0.5.5 -2336 silly idealTree:prePrune ├── oauth-sign@0.9.0 -2336 silly idealTree:prePrune ├── performance-now@2.1.0 -2336 silly idealTree:prePrune ├── promise@7.3.1 -2336 silly idealTree:prePrune ├── prr@1.0.1 -2336 silly idealTree:prePrune ├── psl@1.8.0 -2336 silly idealTree:prePrune ├── punycode@2.1.1 -2336 silly idealTree:prePrune ├── qs@6.5.2 -2336 silly idealTree:prePrune ├── request@2.88.2 -2336 silly idealTree:prePrune ├── safe-buffer@5.2.1 -2336 silly idealTree:prePrune ├── safer-buffer@2.1.2 -2336 silly idealTree:prePrune ├── source-map@0.6.1 -2336 silly idealTree:prePrune ├── sshpk@1.16.1 -2336 silly idealTree:prePrune ├── tough-cookie@2.5.0 -2336 silly idealTree:prePrune ├── tslib@1.13.0 -2336 silly idealTree:prePrune ├── tunnel-agent@0.6.0 -2336 silly idealTree:prePrune ├── tweetnacl@0.14.5 -2336 silly idealTree:prePrune ├── uri-js@4.2.2 -2336 silly idealTree:prePrune ├── uuid@3.4.0 -2336 silly idealTree:prePrune └── verror@1.10.0 -2337 silly loadIdealTree Finishing -2338 silly currentTree lib -2339 silly idealTree lib -2339 silly idealTree └─┬ less@3.11.1 -2339 silly idealTree ├── ajv@6.12.2 -2339 silly idealTree ├── asap@2.0.6 -2339 silly idealTree ├── asn1@0.2.4 -2339 silly idealTree ├── assert-plus@1.0.0 -2339 silly idealTree ├── asynckit@0.4.0 -2339 silly idealTree ├── aws-sign2@0.7.0 -2339 silly idealTree ├── aws4@1.9.1 -2339 silly idealTree ├── bcrypt-pbkdf@1.0.2 -2339 silly idealTree ├── caseless@0.12.0 -2339 silly idealTree ├── clone@2.1.2 -2339 silly idealTree ├── combined-stream@1.0.8 -2339 silly idealTree ├── core-util-is@1.0.2 -2339 silly idealTree ├── dashdash@1.14.1 -2339 silly idealTree ├── delayed-stream@1.0.0 -2339 silly idealTree ├── ecc-jsbn@0.1.2 -2339 silly idealTree ├── errno@0.1.7 -2339 silly idealTree ├── extend@3.0.2 -2339 silly idealTree ├── extsprintf@1.3.0 -2339 silly idealTree ├── fast-deep-equal@3.1.1 -2339 silly idealTree ├── fast-json-stable-stringify@2.1.0 -2339 silly idealTree ├── forever-agent@0.6.1 -2339 silly idealTree ├── form-data@2.3.3 -2339 silly idealTree ├── getpass@0.1.7 -2339 silly idealTree ├── graceful-fs@4.2.4 -2339 silly idealTree ├── har-schema@2.0.0 -2339 silly idealTree ├── har-validator@5.1.3 -2339 silly idealTree ├── http-signature@1.2.0 -2339 silly idealTree ├── image-size@0.5.5 -2339 silly idealTree ├── is-typedarray@1.0.0 -2339 silly idealTree ├── isstream@0.1.2 -2339 silly idealTree ├── jsbn@0.1.1 -2339 silly idealTree ├── json-schema-traverse@0.4.1 -2339 silly idealTree ├── json-schema@0.2.3 -2339 silly idealTree ├── json-stringify-safe@5.0.1 -2339 silly idealTree ├── jsprim@1.4.1 -2339 silly idealTree ├── mime-db@1.44.0 -2339 silly idealTree ├── mime-types@2.1.27 -2339 silly idealTree ├── mime@1.6.0 -2339 silly idealTree ├── minimist@1.2.5 -2339 silly idealTree ├── mkdirp@0.5.5 -2339 silly idealTree ├── oauth-sign@0.9.0 -2339 silly idealTree ├── performance-now@2.1.0 -2339 silly idealTree ├── promise@7.3.1 -2339 silly idealTree ├── prr@1.0.1 -2339 silly idealTree ├── psl@1.8.0 -2339 silly idealTree ├── punycode@2.1.1 -2339 silly idealTree ├── qs@6.5.2 -2339 silly idealTree ├── request@2.88.2 -2339 silly idealTree ├── safe-buffer@5.2.1 -2339 silly idealTree ├── safer-buffer@2.1.2 -2339 silly idealTree ├── source-map@0.6.1 -2339 silly idealTree ├── sshpk@1.16.1 -2339 silly idealTree ├── tough-cookie@2.5.0 -2339 silly idealTree ├── tslib@1.13.0 -2339 silly idealTree ├── tunnel-agent@0.6.0 -2339 silly idealTree ├── tweetnacl@0.14.5 -2339 silly idealTree ├── uri-js@4.2.2 -2339 silly idealTree ├── uuid@3.4.0 -2339 silly idealTree └── verror@1.10.0 -2340 silly generateActionsToTake Starting -2341 silly install generateActionsToTake -2342 warn checkPermissions Missing write access to /usr/local/lib/node_modules -2343 silly rollbackFailedOptional Starting -2344 silly rollbackFailedOptional Finishing -2345 silly runTopLevelLifecycles Starting -2346 silly runTopLevelLifecycles Finishing -2347 silly install printInstalled -2348 verbose stack Error: EACCES: permission denied, access '/usr/local/lib/node_modules' -2349 verbose cwd /home/christine/0_WORK/gradcomm -2350 error Linux 4.15.0-99-generic -2351 error argv "/usr/bin/node" "/usr/bin/npm" "install" "-g" "less" -2352 error node v8.10.0 -2353 error npm v3.5.2 -2354 error path /usr/local/lib/node_modules -2355 error code EACCES -2356 error errno -13 -2357 error syscall access -2358 error Error: EACCES: permission denied, access '/usr/local/lib/node_modules' -2358 error { Error: EACCES: permission denied, access '/usr/local/lib/node_modules' -2358 error errno: -13, -2358 error code: 'EACCES', -2358 error syscall: 'access', -2358 error path: '/usr/local/lib/node_modules' } -2359 error Please try running this command again as root/Administrator. -2360 verbose exit [ -13, true ] diff --git a/community_server/parse_proto.sh b/community_server/parse_proto.sh deleted file mode 100755 index e6ccb451f..000000000 --- a/community_server/parse_proto.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Copyright 2015 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# need grpc only for hedera hashgraph -#PHP_PLUGIN="$(which grpc_php_plugin)" -#protoc --proto_path=./src/protobuf/gradido --php_out=./src/ --grpc_out=./src/ --plugin=protoc-gen-grpc=$PHP_PLUGIN ./src/protobuf/gradido/*.proto - -protoc --proto_path=./src/protobuf --php_out=./src/Model/Messages ./src/protobuf/gradido/*.proto - diff --git a/community_server/phpunit.xml.dist b/community_server/phpunit.xml.dist deleted file mode 100644 index ba971b637..000000000 --- a/community_server/phpunit.xml.dist +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - tests/TestCase/ - - - - - - - - - - - - - - - - - src/ - plugins/*/src/ - - src/Console/Installer.php - - - - diff --git a/community_server/src/Application.php b/community_server/src/Application.php deleted file mode 100644 index 66e00f733..000000000 --- a/community_server/src/Application.php +++ /dev/null @@ -1,117 +0,0 @@ -bootstrapCli(); - } - - /* - * Only try to load DebugKit in development mode - * Debug Kit should not be installed on a production system - */ - if (Configure::read('debug')) { - $this->addPlugin(\DebugKit\Plugin::class); - } - - // Load more plugins here - } - - - - /** - * Setup the middleware queue your application will use. - * - * @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup. - * @return \Cake\Http\MiddlewareQueue The updated middleware queue. - */ - public function middleware($middlewareQueue) - { - //$csrf = new CsrfProtectionMiddleware(); - - // Token check will be skipped when callback returns `true`. - /*$csrf->whitelistCallback(function ($request) { - // Skip token check for API URLs. - //if ($request->getParam('prefix') === 'api') { - if($request->getAttribute('base') === 'TransactionJsonRequestHandler') { - return true; - } - }); -*/ - // Ensure routing middleware is added to the queue before CSRF protection middleware. - //$middlewareQueue->; - - $middlewareQueue - // ->add($csrf) - // Catch any exceptions in the lower layers, - // and make an error page/response - ->add(new ErrorHandlerMiddleware(null, Configure::read('Error'))) - - // Handle plugin/theme assets like CakePHP normally does. - ->add(new AssetMiddleware([ - 'cacheTime' => Configure::read('Asset.cacheTime') - ])) - - // Add routing middleware. - // If you have a large number of routes connected, turning on routes - // caching in production could improve performance. For that when - // creating the middleware instance specify the cache config name by - // using it's second constructor argument: - // `new RoutingMiddleware($this, '_cake_routes_')` - ->add(new RoutingMiddleware($this)); - - return $middlewareQueue; - } - - /** - * @return void - */ - protected function bootstrapCli() - { - try { - $this->addPlugin('Bake'); - } catch (MissingPluginException $e) { - // Do not halt if the plugin is missing - } - - // Load more plugins here - } -} diff --git a/community_server/src/Console/Installer.php b/community_server/src/Console/Installer.php deleted file mode 100644 index 3bcef473b..000000000 --- a/community_server/src/Console/Installer.php +++ /dev/null @@ -1,246 +0,0 @@ -getIO(); - - $rootDir = dirname(dirname(__DIR__)); - - static::createAppConfig($rootDir, $io); - static::createWritableDirectories($rootDir, $io); - - // ask if the permissions should be changed - if ($io->isInteractive()) { - $validator = function ($arg) { - if (in_array($arg, ['Y', 'y', 'N', 'n'])) { - return $arg; - } - throw new Exception('This is not a valid answer. Please choose Y or n.'); - }; - $setFolderPermissions = $io->askAndValidate( - 'Set Folder Permissions ? (Default to Y) [Y,n]? ', - $validator, - 10, - 'Y' - ); - - if (in_array($setFolderPermissions, ['Y', 'y'])) { - static::setFolderPermissions($rootDir, $io); - } - } else { - static::setFolderPermissions($rootDir, $io); - } - - static::setSecuritySalt($rootDir, $io); - - $class = 'Cake\Codeception\Console\Installer'; - if (class_exists($class)) { - $class::customizeCodeceptionBinary($event); - } - } - - /** - * Create the config/app.php file if it does not exist. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function createAppConfig($dir, $io) - { - $appConfig = $dir . '/config/app.php'; - $defaultConfig = $dir . '/config/app.default.php'; - if (!file_exists($appConfig)) { - copy($defaultConfig, $appConfig); - $io->write('Created `config/app.php` file'); - } - } - - /** - * Create the `logs` and `tmp` directories. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function createWritableDirectories($dir, $io) - { - foreach (static::WRITABLE_DIRS as $path) { - $path = $dir . '/' . $path; - if (!file_exists($path)) { - mkdir($path); - $io->write('Created `' . $path . '` directory'); - } - } - } - - /** - * Set globally writable permissions on the "tmp" and "logs" directory. - * - * This is not the most secure default, but it gets people up and running quickly. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function setFolderPermissions($dir, $io) - { - // Change the permissions on a path and output the results. - $changePerms = function ($path) use ($io) { - $currentPerms = fileperms($path) & 0777; - $worldWritable = $currentPerms | 0007; - if ($worldWritable == $currentPerms) { - return; - } - - $res = chmod($path, $worldWritable); - if ($res) { - $io->write('Permissions set on ' . $path); - } else { - $io->write('Failed to set permissions on ' . $path); - } - }; - - $walker = function ($dir) use (&$walker, $changePerms) { - $files = array_diff(scandir($dir), ['.', '..']); - foreach ($files as $file) { - $path = $dir . '/' . $file; - - if (!is_dir($path)) { - continue; - } - - $changePerms($path); - $walker($path); - } - }; - - $walker($dir . '/tmp'); - $changePerms($dir . '/tmp'); - $changePerms($dir . '/logs'); - } - - /** - * Set the security.salt value in the application's config file. - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @return void - */ - public static function setSecuritySalt($dir, $io) - { - $newKey = hash('sha256', Security::randomBytes(64)); - static::setSecuritySaltInFile($dir, $io, $newKey, 'app.php'); - } - - /** - * Set the security.salt value in a given file - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @param string $newKey key to set in the file - * @param string $file A path to a file relative to the application's root - * @return void - */ - public static function setSecuritySaltInFile($dir, $io, $newKey, $file) - { - $config = $dir . '/config/' . $file; - $content = file_get_contents($config); - - $content = str_replace('__SALT__', $newKey, $content, $count); - - if ($count == 0) { - $io->write('No Security.salt placeholder to replace.'); - - return; - } - - $result = file_put_contents($config, $content); - if ($result) { - $io->write('Updated Security.salt value in config/' . $file); - - return; - } - $io->write('Unable to update Security.salt value.'); - } - - /** - * Set the APP_NAME value in a given file - * - * @param string $dir The application's root directory. - * @param \Composer\IO\IOInterface $io IO interface to write to console. - * @param string $appName app name to set in the file - * @param string $file A path to a file relative to the application's root - * @return void - */ - public static function setAppNameInFile($dir, $io, $appName, $file) - { - $config = $dir . '/config/' . $file; - $content = file_get_contents($config); - $content = str_replace('__APP_NAME__', $appName, $content, $count); - - if ($count == 0) { - $io->write('No __APP_NAME__ placeholder to replace.'); - - return; - } - - $result = file_put_contents($config, $content); - if ($result) { - $io->write('Updated __APP_NAME__ value in config/' . $file); - - return; - } - $io->write('Unable to update __APP_NAME__ value.'); - } -} diff --git a/community_server/src/Controller/AddressTypesController.php b/community_server/src/Controller/AddressTypesController.php deleted file mode 100644 index 9b13a7720..000000000 --- a/community_server/src/Controller/AddressTypesController.php +++ /dev/null @@ -1,106 +0,0 @@ -paginate($this->AddressTypes); - - $this->set(compact('addressTypes')); - } - - /** - * View method - * - * @param string|null $id Address Type id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $addressType = $this->AddressTypes->get($id, [ - 'contain' => ['StateGroupAddresses', 'TransactionGroupAddaddress'], - ]); - - $this->set('addressType', $addressType); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $addressType = $this->AddressTypes->newEntity(); - if ($this->request->is('post')) { - $addressType = $this->AddressTypes->patchEntity($addressType, $this->request->getData()); - if ($this->AddressTypes->save($addressType)) { - $this->Flash->success(__('The address type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The address type could not be saved. Please, try again.')); - } - $this->set(compact('addressType')); - } - - /** - * Edit method - * - * @param string|null $id Address Type id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $addressType = $this->AddressTypes->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $addressType = $this->AddressTypes->patchEntity($addressType, $this->request->getData()); - if ($this->AddressTypes->save($addressType)) { - $this->Flash->success(__('The address type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The address type could not be saved. Please, try again.')); - } - $this->set(compact('addressType')); - } - - /** - * Delete method - * - * @param string|null $id Address Type id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $addressType = $this->AddressTypes->get($id); - if ($this->AddressTypes->delete($addressType)) { - $this->Flash->success(__('The address type has been deleted.')); - } else { - $this->Flash->error(__('The address type could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/AdminErrorsController.php b/community_server/src/Controller/AdminErrorsController.php deleted file mode 100644 index a9688008e..000000000 --- a/community_server/src/Controller/AdminErrorsController.php +++ /dev/null @@ -1,111 +0,0 @@ -paginate = [ - 'contain' => ['StateUsers'] - ]; - $adminErrors = $this->paginate($this->AdminErrors); - - $this->set(compact('adminErrors')); - } - - /** - * View method - * - * @param string|null $id Admin Error id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $adminError = $this->AdminErrors->get($id, [ - 'contain' => ['StateUsers'] - ]); - - $this->set('adminError', $adminError); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $adminError = $this->AdminErrors->newEntity(); - if ($this->request->is('post')) { - $adminError = $this->AdminErrors->patchEntity($adminError, $this->request->getData()); - if ($this->AdminErrors->save($adminError)) { - $this->Flash->success(__('The admin error has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The admin error could not be saved. Please, try again.')); - } - $stateUsers = $this->AdminErrors->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('adminError', 'stateUsers')); - } - - /** - * Edit method - * - * @param string|null $id Admin Error id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $adminError = $this->AdminErrors->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $adminError = $this->AdminErrors->patchEntity($adminError, $this->request->getData()); - if ($this->AdminErrors->save($adminError)) { - $this->Flash->success(__('The admin error has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The admin error could not be saved. Please, try again.')); - } - $stateUsers = $this->AdminErrors->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('adminError', 'stateUsers')); - } - - /** - * Delete method - * - * @param string|null $id Admin Error id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $adminError = $this->AdminErrors->get($id); - if ($this->AdminErrors->delete($adminError)) { - $this->Flash->success(__('The admin error has been deleted.')); - } else { - $this->Flash->error(__('The admin error could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/AppController.php b/community_server/src/Controller/AppController.php deleted file mode 100644 index e70b8e7bd..000000000 --- a/community_server/src/Controller/AppController.php +++ /dev/null @@ -1,386 +0,0 @@ -loadComponent('Security');` - * - * @return void - */ - public function initialize() - { - parent::initialize(); - - $this->loadComponent('RequestHandler', [ - 'enableBeforeRedirect' => false, - ]); - $this->loadComponent('Flash'); - - $this->loadComponent('Auth', [ - 'loginAction' => [ - 'controller' => 'ServerUsers', - 'action' => 'login' - ], - 'loginRedirect' => [ - 'controller' => 'Transactions', - 'action' => 'index' - ], - 'logoutRedirect' => [ - 'controller' => 'Pages', - 'action' => 'display', - 'gradido' - ], - 'authenticate' => [ - 'all' => ['userModel' => 'ServerUsers'], - 'Form' => [ - 'userModel' => 'ServerUsers', - ] - ] - ]); - - $this->Auth->deny(['index']); - - /* - * Enable the following component for recommended CakePHP security settings. - * see https://book.cakephp.org/3.0/en/controllers/components/security.html - */ - //$this->loadComponent('Security'); - - - // load current balance - $session = $this->getRequest()->getSession(); - $state_user_id = $session->read('StateUser.id'); - - - // load error count - if ($state_user_id) { - $stateErrorsTable = TableRegistry::getTableLocator()->get('stateErrors'); - $stateErrorQuery = $stateErrorsTable - ->find('all') - ->select('id') - ->contain(false) - ->where(['state_user_id' => $state_user_id]); - $session->write('StateUser.errorCount', $stateErrorQuery->count()); - } - - // put current page into global for navi - $GLOBALS["passed"] = null; - $side = $this->request->getParam('controller'); - $GLOBALS["side"] = $side; - $subside = $this->request->getParam('action'); - $passedArguments = $this->request->getParam('pass'); - if ($passedArguments) { - $GLOBALS["passed"] = $passedArguments[0]; - } - $GLOBALS["subside"] = $subside; - - // server login - if ($this->Auth->user('id')) { - $GLOBALS['ServerUser'] = $this->Auth->user(); - } - - // login server url - $loginServer = Configure::read('LoginServer'); - if ($loginServer && isset($loginServer['url'])) { - $this->loginServerUrl = $loginServer['url'] . '/'; - } else { - $this->loginServerUrl = Router::url('/', true); - } - /* - * - * 'GradidoBlockchain' => [ - * // type: - * // - mysql: centralized blockchain in mysql db, no cross group transactions - * // - hedera: send transaction over hedera - * 'type' => 'hedera', - * // gradido nodes with blockchain (if type != mysql) - * 'nodes' => [ - * ['host' => 'http://192.168.178.225', 'port' => 13702] - * ] - * ], - */ - $blockchain = Configure::read('GradidoBlockchain'); - if($blockchain && isset($blockchain['type'])) { - $this->blockchainType = $blockchain['type']; - } - } - - protected function requestLogin($sessionId = 0, $redirect = true) - { - $stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances'); - $session = $this->getRequest()->getSession(); - // check login - // disable encryption for cookies - $session_id = 0; - $php_session_id = 0; - if($session->check('session_id')) { - $php_session_id = intval($session->read('session_id')); - } - $cookie_session_id = intval($this->request->getCookie('GRADIDO_LOGIN', '')); - // decide in which order session_ids are tried - if($sessionId != 0) { - $session_id = $sessionId; - } else if($php_session_id != 0) { - $session_id = $php_session_id; - } else if($cookie_session_id != 0) { - $session_id = $cookie_session_id; - } - - $ip = $this->request->clientIp(); - if (!$session->check('client_ip')) { - $session->write('client_ip', $ip); - } - // login server cannot detect host ip - // TODO: update login server, recognize nginx real ip header - $loginServer = Configure::read('LoginServer'); - - if ($session_id != 0) { - $userStored = $session->read('StateUser'); - - $transactionPendings = $session->read('Transactions.pending'); - $transactionExecutings = $session->read('Transactions.executing'); - $transaction_can_signed = $session->read('Transactions.can_signed'); - - - - if ($session->read('session_id') != $session_id || - ( $userStored && (!isset($userStored['id']) || !$userStored['email_checked'])) || - intval($transactionPendings) > 0 || - intval($transactionExecutings) > 0 || - intval($transaction_can_signed > 0)) - { - $http = new Client(); - - try { - $url = $loginServer['host'] . ':' . $loginServer['port']; - - $response = $http->get($url . '/login', ['session_id' => $session_id]); - $json = $response->getJson(); - - if (isset($json) && count($json) > 0) { - if ($json['state'] === 'success') { - //echo "email checked: " . $json['user']['email_checked'] . ";
    "; - if ($session->read('session_id') != $session_id || - ( $userStored && !isset($userStored['id']))) { - $session->destroy(); - } - foreach ($json['user'] as $key => $value) { - // we don't need the id of user in login server db - if($key == 'id') continue; - $session->write('StateUser.' . $key, $value); - } - //var_dump($json); - $transactionPendings = $json['Transactions.pending']; - $transactionExecuting = $json['Transactions.executing']; - $transaction_can_signed = $json['Transactions.can_signed']; - //echo "read transaction pending: $transactionPendings
    "; - $session->write('Transactions.pending', $transactionPendings); - $session->write('Transactions.executing', $transactionExecuting); - $session->write('Transactions.can_signed', $transaction_can_signed); - $session->write('session_id', $session_id); - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - - - if (isset($json['user']['public_hex']) && $json['user']['public_hex'] != '') { - $public_key_bin = hex2bin($json['user']['public_hex']); - $stateUserQuery = $stateUserTable - ->find('all') - ->where(['public_key' => $public_key_bin]) - ->contain('StateBalances', function ($q) { - return $q->order(['record_date' => 'DESC']) - ->limit(1); - }); - if ($stateUserQuery->count() == 1) { - $stateUser = $stateUserQuery->first(); - if ($stateUser->first_name != $json['user']['first_name'] || - $stateUser->last_name != $json['user']['last_name'] || - $stateUser->disabled != $json['user']['disabled'] || - //$stateUser->username != $json['user']['username'] || - // -> throws error - $stateUser->email != $json['user']['email'] - ) { - $stateUser->first_name = $json['user']['first_name']; - $stateUser->last_name = $json['user']['last_name']; - $stateUser->disabled = intval($json['user']['disabled']); - //$stateUser->username = $json['user']['username']; - $stateUser->email = $json['user']['email']; - if (!$stateUserTable->save($stateUser)) { - $this->Flash->error(__('error updating state user ' . json_encode($stateUser->errors()))); - } - } - $session->write('StateUser.id', $stateUser->id); - //echo $stateUser['id']; - } else { - $newStateUser = $stateUserTable->newEntity(); - $newStateUser->public_key = $public_key_bin; - $newStateUser->first_name = $json['user']['first_name']; - $newStateUser->last_name = $json['user']['last_name']; - $newStateUser->disabled = intval($json['user']['disabled']); - //$newStateUser->username = $json['user']['username']; - $newStateUser->email = $json['user']['email']; - if (!$stateUserTable->save($newStateUser)) { - $this->Flash->error(__('error saving state user ' . json_encode($newStateUser->errors()))); - } - $session->write('StateUser.id', $newStateUser->id); - //echo $newStateUser->id; - } - } else { - if(!$redirect) { - return ['state' => 'error', 'msg' => 'no pubkey']; - } - // we haven't get a pubkey? something seems to gone wrong on the login-server - $this->Flash->error(__('no pubkey')); - //var_dump($json); - return $this->redirect($this->loginServerUrl . 'account/error500/noPubkey', 303); - } - } else { - if(!$redirect) { - return ['state' => 'not found', 'msg' => 'invalid session', 'details' => $json]; - } - if ($json['state'] === 'not found') { - $this->Flash->error(__('invalid session')); - } else { - $this->Flash->error(__('Konto ist nicht aktiviert!')); - } - //die(json_encode($json)); - if(preg_match('/client ip/', $json['msg'])) { - return $this->redirect($this->loginServerUrl . 'account/error500/ipError', 303); - } - return $this->redirect($this->loginServerUrl . 'account/', 303); - } - } - } catch (\Exception $e) { - $msg = $e->getMessage(); - if(!$redirect) { - return ['state' => 'error', 'msg' => 'login-server http request error', 'details' => $msg]; - } - $this->Flash->error(__('error http request: ') . $msg); - return $this->redirect(['controller' => 'Dashboard', 'action' => 'errorHttpRequest']); - //continue; - } - } - $state_balance = $stateBalancesTable->find()->where(['state_user_id' => $session->read('StateUser.id')])->first(); - if ($state_balance) { - $now = new FrozenTime; - $session->write('StateUser.balance', $stateBalancesTable->calculateDecay($state_balance->amount, $state_balance->record_date, $now)); - } - } else { - // no login - //die("no login"); - if(!$redirect) { - return ['state' => 'error', 'msg' => 'not logged in']; - } - if (isset($loginServer['path'])) { - return $this->redirect($loginServer['path'], 303); - } else { - return $this->redirect($this->loginServerUrl . 'account/', 303); - } - } - return true; - } - - /* - public function beforeFilter(Event $event) - { - //$this->Auth->allow(['display']); - } - */ - - public function addAdminError($controller, $action, array $returnTable, $state_user_id) - { - if (!is_array($returnTable)) { - $this->addAdminError('AppController', 'addAdminError', ['state' => 'error', 'msg' => 'returnTable isn\'t array', 'details' => gettype($returnTable)], $state_user_id); - return false; - } - $adminErrorTable = TableRegistry::getTableLocator()->get('AdminErrors'); - $adminErrorEntity = $adminErrorTable->newEntity(); - $adminErrorEntity->state_user_id = $state_user_id; - $adminErrorEntity->controller = $controller; - $adminErrorEntity->action = $action; - $adminErrorEntity->state = $returnTable['state']; - if (isset($returnTable['msg'])) { - $adminErrorEntity->msg = $returnTable['msg']; - } else { - $adminErrorEntity->msg = __('(Leere Message)'); - } - if (isset($returnTable['details'])) { - $adminErrorEntity->details = $returnTable['details']; - } else { - $adminErrorEntity->details = __('(Leere Details)'); - } - if (!$adminErrorTable->save($adminErrorEntity)) { - $this->Flash->error( - __('Serious error, couldn\'t save to db, please write the admin: ' . $this->getAdminEmailLink()), - ['escape' => false] - ); - } - return true; - } - - public function getAdminEmailLink($text = '') - { - $serverAdminEmail = Configure::read('ServerAdminEmail'); - return ''. $serverAdminEmail . ''; - } - - public function returnJsonEncoded($json) - { - $this->autoRender = false; - $response = $this->response->withType('application/json'); - return $response->withStringBody($json); - } - - public function returnJson($array) - { - $this->autoRender = false; - $response = $this->response->withType('application/json'); - return $response->withStringBody(json_encode($array)); - } - - public function getStartEndForMonth($month, $year) - { - $timeString = $year . '-' . $month . '-01 00:00'; - $firstDay = new Time($timeString); - $lastDay = new Time($timeString); - $lastDay = $lastDay->addMonth(1); - return [$firstDay, $lastDay]; - } -} diff --git a/community_server/src/Controller/AppRequestsController.php b/community_server/src/Controller/AppRequestsController.php deleted file mode 100644 index 20b182f75..000000000 --- a/community_server/src/Controller/AppRequestsController.php +++ /dev/null @@ -1,465 +0,0 @@ -loadComponent('JsonRequestClient'); - $this->loadComponent('GradidoNumber'); - //$this->loadComponent('JsonRpcRequestClient'); - //$this->Auth->allow(['add', 'edit']); - $this->Auth->allow([ - 'index', 'sendCoins', 'createCoins', 'getBalance', - 'listTransactions','listGDTTransactions', 'getDecayStartBlock' - ]); - } - - - public function index() - { - if($this->request->is('get')) { - $method = $this->request->getQuery('method'); - switch($method) { - - } - return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for get', 'details' => $method]); - } - else if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode'); - //var_dump($jsonData); - if($jsonData == NULL || !isset($jsonData->method)) { - return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']); - } - $method = $jsonData->method; - - switch($method) { - - } - return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for post', 'details' => $method]); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post or get']); - } - - private function checkAndCopyRequiredFields($fields, &$param, $data = null) { - if($data == null) { - $data = $this->request->input('json_decode'); - } - foreach($fields as $field) { - if(is_array($field)) { - $one_exist = false; - foreach($field as $oneField) { - if(isset($data->$oneField)) { - $param[$oneField] = $data->$oneField; - $one_exist = true; - break; - } - } - if(!$one_exist) { - return ['state' => 'error', 'msg' => 'missing field of set', 'details' => $field]; - } - } else { - if(!isset($data->$field)) { - return ['state' => 'error', 'msg' => 'missing field', 'details' => $field . ' not found']; - } else { - $param[$field] = $data->$field; - } - } - } - return true; - } - - private function rewriteKeys(&$data, $replaceKeys) - { - foreach(array_keys($replaceKeys) as $key) { - $newKey = $replaceKeys[$key]; - if(isset($data->$key)) { - $data->$newKey = $data->$key; - unset($data->$key); - } - } - } - - private function parseParameterForCreateTransaction(&$param, $data = null) - { - if($data == null) { - $data = $this->request->input('json_decode'); - } - $session_id = 0; - if(isset($data->session_id)) { - $session_id = $data->session_id; - } - $login_request_result = $this->requestLogin($session_id, false); - if($login_request_result !== true) { - return $login_request_result; - } - $session = $this->getRequest()->getSession(); - $param['session_id'] = $session->read('session_id'); - $param['blockchain_type'] = $this->blockchainType; - - $this->rewriteKeys($data, ['email' => 'target_email', 'username' => 'target_username', 'pubkey' => 'target_pubkey']); - $required_fields = $this->checkAndCopyRequiredFields(['amount', ['target_email', 'target_username', 'target_pubkey']], $param, $data); - if($required_fields !== true) { - return $required_fields; - } - - if(floatval($param['amount']) <= 0.0) { - return ['state' => 'error', 'msg' => 'amount is invalid', 'details' => $param['amount']]; - } - $param['amount'] = $this->GradidoNumber->parseInputNumberToCentNumber($param['amount']); - - if(isset($data->memo)) { - $param['memo'] = $data->memo; - } - - if(isset($data->auto_sign)) { - $param['auto_sign'] = boolval($data->auto_sign); - } - - return true; - } - - public function sendCoins() - { - /* - * { - "session_id" : -127182, - "amount": 2000000, - "email": "max.musterman@gmail.de", - "memo":"Thank you :)", - "group": "gdd1", - "auto_sign": true - */ - if(!$this->request->is('post')) { - return $this->returnJson(['state' => 'error', 'msg' => 'no post']); - } - $data = $this->request->input('json_decode'); - $params = []; - $result = $this->parseParameterForCreateTransaction($params, $data); - if($result !== true) { - return $this->returnJson($result); - } - - if(!isset($params['memo']) || strlen($params['memo']) < 5 || strlen($params['memo']) > 150) { - return $this->returnJson(['state' => 'error', 'msg' => 'memo is not set or not in expected range [5;150]']); - } - $params['transaction_type'] = 'transfer'; - - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode($params), '/createTransaction'); - - - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - $session = $this->getRequest()->getSession(); - $pendingTransactionCount = $session->read('Transactions.pending'); - if($pendingTransactionCount == null) { - $pendingTransactionCount = 1; - } else { - $pendingTransactionCount++; - } - $session->write('Transactions.pending', $pendingTransactionCount); - //echo "pending: " . $pendingTransactionCount; - return $this->returnJson(['state' => 'success']); - } else { - - /* - * if request contain unknown parameter format, shouldn't happen't at all - * {"state": "error", "msg": "parameter format unknown"} - * if json parsing failed - * {"state": "error", "msg": "json exception", "details":"exception text"} - * if session_id is zero or not set - * {"state": "error", "msg": "session_id invalid"} - * if session id wasn't found on login server, if server was restartet or user logged out (also per timeout, default: 15 minutes) - * {"state": "error", "msg": "session not found"} - * if session hasn't active user, shouldn't happen't at all, login-server should be checked if happen - * {"state": "code error", "msg":"user is zero"} - * if transaction type not known - * {"state": "error", "msg":"transaction_type unknown"} - * if receiver wasn't known to Login-Server - * {"state": "not found", "msg":"receiver not found"} - * if receiver account disabled, and therefor cannto receive any coins - * {"state": "disabled", "msg":"receiver is disabled"} - * if transaction was okay and will be further proccessed - * {"state":"success"} - */ - $answear_data = $requestAnswear['data']; - return $this->returnJson($answear_data); - - } - - } - - public function createCoins() - { - /* - * "session_id" : -127182, - * "email": "max.musterman@gmail.de", - * "amount": 10000000, - * "target_date":"2021-02-19T13:25:36+00:00", - * "memo":"AGE", - * "auto_sign": true - */ - if(!$this->request->is('post')) { - return $this->returnJson(['state' => 'error', 'msg' => 'no post']); - } - $data = $this->request->input('json_decode'); - $params = []; - $result = $this->parseParameterForCreateTransaction($params, $data); - if($result !== true) { - return $this->returnJson($result); - } - $required_fields = $this->checkAndCopyRequiredFields(['target_date'], $params, $data); - if($required_fields !== true) { - return $this->returnJson($required_fields); - } - $params['transaction_type'] = 'creation'; - - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode($params), '/createTransaction'); - - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - $session = $this->getRequest()->getSession(); - $pendingTransactionCount = $session->read('Transactions.pending'); - if($pendingTransactionCount == null) { - $pendingTransactionCount = 1; - } else { - $pendingTransactionCount++; - } - $session->write('Transactions.pending', $pendingTransactionCount); - //echo "pending: " . $pendingTransactionCount; - return $this->returnJson(['state' => 'success']); - } else { - - /* - * if request contain unknown parameter format, shouldn't happen't at all - * {"state": "error", "msg": "parameter format unknown"} - * if json parsing failed - * {"state": "error", "msg": "json exception", "details":"exception text"} - * if session_id is zero or not set - * {"state": "error", "msg": "session_id invalid"} - * if session id wasn't found on login server, if server was restartet or user logged out (also per timeout, default: 15 minutes) - * {"state": "error", "msg": "session not found"} - * if session hasn't active user, shouldn't happen't at all, login-server should be checked if happen - * {"state": "code error", "msg":"user is zero"} - * if transaction type not known - * {"state": "error", "msg":"transaction_type unknown"} - * if receiver wasn't known to Login-Server - * {"state": "not found", "msg":"receiver not found"} - * if receiver account disabled, and therefor cannto receive any coins - * {"state": "disabled", "msg":"receiver is disabled"} - * if transaction was okay and will be further proccessed - * {"state":"success"} - */ - $answear_data = $requestAnswear['data']; - return $this->returnJson($answear_data); - - } - - } - - public function getBalance($session_id = 0) - { - $this->viewBuilder()->setLayout('ajax'); - $login_result = $this->requestLogin($session_id, false); - if($login_result !== true) { - $this->set('body', $login_result); - return; - } - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - $state_balances_table = TableRegistry::getTableLocator()->get('StateBalances'); - $state_balances_table->updateBalances($user['id']); - - $state_balance = $state_balances_table->find()->where(['state_user_id' => $user['id']])->first(); - - - $now = new FrozenTime(); - if(!$state_balance) { - $body = [ - 'state' => 'success', - 'balance' => 0, - 'decay' => 0 - ]; - } else { - - $body = [ - 'state' => 'success', - 'balance' => $state_balance->amount, - 'decay' => $state_balance->partDecay($now), - ]; - } - - $body['decay_date'] = $now; - $this->set('body', $body); - } - - public function listTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0) - { - $this->viewBuilder()->setLayout('ajax'); - $startTime = microtime(true); - - $login_result = $this->requestLogin($session_id, false); - - if($login_result !== true) { - return $this->returnJson($login_result); - } - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - - $stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances'); - $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - - $stateBalancesTable->updateBalances($user['id']); - - $gdtSum = 0; - - $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi'); - - if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) { - $gdtSum = intval($gdtEntries['data']['sum']); - } else { - $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id'] ? $user['id'] : 0); - } - - //echo "count: $count, page: $page
    "; - $limit = $count; - $offset = 0; - $skip_first_transaction = false; - if($page > 1) { - $offset = (( $page - 1 ) * $count) - 1; - $limit++; - } - - if($offset && $orderDirection == 'ASC') { - $offset--; - } - - //echo "limit: $limit, offset: $offset, skip first transaction: $skip_first_transaction
    "; - $stateUserTransactionsQuery = $stateUserTransactionsTable - ->find() - ->where(['state_user_id' => $user['id']]) - ->order(['balance_date' => $orderDirection]) - ->contain([]) - ->limit($limit) - //->page($page) - ->offset($offset) - ; - $state_user_transactions_count = $stateUserTransactionsQuery->count(); - if($state_user_transactions_count > $offset + $limit) { - $skip_first_transaction = true; - } - - $decay = true; - if($page > 1) { - $decay = false; - } - $transactions = []; - $transactions_from_db = $stateUserTransactionsQuery->toArray(); - - if(count($transactions_from_db)) { - if($orderDirection == 'DESC') { - $transactions_from_db = array_reverse($transactions_from_db); - } - - $transactions = $transactionsTable->listTransactionsHumanReadable($transactions_from_db, $user, $decay, $skip_first_transaction); - //echo "transactions count: " . count($transactions) . "
    "; - if($orderDirection == 'DESC') { - $transactions = array_reverse($transactions); - } - } - - $state_balance = $stateBalancesTable->find()->where(['state_user_id' => $user['id']])->first(); - - $body = [ - 'state' => 'success', - 'transactions' => $transactions, - 'transactionExecutingCount' => $session->read('Transactions.executing'), - 'count' => $state_user_transactions_count, - 'gdtSum' => $gdtSum, - 'timeUsed' => microtime(true) - $startTime - ]; - $now = new FrozenTime(); - $body['decay_date'] = $now; - - if(!$state_balance) { - $body['balance'] = 0.0; - $body['decay'] = 0.0; - } else { - $body['balance'] = $state_balance->amount; - $body['decay'] = $stateBalancesTable->calculateDecay($state_balance->amount, $state_balance->record_date, $now); - } - - $this->set('body', $body); - } - - public function listGDTTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0) - { - $timeBegin = microtime(true); - $this->viewBuilder()->setLayout('ajax'); - - $login_result = $this->requestLogin($session_id, false); - - if($login_result !== true) { - return $this->returnJson($login_result); - } - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - - if(!$user) { - return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'exist a valid session cookie?']); - } - - $gdtEntries = $this->JsonRequestClient->sendRequestGDT([ - 'email' => $user['email'], - 'page' => $page, - 'count' => $count, - 'orderDirection' => $orderDirection - ], 'GdtEntries' . DS . 'listPerEmailApi'); - - if('success' == $gdtEntries['state']) { - $timeEnd = microtime(true); - $gdtEntries['data']['timeUsed'] = $timeEnd - $timeBegin; - return $this->returnJson($gdtEntries['data']); - - } else { - if($user) { - $this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, $user['id']); - } else { - $this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, 0); - } - } - return $this->returnJson(['state' => 'error', 'msg' => 'error by requesting gdt server', 'details' => $gdtEntries]); - } - - public function getDecayStartBlock() - { - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - $decayStartBlock = $transactionsTable->find()->where(['transaction_type_id' => 9]); - if(!$decayStartBlock->count()) { - return $this->returnJson(['state' => 'error', 'msg' => 'not found']); - } - return $this->returnJson(['state' => 'success', 'decay_start' => $decayStartBlock->first()->received]); - } - - private function acquireAccessToken($session_id) - { - - } - -} - diff --git a/community_server/src/Controller/BlockchainTypesController.php b/community_server/src/Controller/BlockchainTypesController.php deleted file mode 100644 index 2a94037df..000000000 --- a/community_server/src/Controller/BlockchainTypesController.php +++ /dev/null @@ -1,106 +0,0 @@ -paginate($this->BlockchainTypes); - - $this->set(compact('blockchainTypes')); - } - - /** - * View method - * - * @param string|null $id Blockchain Type id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $blockchainType = $this->BlockchainTypes->get($id, [ - 'contain' => [], - ]); - - $this->set('blockchainType', $blockchainType); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $blockchainType = $this->BlockchainTypes->newEntity(); - if ($this->request->is('post')) { - $blockchainType = $this->BlockchainTypes->patchEntity($blockchainType, $this->request->getData()); - if ($this->BlockchainTypes->save($blockchainType)) { - $this->Flash->success(__('The blockchain type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The blockchain type could not be saved. Please, try again.')); - } - $this->set(compact('blockchainType')); - } - - /** - * Edit method - * - * @param string|null $id Blockchain Type id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $blockchainType = $this->BlockchainTypes->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $blockchainType = $this->BlockchainTypes->patchEntity($blockchainType, $this->request->getData()); - if ($this->BlockchainTypes->save($blockchainType)) { - $this->Flash->success(__('The blockchain type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The blockchain type could not be saved. Please, try again.')); - } - $this->set(compact('blockchainType')); - } - - /** - * Delete method - * - * @param string|null $id Blockchain Type id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $blockchainType = $this->BlockchainTypes->get($id); - if ($this->BlockchainTypes->delete($blockchainType)) { - $this->Flash->success(__('The blockchain type has been deleted.')); - } else { - $this->Flash->error(__('The blockchain type could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/CommunityProfilesController.php b/community_server/src/Controller/CommunityProfilesController.php deleted file mode 100644 index c807da72c..000000000 --- a/community_server/src/Controller/CommunityProfilesController.php +++ /dev/null @@ -1,106 +0,0 @@ -paginate($this->CommunityProfiles); - - $this->set(compact('communityProfiles')); - } - - /** - * View method - * - * @param string|null $id Community Profile id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $communityProfile = $this->CommunityProfiles->get($id, [ - 'contain' => [], - ]); - - $this->set('communityProfile', $communityProfile); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $communityProfile = $this->CommunityProfiles->newEntity(); - if ($this->request->is('post')) { - $communityProfile = $this->CommunityProfiles->patchEntity($communityProfile, $this->request->getData()); - if ($this->CommunityProfiles->save($communityProfile)) { - $this->Flash->success(__('The community profile has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The community profile could not be saved. Please, try again.')); - } - $this->set(compact('communityProfile')); - } - - /** - * Edit method - * - * @param string|null $id Community Profile id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $communityProfile = $this->CommunityProfiles->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $communityProfile = $this->CommunityProfiles->patchEntity($communityProfile, $this->request->getData()); - if ($this->CommunityProfiles->save($communityProfile)) { - $this->Flash->success(__('The community profile has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The community profile could not be saved. Please, try again.')); - } - $this->set(compact('communityProfile')); - } - - /** - * Delete method - * - * @param string|null $id Community Profile id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $communityProfile = $this->CommunityProfiles->get($id); - if ($this->CommunityProfiles->delete($communityProfile)) { - $this->Flash->success(__('The community profile has been deleted.')); - } else { - $this->Flash->error(__('The community profile could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/Component/GradidoNumberComponent.php b/community_server/src/Controller/Component/GradidoNumberComponent.php deleted file mode 100644 index 5db208c3a..000000000 --- a/community_server/src/Controller/Component/GradidoNumberComponent.php +++ /dev/null @@ -1,33 +0,0 @@ - 'error', 'type' => 'parameter error', 'msg' => 'session_id isn\'t numeric']; - } - if(!is_numeric($user_balance) || intval($user_balance) < 0) { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'user_balance invalid']; - } - if(is_array($base64Message)) { - foreach($base64Message as $singleMessage) { - if(!$this->is_base64($singleMessage)) { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'at least one base64Message contain invalid base64 characters']; - } - } - } else if(!$this->is_base64($base64Message)) { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'base64Message contain invalid base64 characters']; - } - - return $this->sendRequest(json_encode([ - 'session_id' => $session_id, - 'transaction_base64' => $base64Message, - 'balance' => $user_balance, - 'auto_sign' => $auto_sign, - 'blockchain_type' => $this->blockchainType - ]), '/checkTransaction'); - - } - - public function findePublicKeyForEmailHash($emailHash) { - //'ask' = ['account_publickey' => ''] - $results = $this->sendRequestLoginServerNeighbors(json_encode(['ask' => ['account_publickey' => $emailHash]]), 'search'); - } - - public function getRunningUserTasks($email) - { - if($email == "") { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'email is empty']; - } - if(!GenericValidation::email($email, [])) { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'email is invalid']; - } - - return $this->sendRequest(json_encode([ - 'email' => $email - ]), '/getRunningUserTasks'); - } - - public function getUsers($session_id, $searchString, $accountState) - { - if($searchString == "") { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'search string is empty']; - } - if(!is_numeric($session_id)) { - return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'session_id isn\'t numeric']; - } - - return $this->sendRequest(json_encode([ - 'session_id' => $session_id, - 'search' => $searchString, - 'account_state' => $accountState, - ]), '/getUsers'); - } - - public function sendRequest($transactionBody, $url_last_part) { - $http = new Client(); - - $response = $http->post($this->getLoginServerUrl() . $url_last_part, $transactionBody, ['type' => 'json']); - $responseStatus = $response->getStatusCode(); - if($responseStatus != 200) { - return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response status code isn\'t 200', 'details' => $responseStatus]; - } - //$responseType = $response->getType(); - //if($responseType != 'application/json') { -// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType]; -// } - $json = $response->getJson(); - if($json == null) { - //$responseType = $response->getType(); - return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; - } - return ['state' => 'success', 'data' => $json]; - } - - public function sendRequestGDT($transactionBody, $url) { - - $http = new Client(); - $gdtServerHost = $this->getGDTServerUrl(); - if(!$gdtServerHost) { - return ['state' => 'warning', 'msg' => 'gdt server not configured']; - } - $fullUrl = $gdtServerHost . DS . $url; - $response = $http->post($this->getGDTServerUrl() . DS . $url, $transactionBody, ['type' => 'json']); - $responseStatus = $response->getStatusCode(); - if($responseStatus != 200) { - return [ - 'state' => 'error', - 'type' => 'request error', - 'msg' => 'server response status code isn\'t 200', - 'details' => $responseStatus, - 'fullUrl' => $fullUrl - ]; - } - //$responseType = $response->getType(); - //if($responseType != 'application/json') { -// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType]; -// } - $json = $response->getJson(); - if($json == null) { - //$responseType = $response->getType(); - return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; - } - return ['state' => 'success', 'data' => $json]; - } - - public function sendRequestLoginServerNeighbors($transactionBody, $url) { - - $http = new Client(); - if(!Configure::check('NeighborLoginServers')) { - return ['state' => 'warning', 'msg' => 'no neighbor server configured']; - } - $nServers = Configure::read('NeighborLoginServers'); - $results = ['errors' => [], 'data' => []]; - foreach($nServers as $nServer) { - $full_url = $nServer['host'] . ':' . $nServer['port'] . '/' . $url; - $response = $http->post($full_url, $transactionBody, ['type' => 'json']); - $responseStatus = $response->getStatusCode(); - if($responseStatus != 200) { - $results['errors'][] = [ - 'state' => 'error', - 'type' => 'request error', - 'msg' => 'server response status code isn\'t 200', - 'details' => $responseStatus, - 'fullUrl' => $full_url - ]; - continue; - } - $json = $response->getJson(); - if($json == null) { - //$responseType = $response->getType(); - $results['errors'][] = ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; - continue; - } - $results['data'][] = $json; - } - return $results; - } - - static public function getLoginServerUrl() - { - $loginServer = Configure::read('LoginServer'); - return $loginServer['host'] . ':' . $loginServer['port']; - } - - static public function getGDTServerUrl() - { - $gdtServer = Configure::read('GDTServer'); - if(isset($gdtServer['host'])) { - return $gdtServer['host']; - } - return false; - } - - static public function is_base64($s) - { - return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s); - } - -} diff --git a/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php b/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php deleted file mode 100644 index 504fc8fdd..000000000 --- a/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php +++ /dev/null @@ -1,83 +0,0 @@ -rpcClient = new JsonRpcClient(); - } - - // @param id: if id = 0 call rand for it - public function request($method, $params = [], $id = 0) - { - - if(0 == $id) { - $id = random_int(1, 12000); - } - $this->rpcClient->query($id, $method, $params); - - $message = $this->rpcClient->encode(); - return $this->sendRequest($message); - // message: {"jsonrpc":"2.0","method":"add","params":[1,2],"id":1} - } - - public function sendRequest($message) { - $http = new Client(); - - try { - $url = $this->pickGradidoNodeUrl(); - if(is_array($url)) { - return $url; - } - $response = $http->post($url, $message, ['type' => 'json']); - } catch(Exception $e) { - return ['state' => 'error', 'type' => 'http exception', 'details' => $e->getMessage()]; - } - $responseStatus = $response->getStatusCode(); - if($responseStatus != 200) { - return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response status code isn\'t 200', 'details' => $responseStatus]; - } - //$responseType = $response->getType(); - //if($responseType != 'application/json') { -// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType]; -// } - $json = $response->getJson(); - if($json == null) { - //$responseType = $response->getType(); - return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json']; - } - return $json['result']; - //return ['state' => 'success', 'data' => $json]; - } - - static public function pickGradidoNodeUrl() - { - $gradidoNodes = Configure::read('GradidoBlockchain.nodes'); - if(count($gradidoNodes) == 0) { - return ['state' => 'error', 'msg' => 'no gradido nodes in config']; - } - $i = rand(0, count($gradidoNodes)-1); - return $gradidoNodes[$i]['host'] . ':' . $gradidoNodes[$i]['port']; - } - - -} - - diff --git a/community_server/src/Controller/DashboardController.php b/community_server/src/Controller/DashboardController.php deleted file mode 100644 index e25374821..000000000 --- a/community_server/src/Controller/DashboardController.php +++ /dev/null @@ -1,78 +0,0 @@ -Auth->allow(['add', 'edit']); - $this->Auth->allow(['index', 'errorHttpRequest']); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', true)) - ); - } - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - $serverUser = $this->Auth->user('id'); - if($serverUser) { - $adminErrorsTable = TableRegistry::getTableLocator()->get('AdminErrors'); - $adminErrorCount = $adminErrorsTable->find('all')->count(); - $this->set('adminErrorCount', $adminErrorCount); - } - - $this->set('user', $user); - $this->set('serverUser', $serverUser); - $this->set('timeUsed', microtime(true) - $startTime); - - } - - public function serverIndex() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $adminErrorsTable = TableRegistry::getTableLocator()->get('AdminErrors'); - $adminErrorCount = $adminErrorsTable->find('all')->count(); - - $this->set('adminErrorCount', $adminErrorCount); - $this->set('timeUsed', microtime(true) - $startTime); - } - - public function errorHttpRequest() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $this->set('timeUsed', microtime(true) - $startTime); - } - -} diff --git a/community_server/src/Controller/ElopageBuysController.php b/community_server/src/Controller/ElopageBuysController.php deleted file mode 100644 index e097eddbb..000000000 --- a/community_server/src/Controller/ElopageBuysController.php +++ /dev/null @@ -1,165 +0,0 @@ -paginate = [ - 'contain' => false, - ]; - $elopageBuys = $this->paginate($this->ElopageBuys); - - $this->set(compact('elopageBuys')); - } - - public function statistics() - { - $this->viewBuilder()->setLayout('frontend'); - $connection = ConnectionManager::get('loginServer'); - $dates = $connection->execute('SELECT success_date FROM elopage_buys group by CAST(success_date as DATE)')->fetchAll('assoc'); - - $datesTree = []; - foreach($dates as $i => $date) { - - $date = new Time($date['success_date']); - if(!isset($datesTree[$date->year])) { - $datesTree[$date->year] = []; - } - if(!isset($datesTree[$date->year][$date->month])) { - $datesTree[$date->year][$date->month] = true; - } - } - //var_dump($datesTree); - - $now = Time::now(); - $lastDay = Time::now(); - $lastDay->day = 1; - $now->day = 1; - $lastDay->setTime(0,0,0,0); - $now->setTime(0,0,0,0); - // only for test - $now->month = 11; - $lastDay->month = 11; - $now->year = 2019; - $lastDay->year = 2019; -// var_dump($now); - - $lastDay = $lastDay->addMonth(1); - $sortDate = $this->getStartEndForMonth(11, 2019); - $elopageBuys = $this->ElopageBuys - ->find('all') - ->where(['success_date >=' => $sortDate[0], 'success_date <' => $sortDate[1]]); - $users = []; - foreach($elopageBuys as $elopageEntry) { - array_push($users, $elopageEntry->payer_email); - } - $unique_users = array_unique($users); - - $userTable = TableRegistry::getTableLocator()->get('Users'); - $users = $userTable->find('all') - ->where(['created >=' => $sortDate[0], 'created <' => $sortDate[1]]); - - $this->set(compact('elopageBuys', 'users')); - } - - /** - * View method - * - * @param string|null $id Elopage Buy id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $elopageBuy = $this->ElopageBuys->get($id, [ - 'contain' => false, - ]); - - $this->set('elopageBuy', $elopageBuy); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $elopageBuy = $this->ElopageBuys->newEntity(); - if ($this->request->is('post')) { - $elopageBuy = $this->ElopageBuys->patchEntity($elopageBuy, $this->request->getData()); - if ($this->ElopageBuys->save($elopageBuy)) { - $this->Flash->success(__('The elopage buy has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The elopage buy could not be saved. Please, try again.')); - } - - $this->set(compact('elopageBuy')); - } - - /** - * Edit method - * - * @param string|null $id Elopage Buy id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $elopageBuy = $this->ElopageBuys->get($id, [ - 'contain' => false, - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $elopageBuy = $this->ElopageBuys->patchEntity($elopageBuy, $this->request->getData()); - if ($this->ElopageBuys->save($elopageBuy)) { - $this->Flash->success(__('The elopage buy has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The elopage buy could not be saved. Please, try again.')); - } - $this->set(compact('elopageBuy')); - } - - /** - * Delete method - * - * @param string|null $id Elopage Buy id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $elopageBuy = $this->ElopageBuys->get($id); - if ($this->ElopageBuys->delete($elopageBuy)) { - $this->Flash->success(__('The elopage buy has been deleted.')); - } else { - $this->Flash->error(__('The elopage buy could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/ElopageWebhookController.php b/community_server/src/Controller/ElopageWebhookController.php deleted file mode 100644 index 4e806fa69..000000000 --- a/community_server/src/Controller/ElopageWebhookController.php +++ /dev/null @@ -1,51 +0,0 @@ -Auth->allow(['put']); - - } - - public function put() - { - $this->autoRender = false; - $data = $this->request->getData(); - $response = $this->response->withType('text/plain'); - - $dataString = http_build_query($data); - //$this->recursiveArrayToString($data, $dataString); - // %5B => [ - // %5D => ] - $dataString = preg_replace(['/\%5B/', '/\%5D/'], ['[', ']'], $dataString); - //var_dump($dataString); - - //2020-02-27T13:52:32+01:00 - $dateString = date('c'); - $fh = fopen('/etc/grd_login/php_elopage_requests.txt', 'a'); - if($fh === FALSE) { - return $response->withStringBody('400 ERROR'); - } - fwrite($fh, $dateString); - fwrite($fh, "\n"); - fwrite($fh, $dataString); - fwrite($fh, "\n"); - fclose($fh); - - - return $response->withStringBody('200 OK'); - - } -} diff --git a/community_server/src/Controller/ErrorController.php b/community_server/src/Controller/ErrorController.php deleted file mode 100644 index c5421a24d..000000000 --- a/community_server/src/Controller/ErrorController.php +++ /dev/null @@ -1,70 +0,0 @@ -loadComponent('RequestHandler', [ - 'enableBeforeRedirect' => false, - ]); - } - - /** - * beforeFilter callback. - * - * @param \Cake\Event\Event $event Event. - * @return \Cake\Http\Response|null|void - */ - public function beforeFilter(Event $event) - { - } - - /** - * beforeRender callback. - * - * @param \Cake\Event\Event $event Event. - * @return \Cake\Http\Response|null|void - */ - public function beforeRender(Event $event) - { - parent::beforeRender($event); - $this->RequestHandler->renderAs($this, 'json'); - $this->viewBuilder()->setTemplatePath('Error'); - } - - /** - * afterFilter callback. - * - * @param \Cake\Event\Event $event Event. - * @return \Cake\Http\Response|null|void - */ - public function afterFilter(Event $event) - { - } -} diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php deleted file mode 100644 index 611984118..000000000 --- a/community_server/src/Controller/JsonRequestHandlerController.php +++ /dev/null @@ -1,559 +0,0 @@ -loadComponent('JsonRequestClient'); - $this->loadComponent('JsonRpcRequestClient'); - //$this->Auth->allow(['add', 'edit']); - $this->Auth->allow('index'); - } - - - public function index() - { - if($this->request->is('get')) { - $method = $this->request->getQuery('method'); - switch($method) { - case 'getRunningUserTasks': return $this->getRunningUserTasks(); - } - return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for get', 'details' => $method]); - } - else if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode'); - //var_dump($jsonData); - if($jsonData == NULL || !isset($jsonData->method)) { - return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']); - } - $method = $jsonData->method; - - switch($method) { - case 'putTransaction': - if(!isset($jsonData->transaction)) { - return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']); - } else { - return $this->putTransaction($jsonData->transaction); - } - case 'userDelete': return $this->userDelete($jsonData->user); - case 'moveTransaction': return $this->moveTransaction($jsonData->pubkeys, $jsonData->memo, $jsonData->session_id); - case 'checkUser': return $this->checkUser($jsonData->email, $jsonData->last_name); - case 'getUsers' : return $this->getUsers($jsonData->page, $jsonData->limit); - case 'getUserBalance': return $this->getUserBalance($jsonData->email, $jsonData->last_name); - case 'errorInTransaction': return $this->errorInTransaction($jsonData); - case 'updateReadNode': return $this->updateReadNode(); - case 'addUser' : return $this->addUser($jsonData->user); - } - return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for post', 'details' => $method]); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post or get']); - } - - private function addUser($newUser) - { - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - $entity = $stateUsersTable->newEntity(); - $required_fields = ['first_name', 'last_name', 'email', 'public_key', 'disabled']; - foreach($required_fields as $required_field) { - if(!isset($newUser->$required_field)) { - return $this->returnJson(['state' => 'error', 'msg' => 'missing required field in addUser', 'details' => $required_field]); - } - if('public_key' == $required_field) { - $entity->$required_field = hex2bin($newUser->public_hex); - } else { - $entity->$required_field = $newUser->$required_field; - } - } - if($stateUsersTable->save($entity)) { - return $this->returnJson(['state' => 'success']); - } else { - return $this->returnJson(['state' => 'error', 'msg' => 'error saving state_user', 'details' => $entity->getErrors()]); - } - } - - // Called from login server like a cron job every 10 minutes or after sending transaction to hedera - private function updateReadNode() - { - $this->autoRender = false; - $response = $this->response->withType('application/json'); - - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - $last_transaction_query = $transactionsTable->find('all')->order(['id' => 'DESC']); - $last_transaction_id = 0; - if(!$last_transaction_query->isEmpty()) { - $last_transaction_id = $last_transaction_query->first()->id; - } - $last_known_sequence_number = $last_transaction_id; - - if($last_transaction_query->count() < $last_transaction_id) { - $last_transaction_id = $last_transaction_query->count(); - } - //$last_transaction_id = 0; - - - $group_alias = Configure::read('GroupAlias'); - $result = (array)$this->JsonRpcRequestClient->request('getTransactions', ['groupAlias' => $group_alias, 'lastKnownSequenceNumber' => $last_transaction_id]); - if(isset($result['state']) && $result['state'] == 'error') { - return $this->returnJson(['state' => 'error', 'msg' => 'jsonrpc error', 'details' => ['return' => $result, 'groupAlias' => $group_alias]]); - } - /* example - $result = json_decode("[ - { - \"record_type\":\"GRADIDO_TRANSACTION\", - \"transaction\":{ - \"version_number\":1, - \"signature\":{ - \"pubkey\":\"2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b\", - \"signature\":\"aed6725baacabf903e51f92503d49fa7e6b93c6402d56d9e3784be9a3366a77459213d858af46b579287aba8b1b63d206febce18bc80cec6fa63da6289e56403\" - }, - \"signature_count\":1, - \"hedera_transaction\":{ - \"consensusTimestamp\":{ - \"seconds\":1604392811, - \"nanos\":172812 - }, - \"runningHash\":\"f9ccf04137be418c3117a28bb5add6dced9745bcab74b7a2f46c182c8c98eeabf0127c131d15ebea7d0ac376f5d2de45\", - \"sequenceNumber\":94, - \"runningHashVersion\":3 - }, - \"transaction_type\":\"ADD_USER\", - \"add_user\":{ - \"user\":\"2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b\" - }, - \"result\":\"result\", - \"parts\":1, - \"memo\":\"\" - } - }, - { - \"record_type\":\"GRADIDO_TRANSACTION\", - \"transaction\":{ - \"version_number\":1, - \"signature\":{ - \"pubkey\":\"8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d\", - \"signature\":\"3134adcd6cbccee17c2db398f91b6b6bdd098b6306fb2fa213eb9eb5a322af9078acca4d8b0383d4e906f3139eb3369e7c1ef0f3ac5fec724be0d085ba44af0b\" - }, - \"signature_count\":2, - \"hedera_transaction\":{ - \"consensusTimestamp\":{ - \"seconds\":1604392886, - \"nanos\":1528 - }, - \"runningHash\":\"e1df5526331e3def11d6b652b8f248d20c250739b6eb98f1fe7b338901753d9d573a14601ba84f61318a48940b3c237a\", - \"sequenceNumber\":95, - \"runningHashVersion\":3 - }, - \"transaction_type\":\"ADD_USER\", - \"add_user\":{ - \"user\":\"8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d\" - }, - \"result\":\"result\", - \"parts\":2, - \"memo\":\"\" - } - }, - { - \"record_type\":\"SIGNATURES\", - \"signature\":[ - { - \"pubkey\":\"2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b\", - \"signature\":\"401717e768617c0f3311931c34a61e66ab362599a0e2a48ae7c4955645aec6573773985dafb84a11bfaf2bc12140c30b2f8c8ee094bc35d609bc56d15b4e9f04\" - } - ] - }, - { - \"record_type\": \"GRADIDO_TRANSACTION\", - \"transaction\":{ - \"version_number\":1, - \"signature\":{ - \"pubkey\":\"2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b\", - \"signature\":\"99665dee9f2b475e426a2f449d0dae61924f6cf025903666ff72f2c7ef1af27523ebcd5fb684d17813fe7906b2f8cfe5ef4bdbb264ebf3ef80363491d9b86807\" - }, - \"signature_count\":1, - \"hedera_transaction\":{ - \"consensusTimestamp\":{ - \"seconds\":1604392904, - \"nanos\":798541 - }, - \"runningHash\":\"f1fd03610a9788e9bac01e1efb8b99bafae450f9088cb940db954842e0799235c57d842be83d998e6c21786f77f967a7\", - \"sequenceNumber\":96, - \"runningHashVersion\":3 - }, - \"transaction_type\":\"GRADIDO_CREATION\", - \"gradido_creation\":{ - \"user\":\"8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d\", - \"new_balance\":10000000, - \"prev_transfer_rec_num\":0, - \"amount\":10000000 - }, - \"result\":\"result\", - \"parts\":1, - \"memo\":\"\" - } - }, - { - \"record_type\": \"GRADIDO_TRANSACTION\", - \"transaction\":{ - \"version_number\":1, - \"signature\":{ - \"pubkey\":\"8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d\", - \"signature\":\"90125e0cfce61397d50ed9ba6c5df4cd4e0cf6fee8b10c70fee2898765982570d9a1208c222981429ae3c229e3fd36c2bf2333518cd0a4f0515937822e499d0b\" - }, - \"signature_count\":1, - \"hedera_transaction\":{ - \"consensusTimestamp\":{ - \"seconds\":1604392929, - \"nanos\":52539 - }, - \"runningHash\":\"a4be8f54be4f806b61d31f6bd770d7742822f14f03ffe09c07f08bac3031a06d12de5e38fec5c307149c7faf6e9879b8\", - \"sequenceNumber\":97, - \"runningHashVersion\":3 - }, - \"transaction_type\":\"LOCAL_TRANSFER\", - \"local_transfer\":{ - \"sender\":{ - \"user\":\"8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d\", - \"new_balance\":9825500, - \"prev_transfer_rec_num\":0 - }, - \"receiver\":{ - \"user\":\"2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b\", - \"new_balance\":174500, - \"prev_transfer_rec_num\":0 - }, - \"amount\":174500 - }, - \"result\":\"result\", - \"parts\":1, - \"memo\":\"\" - } - } -]", true);*/ - $part_count = -1; - $temp_record = new Record; - $errors = []; - foreach($result['blocks'] as $_record) { - if(is_string($_record)) continue; - $parse_result = $temp_record->parseRecord($_record); - - if($parse_result == true) { - $sequenceNumber = $temp_record->getSequenceNumber(); - if($part_count == -1) { - $part_count = $temp_record->getPartCount(); - } - $part_count--; - - if($part_count == 0) { - if($sequenceNumber > $last_known_sequence_number) { - $finalize_result = $temp_record->finalize(); - if($finalize_result !== true) { - $errors[] = ['msg' => 'error in finalize', 'record' => $_record, 'details' => $finalize_result, 'sequenceNumber' => $sequenceNumber]; - } - } - - $temp_record = new Record; - $part_count = -1; - } - } else { - $temp_record = new Record; - $part_count = -1; - $errors[] = ['msg' => 'error in parse record', 'record' => $_record, 'details' => $parse_result]; - } - } - if(count($errors)) { - return $this->returnJson(['state' => 'error', 'msg' => 'error in parsing records', 'details' => $errors]); - } - return $this->returnJson(['state' => 'success']); - } - - /* - * payload.set("created", created); - * payload.set("id", task_model->getID()); - * payload.set("type", task_model->getTaskTypeString()); - * payload.set("public_key", user_model->getPublicKeyHex()); - * payload.set("error", error); - * payload.set("errorMessage", errorDetails); - */ - //! \param $transactionCreated creation of transaction in timestamp in seconds - //! -1 if transaction couldn't decode - //! \param $transactionBodyBase64Sha256 generic hash from transaction body serialized and converted to base64 - //! using sodium_crypto_generichash to calculate - // hash also in base64 format - //! \param $error short error name in user language - //! \param $errorDetails more detailed error message in user language - private function errorInTransaction($jsonData) { - $stateErrorTable = TableRegistry::getTableLocator()->get('StateErrors'); - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - $transactionTypesTable = TableRegistry::getTableLocator()->get('TransactionTypes'); - $stateError = $stateErrorTable->newEntity(); - // - $pubkey = hex2bin($jsonData->public_key); - $user_query = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $pubkey]); - if($user_query->count() != 1) { - return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'user pubkey hex:' . $jsonData->public_key]); - } - $stateError->state_user_id = $user_query->first()->id; - //$stateError->transaction_type_id - // TODO: - // - show state errors in navi_notify.ctp - $transaction_type_query = $transactionTypesTable->find('all')->select(['id'])->where(['name' => $jsonData->type]); - if($transaction_type_query->count() != 1) { - return $this->returnJson(['state' => 'error', 'msg' => 'transaction type not found', 'details' => 'transaction type name: ' . $jsonData->type]); - } - $stateError->transaction_type_id = $transaction_type_query->first()->id; - $stateError->created = $jsonData->created; - $stateError->message_json = json_encode(['task_id' => $jsonData->id, 'error' => $jsonData->error, 'errorMessage' => $jsonData->errorMessage]); - if(!$stateErrorTable->save($stateError)) { - $this->returnJsonSaveError($stateError, [ - 'state' => 'error', - 'msg' => 'error saving state_error in db', - 'details' => json_encode($stateError->getErrors()) - ]); - } - return $this->returnJson(['state' => 'success']); - } - - private function sendEMailTransactionFailed($transaction, $reason_type) - { - $disable_email = Configure::read('disableEmail', false); - if($disable_email) { - return; - } - $transaction_body = $transaction->getTransactionBody(); - $senderUser = $transaction->getFirstSigningUser(); - if($transaction_body != null) { - $transaction_type_name = $transaction_body->getTransactionTypeName(); - - if($transaction_type_name === 'transfer') { - $senderUser = $transaction_body->getSpecificTransaction()->getSenderUser(); - } - } - // send notification email - $noReplyEmail = Configure::read('noReplyEmail'); - if($senderUser) { - try { - $email = new Email(); - $emailViewBuilder = $email->viewBuilder(); - $emailViewBuilder->setTemplate('notificationTransactionFailed') - ->setVars(['user' => $senderUser, 'transaction' => $transaction, 'reason' => $reason_type]); - $receiverNames = $senderUser->getNames(); - if($receiverNames == '' || $senderUser->email == '') { - $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $senderUser->id); - return false; - } - $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)']) - ->setTo([$senderUser->email => $senderUser->getNames()]) - ->setSubject(__('Gradido Transaktion fehlgeschlagen!')) - ->send(); - } catch(Exception $e) { - $this->addAdminError('JsonRequestController', 'sendEMailTransactionFailed', [$e->getMessage(), $reason_type], $senderUser->id); - - } - } - } - - private function putTransaction($transactionBase64) { - $transaction = new Transaction($transactionBase64); - - if($transaction->hasErrors()) { - $this->sendEMailTransactionFailed($transaction, 'parse'); - return $this->returnJson(['state' => 'error', 'msg' => 'error parsing transaction', 'details' => $transaction->getErrors()]); - } - - if(!$transaction->validate()) { - //$transaction_details - $this->sendEMailTransactionFailed($transaction, 'validate'); - return $this->returnJsonSaveError($transaction, [ - 'state' => 'error', - 'msg' => 'error validate transaction', - 'details' => $transaction->getErrors() - ]); - } - - if ($transaction->save()) { - $result = ['state' => 'success']; - if($transaction->hasWarnings()) { - $result['warnings'] = $transaction->getWarnings(); - } - // success - return $this->returnJson($result); - } else { - - $this->sendEMailTransactionFailed($transaction, 'save'); - return $this->returnJsonSaveError($transaction, [ - 'state' => 'error', - 'msg' => 'error saving transaction in db', - 'details' => json_encode($transaction->getErrors()) - ]); - } - } - - private function moveTransaction($pubkeys, $memo, $session_id) { - //$pubkeys->sender - //$pubkeys->receiver - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($pubkeys->sender)])->contain(['StateBalances']); - if(!$user->count()) { - return $this->returnJson(['state' => 'not found', 'msg' => 'user not found or empty balance']); - } - $amountCent = $user->first()->state_balances[0]->amount; - //var_dump($user->first()); - $builderResult = TransactionTransfer::build( - $amountCent, - $memo, - $pubkeys->receiver, - $pubkeys->sender - ); - if($builderResult['state'] === 'success') { - - $http = new Client(); - try { - $loginServer = Configure::read('LoginServer'); - $url = $loginServer['host'] . ':' . $loginServer['port']; - - $response = $http->post($url . '/checkTransaction', json_encode([ - 'session_id' => $session_id, - 'transaction_base64' => base64_encode($builderResult['transactionBody']->serializeToString()), - 'balance' => $amountCent - ]), ['type' => 'json']); - $json = $response->getJson(); - if($json['state'] != 'success') { - if($json['msg'] == 'session not found') { - return $this->returnJson(['state' => 'error', 'msg' => 'session not found']); - } else { - //$this->Flash->error(__('login server return error: ' . json_encode($json))); - return $this->returnJson(['state' => 'error', 'msg' => 'login server return error', 'details' => $json]); - } - } else { - return $this->returnJson(['state' => 'success']); - } - - } catch(\Exception $e) { - $msg = $e->getMessage(); - //$this->Flash->error(__('error http request: ') . $msg); - return $this->returnJson(['state' => 'error', 'msg' => 'error http request', 'details' => $msg]); - } - - } else { - return $this->returnJson(['state' => 'error', 'msg' => 'error building transaction']); - } - } - - private function userDelete($userPubkeyHex) { - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($userPubkeyHex)]); - if(!$user || $user->count == 0) { - return $this->returnJson(['state' => 'error', 'msg' => 'user not found']); - } - - } - - private function checkUser($email, $last_name) { - $userTable = TableRegistry::getTableLocator()->get('Users'); - $user = $userTable->find('all') - ->where(['email' => $email]) - ->contain([]) - ->select(['first_name', 'last_name', 'email']); - if(!$user->count()) { - return $this->returnJson(['state' => 'not found', 'msg' => 'user not found']); - } - if($user->count() == 1 && $user->first()->last_name == $last_name) { - return $this->returnJson(['state' => 'success']); - } - return $this->returnJson(['state' => 'not identical', 'user' => $user->toArray()]); - } - - private function getUserBalance($email, $last_name) { - - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $stateUsers = $stateUserTable->find('all')->where(['OR' => ['email' => $email, 'last_name' => $last_name]])->contain(['StateBalances']); - $gdds = []; - foreach($stateUsers as $stateUser) { - foreach($stateUser->state_balances as $stateBalance) { - if(!isset($gdds[$stateUser->email])) { - $gdds[$stateUser->email] = []; - } - if(!isset($gdds[$stateUser->email][$stateUser->last_name])) { - $gdds[$stateUser->email][$stateUser->last_name] = 0; - } - $gdds[$stateUser->email][$stateUser->last_name] += $stateBalance->amount; - } - } - return $this->returnJson(['state' => 'success', 'gdds' => $gdds]); - } - - private function getUsers($page, $count) { - - $userTable = TableRegistry::getTableLocator()->get('Users'); - $this->paginate = [ - 'limit' => $count, - 'page' => $page - ]; - $usersQuery = $userTable->find('all') - ->select(['first_name', 'last_name', 'email']) - ->order(['id']); - try { - return $this->returnJson(['state' => 'success', 'users' => $this->paginate($usersQuery)]); - } catch (Exception $ex) { - return $this->returnJson(['state' => 'exception', 'msg' => 'error paginate users', 'details' => $ex->getMessage()]); - } - - - //return $this->returnJson(['state' => 'success', 'users' => $users->toArray()]); - - } - - private function getRunningUserTasks() { - $session = $this->getRequest()->getSession(); - $state_user_email = $session->read('StateUser.email'); - $requestResult = $this->JsonRequestClient->getRunningUserTasks($state_user_email);; - return $this->returnJson($requestResult); - } - - - private function returnJsonSaveError($transaction, $errorArray) { - $json = json_encode($errorArray); - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $pub = $transaction->getFirstPublic(); - $stateUserQuery = $stateUserTable - ->find('all') - ->where(['public_key' => $pub]) - ->contain(false); - if($stateUserQuery->count() == 1) { - $stateErrorsTable = TableRegistry::getTableLocator()->get('StateErrors'); - $stateErrorEntity = $stateErrorsTable->newEntity(); - $stateErrorEntity->state_user_id = $stateUserQuery->first()->id; - $stateErrorEntity->transaction_type_id = $transaction->getTransactionBody()->getTransactionTypeId(); - $stateErrorEntity->message_json = $json; - $stateErrorsTable->save($stateErrorEntity); - } else { - $errorArray['user_error'] = "user with $pub not found"; - $json = json_encode($errorArray); - } - - return $this->returnJsonEncoded($json); - } - - - -} diff --git a/community_server/src/Controller/OperatorTypesController.php b/community_server/src/Controller/OperatorTypesController.php deleted file mode 100644 index 41db53f53..000000000 --- a/community_server/src/Controller/OperatorTypesController.php +++ /dev/null @@ -1,106 +0,0 @@ -paginate($this->OperatorTypes); - - $this->set(compact('operatorTypes')); - } - - /** - * View method - * - * @param string|null $id Operator Type id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $operatorType = $this->OperatorTypes->get($id, [ - 'contain' => ['Operators'] - ]); - - $this->set('operatorType', $operatorType); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $operatorType = $this->OperatorTypes->newEntity(); - if ($this->request->is('post')) { - $operatorType = $this->OperatorTypes->patchEntity($operatorType, $this->request->getData()); - if ($this->OperatorTypes->save($operatorType)) { - $this->Flash->success(__('The operator type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The operator type could not be saved. Please, try again.')); - } - $this->set(compact('operatorType')); - } - - /** - * Edit method - * - * @param string|null $id Operator Type id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $operatorType = $this->OperatorTypes->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $operatorType = $this->OperatorTypes->patchEntity($operatorType, $this->request->getData()); - if ($this->OperatorTypes->save($operatorType)) { - $this->Flash->success(__('The operator type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The operator type could not be saved. Please, try again.')); - } - $this->set(compact('operatorType')); - } - - /** - * Delete method - * - * @param string|null $id Operator Type id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $operatorType = $this->OperatorTypes->get($id); - if ($this->OperatorTypes->delete($operatorType)) { - $this->Flash->success(__('The operator type has been deleted.')); - } else { - $this->Flash->error(__('The operator type could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/OperatorsController.php b/community_server/src/Controller/OperatorsController.php deleted file mode 100644 index 974151a7b..000000000 --- a/community_server/src/Controller/OperatorsController.php +++ /dev/null @@ -1,236 +0,0 @@ -Auth->allow(['ajaxSave', 'ajaxLoad', 'ajaxDelete']); - } - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['OperatorTypes'] - ]; - $operators = $this->paginate($this->Operators); - - $this->set(compact('operators')); - } - - public function ajaxSave() - { - if ($this->request->is('post')) { - - $operatorTypeName = $this->request->getData('operator_type_name'); - $username = $this->request->getData('username'); - $pubkey_bin = base64_decode($this->request->getData('user_pubkey')); - $data = base64_decode($this->request->getData('data_base64')); - $sign = base64_decode($this->request->getData('sign')); - - //$publicKey_hex = bin2hex($pubkey_bin); - //$signature_hex = bin2hex($sign); - - if(!sodium_crypto_sign_verify_detached($sign, $data, $pubkey_bin)) { - return $this->returnJson([ - 'state' => 'wrong signature', - /* 'details' => [ - 'pubkey' => $publicKey_hex, - 'sign' => $signature_hex, - 'data' => bin2hex($data) - ] -*/ - ]); - } - - $operatorTypeId = $this->Operators->OperatorTypes-> - find() - ->where(['name' => $operatorTypeName]) - ->select(['id']) - ->first(); - - // load operator from db if already exist - $operator = $this->Operators - ->find() - ->where([ - 'operator_type_id' => $operatorTypeId->id, - 'username' => $username, - 'user_pubkey' => $pubkey_bin]) - ->first(); - if(!$operator) { - // create new entity - $operator = $this->Operators->newEntity(); - } else { - // check if request has valid signature - - } - - $operator = $this->Operators->patchEntity($operator, $this->request->getData()); - $operator->user_pubkey = $pubkey_bin; - $operator->operator_type_id = $operatorTypeId->id; - if ($this->Operators->save($operator)) { - return $this->returnJson(['state' => 'success']); - } - return $this->returnJson(['state' => 'error', 'details' => $operator->getErrors()]); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - public function ajaxLoad() - { - if ($this->request->is('get')) { - $username = $this->request->getQuery('username'); - $operators = $this->Operators - ->find() - ->where(['username' => $username]) - ->contain(['OperatorTypes']) - ->select(['data_base64', 'OperatorTypes.name']) - ->toArray(); - ; - if($operators) { - return $this->returnJson(['state' => 'success', 'operators' => $operators]); - } else { - return $this->returnJson(['state' => 'not found']); - } - - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - function ajaxDelete() { - if ($this->request->is('delete')) { - $operatorTypeName = $this->request->getData('operator_type_name'); - $username = $this->request->getData('username'); - $pubkey_bin = base64_decode($this->request->getData('user_pubkey')); - $sign = base64_decode($this->request->getData('sign')); - - $operatorTypeId = $this->Operators->OperatorTypes-> - find() - ->where(['name' => $operatorTypeName]) - ->select(['id']) - ->first(); - - // load operator from db if already exist - $operator = $this->Operators - ->find() - ->where([ - 'operator_type_id' => $operatorTypeId->id, - 'username' => $username, - 'user_pubkey' => $pubkey_bin]) - ->first(); - if(!$operator) { - return $this->returnJson(['state' => 'error', 'msg' => 'not found']); - } else { - $data = base64_decode($operator->data_base64); - // check if request has valid signature - if(!sodium_crypto_sign_verify_detached($sign, $data, $pubkey_bin)) { - return $this->returnJson(['state' => 'error', 'msg' => 'wrong signature']); - } - } - if ($this->Operators->delete($operator)) { - return $this->returnJson(['state' => 'success']); - } - return $this->returnJson(['state' => 'error', 'details' => $operator->getErrors()]); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - /** - * View method - * - * @param string|null $id Operator id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $operator = $this->Operators->get($id, [ - 'contain' => ['OperatorTypes'] - ]); - - $this->set('operator', $operator); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $operator = $this->Operators->newEntity(); - if ($this->request->is('post')) { - $operator = $this->Operators->patchEntity($operator, $this->request->getData()); - if ($this->Operators->save($operator)) { - $this->Flash->success(__('The operator has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The operator could not be saved. Please, try again.')); - } - $operatorTypes = $this->Operators->OperatorTypes->find('list', ['limit' => 200]); - $this->set(compact('operator', 'operatorTypes')); - } - - /** - * Edit method - * - * @param string|null $id Operator id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $operator = $this->Operators->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $operator = $this->Operators->patchEntity($operator, $this->request->getData()); - if ($this->Operators->save($operator)) { - $this->Flash->success(__('The operator has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The operator could not be saved. Please, try again.')); - } - $operatorTypes = $this->Operators->OperatorTypes->find('list', ['limit' => 200]); - $this->set(compact('operator', 'operatorTypes')); - } - - /** - * Delete method - * - * @param string|null $id Operator id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $operator = $this->Operators->get($id); - if ($this->Operators->delete($operator)) { - $this->Flash->success(__('The operator has been deleted.')); - } else { - $this->Flash->error(__('The operator could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/PagesController.php b/community_server/src/Controller/PagesController.php deleted file mode 100644 index 69f57356b..000000000 --- a/community_server/src/Controller/PagesController.php +++ /dev/null @@ -1,86 +0,0 @@ -Auth->allow(['display']); - } - - /** - * Displays a view - * - * @param array ...$path Path segments. - * @return \Cake\Http\Response|null - * @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt. - * @throws \Cake\Http\Exception\NotFoundException When the view file could not - * be found or \Cake\View\Exception\MissingTemplateException in debug mode. - */ - public function display(...$path) - { - - $count = count($path); - if (!$count) { - return $this->redirect('/'); - } - if (in_array('..', $path, true) || in_array('.', $path, true)) { - throw new ForbiddenException(); - } - $page = $subpage = null; - - if (!empty($path[0])) { - $page = $path[0]; - } - if (!empty($path[1])) { - $subpage = $path[1]; - } - /*$session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - $login_server_session = $this->request->getCookie('GRADIDO_LOGIN', '');*/ - if($page == "vue" || $page == "vue-dev") { - $this->viewBuilder()->setLayout(false); - } - $this->set(compact('page', 'subpage')); - - try { - $this->render(implode('/', $path)); - } catch (MissingTemplateException $exception) { - if (Configure::read('debug')) { - throw $exception; - } - throw new NotFoundException(); - } - } -} diff --git a/community_server/src/Controller/ProfileController.php b/community_server/src/Controller/ProfileController.php deleted file mode 100644 index 2a378e076..000000000 --- a/community_server/src/Controller/ProfileController.php +++ /dev/null @@ -1,206 +0,0 @@ -loadComponent('JsonRequestClient'); - $this->Auth->allow(['index', 'edit']); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> - add(new NaviHierarchyEntry(__('Mein Profil'), 'Profile', 'index', true)) - ); - } - /** - * Get binary file data from request data - * - * @return binary data - */ - protected function getFileData($requestData) - { - $binaryFileData = null; - // Get a list of UploadedFile objects - $file = $requestData['profile_img']; - // Read the file data. - $type = $file['type']; - $error = $file['error']; - if ($error === 0 && strpos($type, 'image/') === 0) { - $path = new File($file['tmp_name']); - $binaryFileData = $path->read(true, 'r'); - $this->log("binaryFileData: ".$binaryFileData, 'debug'); - } - return $binaryFileData; - } - /** - * Update Profile Data - * - * ...which is spread over two tables, plus needs to be promoted to the Login Server. - * - * @throws Exception - */ - protected function updateProfileData($requestData, $userId, $communityProfile) - { - // Update Profile with Form Data! - $usersTable = TableRegistry::getTableLocator()->get('StateUsers'); - $stateUserQuery = $usersTable - ->find('all') - ->select(['id', 'first_name', 'last_name']) - ->where(['id' => $userId]); - - if ($stateUserQuery->count() == 1) { - $stateUser = $stateUserQuery->first(); - $stateUser = $usersTable->patchEntity($stateUser, $requestData); - - $profilesTable = TableRegistry::getTableLocator()->get('CommunityProfiles'); - // Save old binary data, because the file input is always empty, in HTML! - $oldBinaryData = $communityProfile['profile_img']; - - $communityProfile = $profilesTable->patchEntity($communityProfile, $requestData); - $communityProfile['state_user_id'] = $userId; - - $binaryFileData = $this->getFileData($requestData); - if ($binaryFileData !== null) { - $this->log("CommunityProfile: Writing binary img data.", 'debug'); - $communityProfile['profile_img'] = $binaryFileData; - } else { - $this->log("CommunityProfile: Nothing uploaded!", 'debug'); - $communityProfile['profile_img'] = $oldBinaryData; - } - if ($profilesTable->save($communityProfile) && - $usersTable->save($stateUser) - ) { - $session = $this->getRequest()->getSession(); - $session_id = $session->read('session_id'); - $email = $session->read('StateUser.email'); - $this->returnJson( - $this->JsonRequestClient->sendRequest( - json_encode( - [ - 'session_id' => $session_id, - 'email' => $email, - 'update' => [ - 'User.first_name' => $requestData['first_name'], - 'User.last_name' => $requestData['last_name'] - ] - ] - ), - '/updateUserInfos' - ) - ); - $this->Flash->success(__('Dein Profil wurde aktualisiert!')); - } - } else { - $this->Flash->error(__("Non-recoverable database problem - state_user doesn't exist or not unique!")); - } - return [$stateUser, $communityProfile]; - } - /** - * Get or create CommunityProfile - * - * @return \Cake\ORM\CommunityProfile - */ - protected function getCommunityProfile($userId) - { - $profilesTable = TableRegistry::getTableLocator()->get('CommunityProfiles'); - $communityProfileQuery = $profilesTable - ->find('all') - ->select(['id', 'profile_img', 'profile_desc']) - ->where(['state_user_id' => $userId]); - if ($communityProfileQuery->count() != 1) { - $communityProfile = $profilesTable->newEntity(); - if ($profilesTable->save($communityProfile)) { - $this->log("CommunityProfile created.", 'debug'); - } - } else { - $communityProfile = $communityProfileQuery->first(); - } - return $communityProfile; - } - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if ($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - $communityProfile = $session->read('CommunityProfile'); - if (!$communityProfile) { - $this->log("CommunityProfile not found in session! Loading or creating new one.", 'debug'); - $session->write('CommunityProfile', $this->getCommunityProfile($user['id'])); - } - $this->set('user', $user); - $this->set('communityProfile', $communityProfile); - $this->set('timeUsed', microtime(true) - $startTime); - } - /** - * Edit method - * - * @return \Cake\Http\Response|null - */ - public function edit() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - - $user = $session->read('StateUser'); - $communityProfile = $session->read('CommunityProfile'); - if (!$user) { - $result = $this->requestLogin(); - if ($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - } - if (!$communityProfile) { - $this->log("CommunityProfile not found in session! Loading or creating new one.", 'debug'); - $session->write('CommunityProfile', $this->getCommunityProfile($user['id'])); - } - - $profileForm = new ProfileForm(); - if ($this->request->is('post')) { - $requestData = $this->request->getData(); - if ($profileForm->validate($requestData)) { - [$stateUser, $communityProfile] = $this->updateProfileData($requestData, $user['id'], $communityProfile); - $user['first_name'] = $stateUser['first_name']; - $user['last_name'] = $stateUser['last_name']; - $session->write('StateUser.first_name', $stateUser['first_name']); - $session->write('StateUser.last_name', $stateUser['last_name']); - $session->write('CommunityProfile', $communityProfile); - return $this->redirect(['action' => 'index']); - } else { - $this->Flash->error(__('Something was invalid, please try again!')); - } - } - $this->set('user', $user); - $this->set('communityProfile', $communityProfile); - $this->set('profileForm', $profileForm); - $this->set('timeUsed', microtime(true) - $startTime); - } -} diff --git a/community_server/src/Controller/RolesController.php b/community_server/src/Controller/RolesController.php deleted file mode 100644 index 80aa493d3..000000000 --- a/community_server/src/Controller/RolesController.php +++ /dev/null @@ -1,108 +0,0 @@ -paginate($this->Roles); - - $this->set(compact('roles')); - } - - /** - * View method - * - * @param string|null $id Role id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $role = $this->Roles->get($id, [ - 'contain' => [], - ]); - - $this->set('role', $role); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $role = $this->Roles->newEntity(); - if ($this->request->is('post')) { - $role = $this->Roles->patchEntity($role, $this->request->getData()); - if ($this->Roles->save($role)) { - $this->Flash->success(__('The role has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The role could not be saved. Please, try again.')); - } - $this->set(compact('role')); - } - - /** - * Edit method - * - * @param string|null $id Role id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $role = $this->Roles->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $role = $this->Roles->patchEntity($role, $this->request->getData()); - if ($this->Roles->save($role)) { - $this->Flash->success(__('The role has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The role could not be saved. Please, try again.')); - } - $this->set(compact('role')); - } - - /** - * Delete method - * - * @param string|null $id Role id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $role = $this->Roles->get($id); - if ($this->Roles->delete($role)) { - $this->Flash->success(__('The role has been deleted.')); - } else { - $this->Flash->error(__('The role could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/ServerUsersController.php b/community_server/src/Controller/ServerUsersController.php deleted file mode 100644 index 7255eee0f..000000000 --- a/community_server/src/Controller/ServerUsersController.php +++ /dev/null @@ -1,132 +0,0 @@ -Auth->allow(['add', 'edit']); - $this->Auth->deny('index'); - } - - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $serverUsers = $this->paginate($this->ServerUsers); - $this->set(compact('serverUsers')); - } - - public function login() - { - $startTime = microtime(true); - if ($this->request->is('post')) { - $user = $this->Auth->identify(); - if ($user) { - $this->Auth->setUser($user); - return $this->redirect($this->Auth->redirectUrl()); - } - $this->Flash->error(__('Invalid username or password, try again')); - } - $this->set('timeUsed', microtime(true) - $startTime); - } - - public function logout() - { - return $this->redirect($this->Auth->logout()); - } - - /** - * View method - * - * @param string|null $id Server User id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $serverUser = $this->ServerUsers->get($id, [ - 'contain' => [] - ]); - - $this->set('serverUser', $serverUser); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $serverUser = $this->ServerUsers->newEntity(); - if ($this->request->is('post')) { - $serverUser = $this->ServerUsers->patchEntity($serverUser, $this->request->getData()); - if ($this->ServerUsers->save($serverUser)) { - $this->Flash->success(__('The server user has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The server user could not be saved. Please, try again.')); - } - $this->set(compact('serverUser')); - } - - /** - * Edit method - * - * @param string|null $id Server User id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $serverUser = $this->ServerUsers->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $serverUser = $this->ServerUsers->patchEntity($serverUser, $this->request->getData()); - if ($this->ServerUsers->save($serverUser)) { - $this->Flash->success(__('The server user has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The server user could not be saved. Please, try again.')); - } - $this->set(compact('serverUser')); - } - - /** - * Delete method - * - * @param string|null $id Server User id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $serverUser = $this->ServerUsers->get($id); - if ($this->ServerUsers->delete($serverUser)) { - $this->Flash->success(__('The server user has been deleted.')); - } else { - $this->Flash->error(__('The server user could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateBalancesController.php b/community_server/src/Controller/StateBalancesController.php deleted file mode 100644 index 249b6cb06..000000000 --- a/community_server/src/Controller/StateBalancesController.php +++ /dev/null @@ -1,399 +0,0 @@ -Auth->allow(['add', 'edit']); - $this->Auth->allow(['overview', 'overviewGdt', 'ajaxListTransactions', 'ajaxGdtOverview', 'ajaxGetBalance', 'ajaxGdtTransactions']); - $this->loadComponent('JsonRequestClient'); - } - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['StateUsers'] - ]; - $stateBalances = $this->paginate($this->StateBalances); - - $this->set(compact('stateBalances')); - } - - - - public function overview() - { - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> - add(new NaviHierarchyEntry(__('Kontoübersicht'), 'StateBalances', 'overview', true)) - ); - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if ($result !== true) { - return $result; - } - - $user = $session->read('StateUser'); - $update_balance_result = $this->StateBalances->updateBalances($user['id']); - if($update_balance_result['success'] !== true) { - $this->addAdminError('StateBalances', 'overview', $update_balance_result, $user['id']); - } - - $stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances'); - $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - - $stateBalancesTable->updateBalances($user['id']); - $gdtSum = 0; - $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi'); - if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) { - $gdtSum = intval($gdtEntries['data']['sum']); - } else { - $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id'] ? $user['id'] : 0); - } - - - $stateUserTransactionsQuery = $stateUserTransactionsTable - ->find() - ->where(['state_user_id' => $user['id']]) - ->order(['balance_date' => 'ASC']) - ->contain([]) - ; - $decay = true; - $transactions = []; - if($stateUserTransactionsQuery->count() > 0) { - $transactions_with_decay = $transactionsTable->listTransactionsHumanReadable($stateUserTransactionsQuery->toArray(), $user, $decay); - foreach($transactions_with_decay as $tr) { - if(isset($tr['decay'])) { - $tr['decay']['type'] = 'decay'; - $tr['decay']['memo'] = ''; - $transactions[] = $tr['decay']; - } - $transactions[] = $tr; - } - } - - $state_balance = $stateBalancesTable->find()->where(['state_user_id' => $user['id']])->first(); - - $body = [ - 'state' => 'success', - 'transactions' => $transactions, - 'transactionExecutingCount' => $session->read('Transactions.executing'), - 'count' => count($transactions), - 'gdtSum' => $gdtSum, - 'timeUsed' => microtime(true) - $startTime - ]; - $now = new FrozenTime(); - $body['decay_date'] = $now; - - if(!$state_balance) { - $balance = 0.0; - } else { - $balance = $stateBalancesTable->calculateDecay($state_balance->amount, $state_balance->record_date, $now); - //$balance = $state_balance->partDecay($now); - } - $calculated_balance = 0; - foreach($transactions as $transaction) { - if($transaction['type'] == 'decay' || $transaction['type'] == 'send') { - $calculated_balance -= $transaction['balance']; - } else { - $calculated_balance += $transaction['balance']; - } - } - - $this->set('calculated_balance', $calculated_balance); - - $this->set('transactions', array_reverse($transactions)); - $this->set('transactionExecutingCount', $session->read('Transactions.executing')); - $this->set('balance', $balance); - $this->set('timeUsed', microtime(true) - $startTime); - $this->set('gdtSum', $gdtSum); - } - - - public function ajaxGdtOverview() - { - $gdtSum = 0; - $gdtCount = -1; - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - - if(!$user) { - return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'exist a valid session cookie?']); - } - $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi'); - - if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) { - $gdtSum = intval($gdtEntries['data']['sum']); - if(isset($gdtEntries['data']['count'])) { - $gdtCount = intval($gdtEntries['data']['count']); - } - } else { - if($user) { - $this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, $user['id']); - } else { - $this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, 0); - } - } - - return $this->returnJson([ - 'state' => 'success', - 'transactions' => $transactions, - 'transactionExecutingCount' => $session->read('Transaction.executing'), - 'count' => $all_user_transactions_count - ]); - } - - - public function overviewGdt() - { - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> - add(new NaviHierarchyEntry(__('GDT Kontoübersicht'), 'StateBalances', 'overviewGdt', true)) - ); - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if ($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - $requestResult = $this->JsonRequestClient->sendRequestGDT([ - 'email' => $user['email'], - 'page' => 1, - 'count' => 100, - 'orderDirection' => 'DESC' - ], 'GdtEntries' . DS . 'listPerEmailApi'); - - //var_dump($requestResult); - if('success' === $requestResult['state'] && 'success' === $requestResult['data']['state']) - { - $moreEntrysAsShown = false; - if(isset($requestResult['data']['count'])) { - if($requestResult['data']['count'] > 100) { - $moreEntrysAsShown = true; - } - } else { - $moreEntrysAsShown = $requestResult['data']['moreEntrysAsShown']; - } - //var_dump(array_keys($requestResult['data'])); - if(isset($requestResult['data']['gdtEntries'])) { - $ownEntries = $requestResult['data']['gdtEntries']; - } else { - $ownEntries = $requestResult['data']['ownEntries']; - } - //$gdtEntries = $requestResult['data']['entries']; - - $gdtSum = 0; - foreach ($ownEntries as $i => $gdtEntry) { - $gdtSum += $gdtEntry['gdt']; - //echo "index: $i
    "; - //var_dump($gdtEntry); - } - if (isset($requestResult['data']['connectEntrys'])) { - $connectEntries = $requestResult['data']['connectEntrys']; - - foreach ($connectEntries as $entry) { - //if(!$count) var_dump($entry); - //$count++; - $gdtSum += $entry['connect']['gdt_entry']['gdt']; - } - $this->set('connectEntries', $connectEntries); - } - - //echo "gdtSum: $gdtSum
    "; - $this->set('gdtSum', $gdtSum); - $this->set('ownEntries', $ownEntries); - $this->set('moreEntrysAsShown', $moreEntrysAsShown); - $this->set('user', $user); - - if (isset($requestResult['data']['publishers'])) { - $publishers = $requestResult['data']['publishers']; - $this->set('publishers', $publishers); - } - } else { - $this->addAdminError('StateBalancesController', 'overviewGdt', $requestResult, $user['id']); - $this->Flash->error(__('Fehler beim GDT Server, bitte abwarten oder den Admin benachrichtigen!')); - } - } - - public function ajaxGdtTransactions() - { - $startTime = microtime(true); - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - if(!$user) { - return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'exist a valid session cookie?']); - } - - $requestResult = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'listPerEmailApi'); - $connectEntries = []; - $publishers = []; - - //var_dump($requestResult); - if('success' === $requestResult['state'] && 'success' === $requestResult['data']['state']) { - - //var_dump(array_keys($requestResult['data'])); - $ownEntries = $requestResult['data']['ownEntries']; - //$gdtEntries = $requestResult['data']['entries']; - - $gdtSum = 0; - foreach ($ownEntries as $i => $gdtEntry) { - $gdtSum += $gdtEntry['gdt']; - //echo "index: $i
    "; - //var_dump($gdtEntry); - } - if (isset($requestResult['data']['connectEntrys'])) { - $connectEntries = $requestResult['data']['connectEntrys']; - - foreach ($connectEntries as $entry) { - //if(!$count) var_dump($entry); - //$count++; - $gdtSum += $entry['connect']['gdt_entry']['gdt']; - } - } - - //echo "gdtSum: $gdtSum
    "; - - if (isset($requestResult['data']['publishers'])) { - $publishers = $requestResult['data']['publishers']; - } - } else { - $this->addAdminError('StateBalancesController', 'ajaxGdtTransactions', $requestResult, $user['id']); - //$this->Flash->error(__('Fehler beim GDT Server, bitte abwarten oder den Admin benachrichtigen!')); - return $this->returnJson(['state' => 'error', 'msg' => 'error from gdt server', 'details' => $requestResult]); - } - - - return $this->returnJson([ - 'state' => 'success', - 'gdtSum' => $gdtSum, - 'ownEntries' => $ownEntries, - 'connectEntries' => $connectEntries, - 'publishers' => $publishers, - 'gdtSumPerEmail' => $requestResult['data']['gdtSumPerEmail'], - 'moreEntrysAsShown' => $requestResult['data']['moreEntrysAsShown'], - 'timeUsed' => microtime(true) - $startTime - ]); - } - - public function sortTransactions($a, $b) - { - if ($a['date'] == $b['date']) { - return 0; - } - return ($a['date'] > $b['date']) ? -1 : 1; - } - - /** - * View method - * - * @param string|null $id State Balance id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateBalance = $this->StateBalances->get($id, [ - 'contain' => ['StateUsers'] - ]); - - $this->set('stateBalance', $stateBalance); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateBalance = $this->StateBalances->newEntity(); - if ($this->request->is('post')) { - $stateBalance = $this->StateBalances->patchEntity($stateBalance, $this->request->getData()); - if ($this->StateBalances->save($stateBalance)) { - $this->Flash->success(__('The state balance has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state balance could not be saved. Please, try again.')); - } - $stateUsers = $this->StateBalances->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('stateBalance', 'stateUsers')); - } - - /** - * Edit method - * - * @param string|null $id State Balance id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateBalance = $this->StateBalances->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateBalance = $this->StateBalances->patchEntity($stateBalance, $this->request->getData()); - if ($this->StateBalances->save($stateBalance)) { - $this->Flash->success(__('The state balance has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state balance could not be saved. Please, try again.')); - } - $stateUsers = $this->StateBalances->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('stateBalance', 'stateUsers')); - } - - /** - * Delete method - * - * @param string|null $id State Balance id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateBalance = $this->StateBalances->get($id); - if ($this->StateBalances->delete($stateBalance)) { - $this->Flash->success(__('The state balance has been deleted.')); - } else { - $this->Flash->error(__('The state balance could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateCreatedController.php b/community_server/src/Controller/StateCreatedController.php deleted file mode 100644 index b66f1b7c1..000000000 --- a/community_server/src/Controller/StateCreatedController.php +++ /dev/null @@ -1,113 +0,0 @@ -paginate = [ - 'contain' => ['Transactions', 'StateUsers'] - ]; - $stateCreated = $this->paginate($this->StateCreated); - - $this->set(compact('stateCreated')); - } - - /** - * View method - * - * @param string|null $id State Created id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateCreated = $this->StateCreated->get($id, [ - 'contain' => ['Transactions', 'StateUsers'] - ]); - - $this->set('stateCreated', $stateCreated); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateCreated = $this->StateCreated->newEntity(); - if ($this->request->is('post')) { - $stateCreated = $this->StateCreated->patchEntity($stateCreated, $this->request->getData()); - if ($this->StateCreated->save($stateCreated)) { - $this->Flash->success(__('The state created has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state created could not be saved. Please, try again.')); - } - $transactions = $this->StateCreated->Transactions->find('list', ['limit' => 200]); - $stateUsers = $this->StateCreated->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('stateCreated', 'transactions', 'stateUsers')); - } - - /** - * Edit method - * - * @param string|null $id State Created id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateCreated = $this->StateCreated->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateCreated = $this->StateCreated->patchEntity($stateCreated, $this->request->getData()); - if ($this->StateCreated->save($stateCreated)) { - $this->Flash->success(__('The state created has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state created could not be saved. Please, try again.')); - } - $transactions = $this->StateCreated->Transactions->find('list', ['limit' => 200]); - $stateUsers = $this->StateCreated->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('stateCreated', 'transactions', 'stateUsers')); - } - - /** - * Delete method - * - * @param string|null $id State Created id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateCreated = $this->StateCreated->get($id); - if ($this->StateCreated->delete($stateCreated)) { - $this->Flash->success(__('The state created has been deleted.')); - } else { - $this->Flash->error(__('The state created could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateErrorsController.php b/community_server/src/Controller/StateErrorsController.php deleted file mode 100644 index 0c91d93e3..000000000 --- a/community_server/src/Controller/StateErrorsController.php +++ /dev/null @@ -1,173 +0,0 @@ -Auth->allow(['showForUser', 'deleteForUser']); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> - add(new NaviHierarchyEntry(__('Fehler'), 'StateErrors', 'ShowForUser', true)) - ); - } - - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['StateUsers', 'TransactionTypes'] - ]; - $stateErrors = $this->paginate($this->StateErrors); - - $this->set(compact('stateErrors')); - } - - public function showForUser() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - if(!$user) { - $result = $this->requestLogin(); - if($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - } - - $errors = $this->StateErrors->find('all')->where(['state_user_id' => $user['id']])->contain(false); - $transactionTypes = $this->StateErrors->TransactionTypes->find('all')->select(['id', 'name', 'text'])->order(['id']); - - $this->set('errors', $errors); - $this->set('transactionTypes', $transactionTypes->toList()); - $this->set('timeUsed', microtime(true) - $startTime); - } - - public function deleteForUser($id = null) - { - $this->request->allowMethod(['post', 'delete', 'get']); - $stateError = $this->StateErrors->get($id); - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - if($user['id'] != $stateError->state_user_id) { - $this->Flash->error(__('Error belongs to another User, cannot delete')); - } - else if ($this->StateErrors->delete($stateError)) { - $this->Flash->success(__('The state error has been deleted.')); - } else { - $this->Flash->error(__('The state error could not be deleted. Please, try again.')); - } - $errors = $this->StateErrors->find('all')->where(['state_user_id' => $user['id']])->contain(false); - if($errors->count() == 0) { - return $this->redirect(['controller' => 'Dashboard']); - } - return $this->redirect(['action' => 'showForUser']); - } - - - /** - * View method - * - * @param string|null $id State Error id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateError = $this->StateErrors->get($id, [ - 'contain' => ['StateUsers', 'TransactionTypes'] - ]); - - $this->set('stateError', $stateError); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateError = $this->StateErrors->newEntity(); - if ($this->request->is('post')) { - $stateError = $this->StateErrors->patchEntity($stateError, $this->request->getData()); - if ($this->StateErrors->save($stateError)) { - $this->Flash->success(__('The state error has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state error could not be saved. Please, try again.')); - } - $stateUsers = $this->StateErrors->StateUsers->find('list', ['limit' => 200]); - $transactionTypes = $this->StateErrors->TransactionTypes->find('list', ['limit' => 200]); - $this->set(compact('stateError', 'stateUsers', 'transactionTypes')); - } - - /** - * Edit method - * - * @param string|null $id State Error id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateError = $this->StateErrors->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateError = $this->StateErrors->patchEntity($stateError, $this->request->getData()); - if ($this->StateErrors->save($stateError)) { - $this->Flash->success(__('The state error has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state error could not be saved. Please, try again.')); - } - $stateUsers = $this->StateErrors->StateUsers->find('list', ['limit' => 200]); - $transactionTypes = $this->StateErrors->TransactionTypes->find('list', ['limit' => 200]); - $this->set(compact('stateError', 'stateUsers', 'transactionTypes')); - } - - /** - * Delete method - * - * @param string|null $id State Error id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateError = $this->StateErrors->get($id); - if ($this->StateErrors->delete($stateError)) { - $this->Flash->success(__('The state error has been deleted.')); - } else { - $this->Flash->error(__('The state error could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateGroupAddressesController.php b/community_server/src/Controller/StateGroupAddressesController.php deleted file mode 100644 index 25afc82c7..000000000 --- a/community_server/src/Controller/StateGroupAddressesController.php +++ /dev/null @@ -1,113 +0,0 @@ -paginate = [ - 'contain' => ['AddressTypes'], - ]; - $stateGroupAddresses = $this->paginate($this->StateGroupAddresses); - - $this->set(compact('stateGroupAddresses')); - } - - /** - * View method - * - * @param string|null $id State Group Address id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateGroupAddress = $this->StateGroupAddresses->get($id, [ - 'contain' => ['StateGroups', 'AddressTypes'], - ]); - - $this->set('stateGroupAddress', $stateGroupAddress); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateGroupAddress = $this->StateGroupAddresses->newEntity(); - if ($this->request->is('post')) { - $stateGroupAddress = $this->StateGroupAddresses->patchEntity($stateGroupAddress, $this->request->getData()); - if ($this->StateGroupAddresses->save($stateGroupAddress)) { - $this->Flash->success(__('The state group address has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state group address could not be saved. Please, try again.')); - } - $stateGroups = $this->StateGroupAddresses->StateGroups->find('list', ['limit' => 200]); - $addressTypes = $this->StateGroupAddresses->AddressTypes->find('list', ['limit' => 200]); - $this->set(compact('stateGroupAddress', 'stateGroups', 'addressTypes')); - } - - /** - * Edit method - * - * @param string|null $id State Group Address id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateGroupAddress = $this->StateGroupAddresses->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateGroupAddress = $this->StateGroupAddresses->patchEntity($stateGroupAddress, $this->request->getData()); - if ($this->StateGroupAddresses->save($stateGroupAddress)) { - $this->Flash->success(__('The state group address has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state group address could not be saved. Please, try again.')); - } - $stateGroups = $this->StateGroupAddresses->StateGroups->find('list', ['limit' => 200]); - $addressTypes = $this->StateGroupAddresses->AddressTypes->find('list', ['limit' => 200]); - $this->set(compact('stateGroupAddress', 'stateGroups', 'addressTypes')); - } - - /** - * Delete method - * - * @param string|null $id State Group Address id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateGroupAddress = $this->StateGroupAddresses->get($id); - if ($this->StateGroupAddresses->delete($stateGroupAddress)) { - $this->Flash->success(__('The state group address has been deleted.')); - } else { - $this->Flash->error(__('The state group address could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateGroupRelationshipsController.php b/community_server/src/Controller/StateGroupRelationshipsController.php deleted file mode 100644 index 631ca13d1..000000000 --- a/community_server/src/Controller/StateGroupRelationshipsController.php +++ /dev/null @@ -1,115 +0,0 @@ -paginate = [ - 'contain' => ['StateGroup1s', 'StateGroup2s', 'StateRelationships'] - ]; - $stateGroupRelationships = $this->paginate($this->StateGroupRelationships); - - $this->set(compact('stateGroupRelationships')); - } - - /** - * View method - * - * @param string|null $id State Group Relationship id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateGroupRelationship = $this->StateGroupRelationships->get($id, [ - 'contain' => ['StateGroup1s', 'StateGroup2s', 'StateRelationships'] - ]); - - $this->set('stateGroupRelationship', $stateGroupRelationship); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateGroupRelationship = $this->StateGroupRelationships->newEntity(); - if ($this->request->is('post')) { - $stateGroupRelationship = $this->StateGroupRelationships->patchEntity($stateGroupRelationship, $this->request->getData()); - if ($this->StateGroupRelationships->save($stateGroupRelationship)) { - $this->Flash->success(__('The state group relationship has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state group relationship could not be saved. Please, try again.')); - } - $stateGroup1s = $this->StateGroupRelationships->StateGroup1s->find('list', ['limit' => 200]); - $stateGroup2s = $this->StateGroupRelationships->StateGroup2s->find('list', ['limit' => 200]); - $stateRelationships = $this->StateGroupRelationships->StateRelationships->find('list', ['limit' => 200]); - $this->set(compact('stateGroupRelationship', 'stateGroup1s', 'stateGroup2s', 'stateRelationships')); - } - - /** - * Edit method - * - * @param string|null $id State Group Relationship id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateGroupRelationship = $this->StateGroupRelationships->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateGroupRelationship = $this->StateGroupRelationships->patchEntity($stateGroupRelationship, $this->request->getData()); - if ($this->StateGroupRelationships->save($stateGroupRelationship)) { - $this->Flash->success(__('The state group relationship has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state group relationship could not be saved. Please, try again.')); - } - $stateGroup1s = $this->StateGroupRelationships->StateGroup1s->find('list', ['limit' => 200]); - $stateGroup2s = $this->StateGroupRelationships->StateGroup2s->find('list', ['limit' => 200]); - $stateRelationships = $this->StateGroupRelationships->StateRelationships->find('list', ['limit' => 200]); - $this->set(compact('stateGroupRelationship', 'stateGroup1s', 'stateGroup2s', 'stateRelationships')); - } - - /** - * Delete method - * - * @param string|null $id State Group Relationship id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateGroupRelationship = $this->StateGroupRelationships->get($id); - if ($this->StateGroupRelationships->delete($stateGroupRelationship)) { - $this->Flash->success(__('The state group relationship has been deleted.')); - } else { - $this->Flash->error(__('The state group relationship could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateGroupsController.php b/community_server/src/Controller/StateGroupsController.php deleted file mode 100644 index 36969671d..000000000 --- a/community_server/src/Controller/StateGroupsController.php +++ /dev/null @@ -1,111 +0,0 @@ -paginate = [ - 'contain' => ['Indices'] - ]; - $stateGroups = $this->paginate($this->StateGroups); - - $this->set(compact('stateGroups')); - } - - /** - * View method - * - * @param string|null $id State Group id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateGroup = $this->StateGroups->get($id, [ - 'contain' => ['Indices', 'StateGroupAddresses', 'StateUsers', 'TransactionGroupCreates', 'Transactions'] - ]); - - $this->set('stateGroup', $stateGroup); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateGroup = $this->StateGroups->newEntity(); - if ($this->request->is('post')) { - $stateGroup = $this->StateGroups->patchEntity($stateGroup, $this->request->getData()); - if ($this->StateGroups->save($stateGroup)) { - $this->Flash->success(__('The state group has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state group could not be saved. Please, try again.')); - } - $indices = $this->StateGroups->Indices->find('list', ['limit' => 200]); - $this->set(compact('stateGroup', 'indices')); - } - - /** - * Edit method - * - * @param string|null $id State Group id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateGroup = $this->StateGroups->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateGroup = $this->StateGroups->patchEntity($stateGroup, $this->request->getData()); - if ($this->StateGroups->save($stateGroup)) { - $this->Flash->success(__('The state group has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state group could not be saved. Please, try again.')); - } - $indices = $this->StateGroups->Indices->find('list', ['limit' => 200]); - $this->set(compact('stateGroup', 'indices')); - } - - /** - * Delete method - * - * @param string|null $id State Group id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateGroup = $this->StateGroups->get($id); - if ($this->StateGroups->delete($stateGroup)) { - $this->Flash->success(__('The state group has been deleted.')); - } else { - $this->Flash->error(__('The state group could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateRelationshipTypesController.php b/community_server/src/Controller/StateRelationshipTypesController.php deleted file mode 100644 index 954b594e2..000000000 --- a/community_server/src/Controller/StateRelationshipTypesController.php +++ /dev/null @@ -1,106 +0,0 @@ -paginate($this->StateRelationshipTypes); - - $this->set(compact('stateRelationshipTypes')); - } - - /** - * View method - * - * @param string|null $id State Relationship Type id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateRelationshipType = $this->StateRelationshipTypes->get($id, [ - 'contain' => [] - ]); - - $this->set('stateRelationshipType', $stateRelationshipType); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateRelationshipType = $this->StateRelationshipTypes->newEntity(); - if ($this->request->is('post')) { - $stateRelationshipType = $this->StateRelationshipTypes->patchEntity($stateRelationshipType, $this->request->getData()); - if ($this->StateRelationshipTypes->save($stateRelationshipType)) { - $this->Flash->success(__('The state relationship type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state relationship type could not be saved. Please, try again.')); - } - $this->set(compact('stateRelationshipType')); - } - - /** - * Edit method - * - * @param string|null $id State Relationship Type id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateRelationshipType = $this->StateRelationshipTypes->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateRelationshipType = $this->StateRelationshipTypes->patchEntity($stateRelationshipType, $this->request->getData()); - if ($this->StateRelationshipTypes->save($stateRelationshipType)) { - $this->Flash->success(__('The state relationship type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state relationship type could not be saved. Please, try again.')); - } - $this->set(compact('stateRelationshipType')); - } - - /** - * Delete method - * - * @param string|null $id State Relationship Type id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateRelationshipType = $this->StateRelationshipTypes->get($id); - if ($this->StateRelationshipTypes->delete($stateRelationshipType)) { - $this->Flash->success(__('The state relationship type has been deleted.')); - } else { - $this->Flash->error(__('The state relationship type could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateUserRolesController.php b/community_server/src/Controller/StateUserRolesController.php deleted file mode 100644 index 9238c7ad6..000000000 --- a/community_server/src/Controller/StateUserRolesController.php +++ /dev/null @@ -1,185 +0,0 @@ -loadComponent('JsonRequestClient'); - $this->Auth->allow([ -// 'search' - ]); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzer suchen'), 'StateUsers', 'search', true)) - ); - } - - public function search() - { - $this->loadModel('StateUsers'); - $startTime = microtime(true); - I18n::setLocale('de_DE'); - $this->viewBuilder()->setLayout('frontend'); - - $searchForm = new UserSearchForm(); - - $timeUsed = microtime(true) - $startTime; - //$this->set('timeUsed', $timeUsed); - $this->set(compact('timeUsed', 'searchForm')); - - if ($this->request->is('post')) { - $requestData = $this->request->getData(); - - if ($searchForm->validate($requestData)) { - //var_dump($requestData); - $searchString = $requestData['search']; - - // find user on community server db - $globalSearch = '%' . $searchString . '%'; - $communityUsers = $this->StateUsers - ->find('all') - ->contain([]); - - $communityUsers->where(['OR' => [ - 'first_name LIKE' => $globalSearch, - 'last_name LIKE' => $globalSearch, - //'username LIKE' => $globalSearch, - 'email LIKE' => $globalSearch - ]]); - - //var_dump($communityUsers->toArray()); - $finalUserEntrys = []; - // detect states - $this->loadModel('Roles'); -// foreach ($pubkeySorted as $pubhex => $user) { - foreach($communityUsers as $communityUser) { - $finalUser = $communityUser; - $finalUser['pubkeyhex'] = bin2hex(stream_get_contents($communityUser->public_key)); - - $state_user_id = $communityUser->id; - $stateUserRole = $this->StateUserRoles->find('all')->where(['state_user_id' => $state_user_id])->all(); - - $role_ids = ""; - foreach ($stateUserRole as $userRole) { - if($role_ids != "") - $role_ids .= ",".$userRole->role_id; - else - $role_ids = $userRole->role_id; - } - - $roles = $this->Roles->find('all')->where(['id IN' => explode(",",$role_ids)])->all(); - - $role_names = ""; - foreach($roles as $role) - { - if($role_names != "") - $role_names .= "
    ".$role->title; - else - $role_names = $role->title; - } - - $finalUser['role_name'] = $role_names; - - array_push($finalUserEntrys, $finalUser); - } - - //var_dump($pubkeySorted); - } else { - $this->Flash->error(__('Something was invalid, please try again!')); - } - $this->set('finalUserEntrys', $finalUserEntrys); - } - $timeUsed = microtime(true) - $startTime; - $this->set('timeUsed', $timeUsed); - } - - public function assignRole() - { - $this->loadModel('Roles'); - $this->loadModel('StateUsers'); - - if ($this->request->is('post')) { - $requestData = $this->request->getData(); - - $public_hex = hex2bin($requestData['public_hex']); - - $stateUser = $this->StateUsers->find('all')->where(['public_key' => $public_hex])->first(); - - foreach($requestData['role_id'] as $role_id) - { - $newStateUserRole = $this->StateUserRoles->newEntity(); - - $post_data = []; - $post_data['state_user_id'] = $stateUser->id; - $post_data['role_id'] = $role_id; - $this->StateUserRoles->patchEntity($newStateUserRole, $post_data); - $this->StateUserRoles->save($newStateUserRole); - - } - - $this->Flash->success(__('Role has been assigned to User.')); - - return $this->redirect(['controller' => 'state-user-roles', 'action' => 'search']); - - } - - $assignRoleForm = new AssignRoleForm(); - - $public_hex = $this->request->getParam('pass')[0]; - - $publichex = hex2bin($public_hex); - - $stateUser = $this->StateUsers->find('all')->where(['public_key' => $publichex])->first(); - - $stateUserRoles = $this->StateUserRoles->find('all')->where(['state_user_id' => $stateUser->id])->all(); - - $role_ids = ""; - foreach ($stateUserRoles as $userRole) { - if($role_ids != "") - $role_ids .= ",".$userRole->role_id; - else - $role_ids = $userRole->role_id; - } - - $role_ids = explode(",", $role_ids); - - $roles = $this->Roles->find('list', array('fields' => array('id', 'title'))); - - - $this->set('roles', $roles); - $this->set('stateUser', $stateUser); - $this->set('role_ids', $role_ids); - $this->set('assignRoleForm', $assignRoleForm); - $this->set('public_hex', $public_hex); - } - -} diff --git a/community_server/src/Controller/StateUserTransactionsController.php b/community_server/src/Controller/StateUserTransactionsController.php deleted file mode 100644 index f816192f3..000000000 --- a/community_server/src/Controller/StateUserTransactionsController.php +++ /dev/null @@ -1,291 +0,0 @@ -Auth->allow(['add', 'edit']); - $this->Auth->allow(['ajaxListTransactions']); - //$this->loadComponent('JsonRequestClient'); - } - - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['StateUsers', 'Transactions', 'TransactionTypes'], - ]; - $stateUserTransactions = $this->paginate($this->StateUserTransactions); - - $this->set(compact('stateUserTransactions')); - } - - public function sortTransactions($a, $b) - { - if ($a['date'] == $b['date']) { - return 0; - } - return ($a['date'] > $b['date']) ? -1 : 1; - } - - - public function ajaxListTransactions($page = 1, $count = 20) - { - $startTime = microtime(true); - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - if(!$user) { - return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'exist a valid session cookie?']); - } - - $paged_state_user_transactions = $this->StateUserTransactions - ->find('all') - ->where(['state_user_id' => $user['id'], 'transaction_type_id IN' => [1,2]]) - ->limit($count) - ->page($page) - ->order(['transaction_id']) - ; - $all_user_transactions_count = $this->StateUserTransactions - ->find('all') - ->where(['state_user_id' => $user['id'], 'transaction_type_id IN' => [1,2]]) - ->count() - ; - $creationTransaction_ids = []; - $transferTransaction_ids = []; - $allTransaction_ids = []; - foreach($paged_state_user_transactions as $state_user_transaction) { - $allTransaction_ids[] = $state_user_transaction->transaction_id; - switch($state_user_transaction->transaction_type_id) { - case 1: $creationTransaction_ids[] = $state_user_transaction->transaction_id; break; - case 2: $transferTransaction_ids[] = $state_user_transaction->transaction_id; break; - } - } - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - $transactionCreationsTable = TableRegistry::getTableLocator()->get('TransactionCreations'); - $transactionSendCoinsTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - if(count($allTransaction_ids) > 0) { - $transactionEntries = $transactionsTable->find('all')->where(['id IN' => $allTransaction_ids])->order(['id'])->toArray(); - } - if(count($creationTransaction_ids) > 0) { - $transactionCreations = $transactionCreationsTable->find('all')->where(['transaction_id IN' => $creationTransaction_ids]); - } - if(count($transferTransaction_ids)) { - $transactionTransfers = $transactionSendCoinsTable->find('all')->where(['transaction_id IN' => $transferTransaction_ids]); - } - //var_dump($transactions->all()); - - $transactions = []; - // creations - if(isset($transactionCreations)) { - foreach ($transactionCreations as $creation) { - //var_dump($creation); - $transaction_entries_index = array_search($creation->transaction_id, $allTransaction_ids); - if(FALSE === $transaction_entries_index) { - return $this->returnJson(['state' => 'error', 'msg' => 'code error', 'details' => 'creation, transaction_entries_index is FALSE, shouldn\'t occure']); - } - $transaction = $transactionEntries[$transaction_entries_index]; - array_push($transactions, [ - 'name' => 'Gradido Akademie', - 'type' => 'creation', - 'transaction_id' => $creation->transaction_id, - 'date' => $transaction->received, - 'balance' => $creation->amount, - 'memo' => $transaction->memo - ]); - } - } - - // involved users - if(isset($transactionTransfers)) { - $involvedUserIds = []; - - foreach ($transactionTransfers as $transfer) { - //var_dump($sendCoins); - if ($transfer->state_user_id != $user['id']) { - array_push($involvedUserIds, intval($transfer->state_user_id)); - } elseif ($transfer->receiver_user_id != $user['id']) { - array_push($involvedUserIds, intval($transfer->receiver_user_id)); - } - } - - // exchange key with values and drop duplicates - $involvedUser_temp = array_flip($involvedUserIds); - // exchange back - $involvedUserIds = array_flip($involvedUser_temp); - - $involvedUser = $stateUsersTable->find('all', [ - 'contain' => false, - 'where' => ['id IN' => $involvedUserIds], - 'fields' => ['id', 'first_name', 'last_name', 'email'] - ]); - //var_dump($involvedUser->toArray()); - $involvedUserIndices = []; - foreach ($involvedUser as $involvedUser) { - $involvedUserIndices[$involvedUser->id] = $involvedUser; - } - - // transfers - send coins - foreach($transactionTransfers as $transfer) - { - $transaction_entries_index = array_search($transfer->transaction_id, $allTransaction_ids); - if(FALSE === $transaction_entries_index) { - - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'code error', - 'details' => 'transfer, transaction_entries_index is FALSE, shouldn\'t occure', - 'data' => ['haystack' => $allTransaction_ids, 'needle' => $transfer->transaction_id] - ]); - } - $transaction = $transactionEntries[$transaction_entries_index]; - $type = ''; - $otherUser = null; - $other_user_public = ''; - - if ($transfer->state_user_id == $user['id']) { - $type = 'send'; - - if(isset($involvedUserIndices[$transfer->receiver_user_id])) { - $otherUser = $involvedUserIndices[$transfer->receiver_user_id]; - } - $other_user_public = bin2hex(stream_get_contents($transfer->receiver_public_key)); - } else if ($transfer->receiver_user_id == $user['id']) { - $type = 'receive'; - if(isset($involvedUserIndices[$transfer->state_user_id])) { - $otherUser = $involvedUserIndices[$transfer->state_user_id]; - } - if($transfer->sender_public_key) { - $other_user_public = bin2hex(stream_get_contents($transfer->sender_public_key)); - } - } - if(null == $otherUser) { - $otherUser = $stateUsersTable->newEntity(); - } - array_push($transactions, [ - 'name' => $otherUser->first_name . ' ' . $otherUser->last_name, - 'email' => $otherUser->email, - 'type' => $type, - 'transaction_id' => $transfer->transaction_id, - 'date' => $transaction->received, - 'balance' => $transfer->amount, - 'memo' => $transaction->memo, - 'pubkey' => $other_user_public - ]); - //*/ - - } - } - uasort($transactions, array($this, 'sortTransactions')); - - return $this->returnJson([ - 'state' => 'success', - 'transactions' => $transactions, - 'transactionExecutingCount' => $session->read('Transactions.executing'), - 'count' => $all_user_transactions_count, - 'timeUsed' => microtime(true) - $startTime - ]); - } - - /** - * View method - * - * @param string|null $id State User Transaction id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateUserTransaction = $this->StateUserTransactions->get($id, [ - 'contain' => ['StateUsers', 'Transactions', 'TransactionTypes'], - ]); - - $this->set('stateUserTransaction', $stateUserTransaction); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateUserTransaction = $this->StateUserTransactions->newEntity(); - if ($this->request->is('post')) { - $stateUserTransaction = $this->StateUserTransactions->patchEntity($stateUserTransaction, $this->request->getData()); - if ($this->StateUserTransactions->save($stateUserTransaction)) { - $this->Flash->success(__('The state user transaction has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state user transaction could not be saved. Please, try again.')); - } - $stateUsers = $this->StateUserTransactions->StateUsers->find('list', ['limit' => 200]); - $transactions = $this->StateUserTransactions->Transactions->find('list', ['limit' => 200]); - $transactionTypes = $this->StateUserTransactions->TransactionTypes->find('list', ['limit' => 200]); - $this->set(compact('stateUserTransaction', 'stateUsers', 'transactions', 'transactionTypes')); - } - - /** - * Edit method - * - * @param string|null $id State User Transaction id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateUserTransaction = $this->StateUserTransactions->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateUserTransaction = $this->StateUserTransactions->patchEntity($stateUserTransaction, $this->request->getData()); - if ($this->StateUserTransactions->save($stateUserTransaction)) { - $this->Flash->success(__('The state user transaction has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state user transaction could not be saved. Please, try again.')); - } - $stateUsers = $this->StateUserTransactions->StateUsers->find('list', ['limit' => 200]); - $transactions = $this->StateUserTransactions->Transactions->find('list', ['limit' => 200]); - $transactionTypes = $this->StateUserTransactions->TransactionTypes->find('list', ['limit' => 200]); - $this->set(compact('stateUserTransaction', 'stateUsers', 'transactions', 'transactionTypes')); - } - - /** - * Delete method - * - * @param string|null $id State User Transaction id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateUserTransaction = $this->StateUserTransactions->get($id); - if ($this->StateUserTransactions->delete($stateUserTransaction)) { - $this->Flash->success(__('The state user transaction has been deleted.')); - } else { - $this->Flash->error(__('The state user transaction could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/StateUsersController.php b/community_server/src/Controller/StateUsersController.php deleted file mode 100644 index fc6ec8614..000000000 --- a/community_server/src/Controller/StateUsersController.php +++ /dev/null @@ -1,616 +0,0 @@ -loadComponent('GradidoNumber'); - $this->loadComponent('JsonRequestClient'); - $this->loadComponent('Cookie'); - $this->Auth->allow([ - 'search', 'ajaxCopyLoginToCommunity', 'ajaxCopyCommunityToLogin', - 'ajaxDelete', 'ajaxCountTransactions', 'ajaxVerificationEmailResend', - 'ajaxGetUserEmailVerificationCode', 'ajaxGetCSFRToken', 'login' - ]); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzer suchen'), 'StateUsers', 'search', true)) - ); - } - - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => [] - ]; - $stateUsers = $this->paginate($this->StateUsers); - - $this->set(compact('stateUsers')); - } - - /*public function listIdentHashes() - { - $stateUsers = $this->StateUsers->find('all')->toArray(); - foreach($stateUsers as $i => $user) { - $stateUsers[$i]->identHash = TransactionCreation::DRMakeStringHash($user->email); - } - $this->set('stateUsers', $stateUsers); - }*/ - - public function login($session_id) - { - if(isset($session_id) && intval($session_id) !== 0) { - $loginServer = Configure::read('LoginServer'); - $http = new Client(); - - try { - $url = $loginServer['host'] . ':' . $loginServer['port']; - - $response = $http->get($url . '/login', ['session_id' => $session_id]); - $json = $response->getJson(); - - if (isset($json) && count($json) > 0) { - if ($json['state'] === 'success') { - $this->Cookie->configKey('GRADIDO_LOGIN', 'encryption', false); - $this->Cookie->write('GRADIDO_LOGIN', $session_id); - return $this->redirect(['controller' => 'Dashboard', 'action' => 'index']); - } - } - } catch (\Exception $e) { - $msg = $e->getMessage(); - $this->Flash->error(__('error http request: ') . $msg); - return $this->redirect(['controller' => 'Dashboard', 'action' => 'errorHttpRequest']); - } - } - throw new NotFoundException(); - } - - public function search() - { - $startTime = microtime(true); - I18n::setLocale('de_DE'); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->redirect(['controller' => 'dashboard', 'action' => 'index']); - } - - $searchForm = new UserSearchForm(); - - $timeUsed = microtime(true) - $startTime; - //$this->set('timeUsed', $timeUsed); - $csfr_token = $this->request->getParam('_csrfToken'); - $this->set(compact('timeUsed', 'searchForm', 'csfr_token')); - $empty_string = '... empty ...'; - if ($this->request->is('post')) { - $finalUserEntrys = []; - $requestData = $this->request->getData(); - $account_state = $requestData['account_state']; - if($requestData['search'] == '' && $account_state != 'all') { - $requestData['search'] = $empty_string; - } - - if($searchForm->validate($requestData)) { - //var_dump($requestData); - $searchString = $requestData['search']; - $searchType = 'unknown'; - if(GenericValidation::email($searchString, [])) { - $searchType = 'email'; - } - // find users on login server - $resultJson = $this->JsonRequestClient->getUsers($session->read('session_id'), $searchString, $account_state); - $loginServerUser = []; - if($resultJson['state'] == 'success') { - $dataJson = $resultJson['data']; - if($dataJson['state'] != 'success') { - if($dataJson['msg'] == 'session not found') { - $session->destroy(); - return $this->redirect(Router::url('/', true) . 'account', 303); - } - } - //var_dump($dataJson); - if(isset($dataJson['users'])) { - $loginServerUser = $dataJson['users']; - } - } - $pubkeySorted = []; - $emptyPubkeys = []; - foreach($loginServerUser as $u) { - if(!isset($u['public_hex']) || $u['public_hex'] == '') { - array_push($emptyPubkeys, $u); - } else { - if(!isset($pubkeySorted[$u['public_hex']])) { - $pubkeySorted[$u['public_hex']] = ['login' => [], 'community' => []]; - } - array_push($pubkeySorted[$u['public_hex']]['login'], $u); - } - } - // find user on community server db - - - - $communityUsers = $this->StateUsers - ->find('all') - ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]]); - - if($account_state == 'email not activated') { - if(count($pubkeySorted) > 0) { - $communityUsers->where(['hex(public_key) IN' => array_keys($pubkeySorted)]); - } else { - $communityUsers = null; - } - } else { - $globalSearch = '%' . $searchString . '%'; - $communityUsers->where(['OR' => [ - 'first_name LIKE' => $globalSearch, - 'last_name LIKE' => $globalSearch, - 'email LIKE' => $globalSearch - ]]); - } - - - //var_dump($communityUsers->toArray()); - if($communityUsers) { - foreach($communityUsers as $u) { - $pubkey_hex = bin2hex(stream_get_contents($u->public_key)); - $u->public_hex = $pubkey_hex; - if(!isset($pubkeySorted[$pubkey_hex])) { - $pubkeySorted[$pubkey_hex] = ['login' => [], 'community' => []]; - } - array_push($pubkeySorted[$pubkey_hex]['community'], $u); - } - } - - // detect states - foreach($pubkeySorted as $pubhex => $user) { - $finalUser = []; - $state = 'account created'; - $color = 'secondary'; - $finalUser['balance'] = 0; - $finalUser['pubkeyhex'] = $pubhex; - $finalUser['created'] = null; - - if(count($user['community']) == 1) { - if(isset($user['community'][0]->state_balances) && - isset($user['community'][0]->state_balances[0]['amount'])) { - $finalUser['balance'] = $user['community'][0]->state_balances[0]->amount; - } - } - - if(count($user['login']) == 0) { - $state = 'account not on login-server'; - $color = 'danger'; - if(count($user['community']) == 1) { - $c_user = $user['community'][0]; - $finalUser['name'] = $c_user->first_name . ' ' . $c_user->last_name; - $finalUser['first_name'] = $c_user->first_name; - $finalUser['last_name'] = $c_user->last_name; - $finalUser['email'] = $c_user->email; - } - } else if(count($user['login']) == 1) { - if($user['login'][0]['email_checked'] == true) { - $state = 'email activated'; - $color = 'primary'; - - if(count($user['community']) == 1) { - $state = 'account copied to community'; - $color = 'success'; - //var_dump($user['community'][0]->state_balances[0]['amount']); - } - - } else { - $state = 'email not activated'; - $color = 'warning'; - } - - $l_user = $user['login'][0]; - $finalUser['name'] = $l_user['first_name'] . ' ' . $l_user['last_name']; - $finalUser['first_name'] = $l_user['first_name']; - $finalUser['last_name'] = $l_user['last_name']; - $finalUser['email'] = $l_user['email']; - $finalUser['created'] = new FrozenTime($l_user['created']); - - } else { - $state = 'account multiple times on login-server'; - $color = 'danger'; - } - $finalUser['indicator'] = ['name' => $state, 'color' => $color]; - array_push($finalUserEntrys, $finalUser); - } - - foreach($emptyPubkeys as $user) { - $finalUser = []; - $state = 'account not on community server'; - $color = 'secondary'; - if($user['email_checked'] == false) { - $state = 'email not activated'; - $color = 'warning'; - } else { - $state = 'no keys'; - $color = 'warning'; - } - $finalUser['balance'] = 0; - $finalUser['pubkeyhex'] = ''; - $finalUser['name'] = $user['first_name'] . ' ' . $user['last_name']; - $finalUser['first_name'] = $user['first_name']; - $finalUser['last_name'] = $user['last_name']; - $finalUser['email'] = $user['email']; - $finalUser['created'] = new FrozenTime($user['created']); - $finalUser['indicator'] = ['name' => $state, 'color' => $color]; - array_push($finalUserEntrys, $finalUser); - } - //var_dump($pubkeySorted); - } else { - $this->Flash->error(__('Something was invalid, please try again!')); - } - - $this->set('finalUserEntrys', $finalUserEntrys); - } - $timeUsed = microtime(true) - $startTime; - $this->set('timeUsed', $timeUsed); - } - - public function ajaxCopyCommunityToLogin() - { - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); - } - if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode', true); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - public function ajaxCopyLoginToCommunity() - { - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); - } - - if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode', true); - //$user = $jsonData['user']; - //var_dump($jsonData); - - $newStateUser = $this->StateUsers->newEntity(); - $this->StateUsers->patchEntity($newStateUser, $jsonData); - $newStateUser->public_key = hex2bin($jsonData['pubkeyhex']); - - if(!$this->StateUsers->save($newStateUser)) { - return $this->returnJson(['state' => 'error', 'msg' => 'error by saving', 'details' => json_encode($newStateUser->errors())]); - } - - return $this->returnJson(['state' => 'success']); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - public function ajaxVerificationEmailResend() - { - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); - } - if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode', true); - $email = $jsonData['email']; - $session_id = $session->read('session_id'); - - return $this->returnJson($this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session_id, - 'email' => $email - ]), '/adminEmailVerificationResend')); - /*return $this->sendRequest(json_encode([ - 'session_id' => $session_id, - 'search' => $searchString - ]), '/getUsers');*/ - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - public function ajaxGetUserEmailVerificationCode() - { - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); - } - if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode', true); - $email = $jsonData['email']; - $session_id = $session->read('session_id'); - - return $this->returnJson($this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session_id, - 'email' => $email, - 'ask' => ['EmailVerificationCode.Register', 'loginServer.path'] - ]), '/getUserInfos')); - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - - public function ajaxDelete() - { - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); - } - - if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode', true); - //$user = $jsonData['user']; - //var_dump($jsonData); - $pubkey = hex2bin($jsonData['pubkeyhex']); - $stateUsers = $this->StateUsers->find('all')->where(['public_key' => $pubkey]); - if($stateUsers->count() != 1) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']); - } - - if ($this->StateUsers->delete($stateUsers->first())) { - return $this->returnJson(['state' => 'success']); - } else { - return $this->returnJson(['state' => 'error', 'msg' => 'error by deleting', 'details' => json_encode($stateUser->errors())]); - } - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - public function ajaxCountTransactions() - { - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - if($result !== true) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']); - } - $user = $session->read('StateUser'); - if($user['role'] != 'admin') { - return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']); - } - - if($this->request->is('post')) { - $jsonData = $this->request->input('json_decode', true); - //$user = $jsonData['user']; - //var_dump($jsonData); - $pubkey = hex2bin($jsonData['pubkeyhex']); - $stateUsers = $this->StateUsers - ->find('all') - ->where(['public_key' => $pubkey]) - ->select(['id']); - if($stateUsers->count() != 1) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']); - } - $stateUser = $stateUsers->first(); - //var_dump($stateUser); - //var_dump($stateUser->toArray()); - $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations'); - $creationTransactions = $creationsTable - ->find('all') - ->select(['id']) - ->where(['state_user_id' => $stateUser->id]); - - $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); - $transferTransactions = $transferTable - ->find('all') - ->where(['OR' => ['state_user_id' => $stateUser->id, 'receiver_user_id' => $stateUser->id]]) - ->select(['state_user_id', 'receiver_user_id']); - $counts = ['creation' => $creationTransactions->count(), 'receive' => 0, 'sended' => 0]; - foreach($transferTransactions as $transfer) { - //var_dump($transfer); - if($transfer->state_user_id == $stateUser->id) { - $counts['sended']++; - } - if($transfer->receiver_user_id == $stateUser->id) { - $counts['receive']++; - } - } - return $this->returnJson(['state' => 'success', 'counts' => $counts]); - - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - - } - - public function ajaxGetCSFRToken($session_id) - { - if(!isset($session_id) || $session_id == 0) { - $this->returnJson(['state' => 'error', 'msg' => 'no session id']); - } - - $client_ip = $this->request->clientIp(); - - $loginServer = Configure::read('LoginServer'); - $url = $loginServer['host'] . ':' . $loginServer['port']; - - $http = new Client(); - $response = $http->get($url . '/login', ['session_id' => $session_id]); - $json = $response->getJson(); - - if (isset($json) && count($json) > 0) { - if ($json['state'] === 'success') { - if($json['clientIP'] == $client_ip) { - return $this->returnJson(['state' => 'success', 'csfr' => $this->request->getParam('_csrfToken')]); - } else { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'client ip mismatch', - 'details' => ['login_server' => $json['clientIP'], 'caller' => $client_ip]]); - } - } else { - return $this->returnJson($json); - } - } else { - return $this->returnJson(['state' => 'error', 'invalid response form logins server']); - } - - } - /* - - getField(vnode, 'receive'), - - getField(vnode, 'sended'), - - getField(vnode, 'creation'), - */ - - /** - * View method - * - * @param string|null $id State User id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $stateUser = $this->StateUsers->get($id, [ - 'contain' => [ - 'StateBalances', - 'TransactionCreations' => ['Transactions'], - 'TransactionSendCoins' => ['Transactions', 'ReceiverUsers'], - 'TransactionReceivedCoins' => ['Transactions', 'StateUsers']] - ]); - - $this->set('stateUser', $stateUser); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $stateUser = $this->StateUsers->newEntity(); - if ($this->request->is('post')) { - $stateUser = $this->StateUsers->patchEntity($stateUser, $this->request->getData()); - if ($this->StateUsers->save($stateUser)) { - $this->Flash->success(__('The state user has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state user could not be saved. Please, try again.')); - } - $indices = $this->StateUsers->Indices->find('list', ['limit' => 200]); - $stateGroups = $this->StateUsers->StateGroups->find('list', ['limit' => 200]); - $this->set(compact('stateUser', 'indices', 'stateGroups')); - } - - /** - * Edit method - * - * @param string|null $id State User id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $stateUser = $this->StateUsers->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $stateUser = $this->StateUsers->patchEntity($stateUser, $this->request->getData()); - if ($this->StateUsers->save($stateUser)) { - $this->Flash->success(__('The state user has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The state user could not be saved. Please, try again.')); - } - $indices = $this->StateUsers->Indices->find('list', ['limit' => 200]); - $stateGroups = $this->StateUsers->StateGroups->find('list', ['limit' => 200]); - $this->set(compact('stateUser', 'indices', 'stateGroups')); - } - - /** - * Delete method - * - * @param string|null $id State User id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $stateUser = $this->StateUsers->get($id); - if ($this->StateUsers->delete($stateUser)) { - $this->Flash->success(__('The state user has been deleted.')); - } else { - $this->Flash->error(__('The state user could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionCreationsController.php b/community_server/src/Controller/TransactionCreationsController.php deleted file mode 100644 index d02320d25..000000000 --- a/community_server/src/Controller/TransactionCreationsController.php +++ /dev/null @@ -1,681 +0,0 @@ -loadComponent('GradidoNumber'); - $this->loadComponent('JsonRequestClient'); - //$this->Auth->allow(['add', 'edit']); - //$this->Auth->allow('create'); - $this->Auth->allow('ajaxCreate'); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Gradido schöpfen'), 'TransactionCreations', 'create-multi', true)) - ); - } - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['Transactions', 'StateUsers'] - ]; - $transactionCreations = $this->paginate($this->TransactionCreations); - $identHashes = []; - /*foreach ($transactionCreations as $creation) { - $identHash = TransactionCreation::DRMakeStringHash($creation->state_user->email); - $identHashes[$creation->state_user->id] = $identHash; - }*/ - - //$this->set(compact('transactionCreations', 'identHashes')); - } - - /** - * View method - * - * @param string|null $id Transaction Creation id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionCreation = $this->TransactionCreations->get($id, [ - 'contain' => ['Transactions', 'StateUsers'] - ]); - - $this->set('transactionCreation', $transactionCreation); - } - - public function create() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - if (!$user) { - $result = $this->requestLogin(); - if ($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - } - $creationForm = new CreationForm(); - $transactionCreation = $this->TransactionCreations->newEntity(); - $transactionCreation->state_user_id = $user['id']; - - // adding possible addresses + input field for copy - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $stateUsers = $stateUserTable->find('all')->contain(false); - $receiverProposal = []; - foreach ($stateUsers as $stateUser) { - $name = $stateUser->email; - $keyHex = bin2hex(stream_get_contents($stateUser->public_key)); - if ($name === null) { - $name = $stateUser->first_name . ' ' . $stateUser->last_name; - } - array_push($receiverProposal, ['name' => $name, 'key' => $keyHex, 'email' => $stateUser->email]); - //$stateUser->public_key - } - $timeUsed = microtime(true) - $startTime; - $this->set(compact('transactionCreation', 'timeUsed', 'receiverProposal', 'creationForm')); - - if ($this->request->is('post')) { - $requestData = $this->request->getData(); - $mode = 'next'; - if (isset($requestData['add'])) { - $mode = 'add'; - } - if ($creationForm->validate($requestData)) { - $pubKeyHex = ''; - $identHash = ''; - $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); - $receiverIndex = intval($requestData['receiver'])-1; - - if (count($receiverProposal) > $receiverIndex) { - $pubKeyHex = $receiverProposal[$receiverIndex]['key']; - //$identHash = TransactionCreation::DRMakeStringHash($receiverProposal[$receiverIndex]['email']); - } - $builderResult = TransactionCreation::build( - $amountCent, - $requestData['memo'], - $pubKeyHex - ); - if ($builderResult['state'] == 'success') { - $user_balance = 0; - if (isset($user['balance'])) { - $user_balance = $user['balance']; - } - // $session_id, $base64Message, $user_balance = 0 - $requestResult = $this->JsonRequestClient->sendTransaction( - $session->read('session_id'), - base64_encode($builderResult['transactionBody']->serializeToString()), - $user_balance - ); - if ($requestResult['state'] != 'success') { - $this->addAdminError('TransactionCreations', 'create', $requestResult, $user['id']); - if ($requestResult['type'] == 'request error') { - $this->Flash->error(__('Error by requesting LoginServer, please try again')); - } else { - $this->Flash->error(__('Error, please wait for the admin to fix it')); - } - } else { - $json = $requestResult['data']; - if ($json['state'] != 'success') { - if ($json['msg'] == 'session not found') { - $session->destroy(); - return $this->redirect($this->loginServerUrl . 'account', 303); - } else { - $this->addAdminError('TransactionCreations', 'create', $json, $user['id']); - $this->Flash->error(__('Login Server Error, please wait for the admin to fix it')); - } - } else { - $pendingTransactionCount = $session->read('Transactions.pending'); - if ($pendingTransactionCount == null) { - $pendingTransactionCount = 1; - } else { - $pendingTransactionCount++; - } - $session->write('Transactions.pending', $pendingTransactionCount); - if ($mode === 'next') { - return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303); - } else { - $this->Flash->success(__('Transaction submitted for review.')); - } - } - } - } else { - $this->Flash->error(__('Building transaction failed')); - } - // */ - } else { - $this->Flash->error(__('Something was invalid, please try again!')); - } - } - } - - public function createMulti($page = 0) - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $result = $this->requestLogin(); - $limit = 200; - if ($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - - $connection = ConnectionManager::get('default'); - $transactionActiveMonth = $connection->execute( - 'SELECT id, received FROM transactions ' - . 'where received >= date_sub(date_add(curdate(), interval 1 - day(curdate()) day), interval 2 month) ' - . 'AND ' - . 'received < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 2 month) ' - . 'AND ' - . 'transaction_type_id = 1' - )->fetchAll('assoc'); - $transactionActiveMonthSortedById = []; - foreach ($transactionActiveMonth as $t) { - $transactionActiveMonthSortedById[$t['id']] = $t['received']; - } - $firstDayLastMonth = new FrozenDate(); - $firstDayLastMonth = $firstDayLastMonth->day(1)->subMonth(1); - $transactionsLastMonthTargeDate = $this->TransactionCreations - ->find('all') - //->select(['state_user_id', 'target_date', 'amount']) - ->where(['EXTRACT(YEAR_MONTH FROM target_date) LIKE' => $firstDayLastMonth->format('Ym')]) - ->group(['state_user_id']) - ->contain([]); - $transactionsLastMonthTargeDate->select([ - 'state_user_id', - 'sum_amount' => $transactionsLastMonthTargeDate->func()->sum('amount') - ]); - - $transactionsLastMonthTargetDateSortedByStateUserId = []; - foreach ($transactionsLastMonthTargeDate as $transactionCreation) { - $transactionsLastMonthTargetDateSortedByStateUserId[$transactionCreation->state_user_id] = $transactionCreation->sum_amount; - } - - $requestData = $this->request->getData(); - if ($this->request->is('post') && - isset($requestData['searchButton']) && - isset($requestData['searchText']) && - !empty($requestData['searchText']) - ) { - $mode = 'search'; - $page = 0; - $this->log("search for text: ".$requestData['searchText'], 'debug'); - $stateUsers = $stateUserTable - ->find('all') - ->select(['id', 'first_name', 'last_name', 'email']) - ->order(['first_name', 'last_name']) - ->where( - ['AND' => [ - 'disabled' => 0, - 'OR' => [ - 'LOWER(first_name) LIKE' => '%'.strtolower($requestData['searchText']).'%', - 'LOWER(last_name) LIKE' => '%'.strtolower($requestData['searchText']).'%', - 'LOWER(email) LIKE' => '%'.strtolower($requestData['searchText']).'%' - ] - ] - ] - ) - ->contain(['TransactionCreations' => [ - 'fields' => [ - 'TransactionCreations.amount', - 'TransactionCreations.transaction_id', - 'TransactionCreations.state_user_id' - ] - ]]); - $this->log("search query: ".$stateUsers, 'debug'); - } else { - $stateUsers = $stateUserTable - ->find('all') - ->select(['id', 'first_name', 'last_name', 'email']) - //->order(['id']) - ->where(['disabled' => 0]) - ->order(['first_name', 'last_name']) - ->contain(['TransactionCreations' => [ - 'fields' => [ - 'TransactionCreations.amount', - 'TransactionCreations.transaction_id', - 'TransactionCreations.state_user_id' - ] - ]]); - } - - //var_dump($stateUsers->toArray()); - $possibleReceivers = []; - $countUsers = 0; - foreach ($stateUsers as $i => $stateUser) { - $countUsers++; - if ($i < $page * $limit || $i >= ($page + 1) * $limit) { - continue; - } - $sumAmount = 0; - $sumAmount2 = 0; - if (isset($transactionsLastMonthTargetDateSortedByStateUserId[$stateUser->id])) { - $sumAmount2 = $transactionsLastMonthTargetDateSortedByStateUserId[$stateUser->id]; - } - foreach ($stateUser->transaction_creations as $transactionCreation) { - //var_dump($transactionCreation); - if (isset($transactionActiveMonthSortedById[$transactionCreation->transaction_id])) { - $sumAmount += $transactionCreation->amount; - } - } - - //if($sumAmount < 20000000) { - array_push($possibleReceivers, [ - 'name' => $stateUser->first_name . ' ' . $stateUser->last_name, - 'id' => $stateUser->id, - 'email' => $stateUser->email, - 'amount' => $sumAmount, - 'amount2' => $sumAmount2 - ]); - /*} else { - $this->Flash->error(__('Creation above 2.000 GDD for 2 last two month')); - }*/ - } - // usort($possibleReceivers, function ($a, $b) { - // return (strtolower($a['name']) <=> strtolower($b['name'])); - // }); - // -> replaced by SQL "order by" above - $creationForm = new CreationForm(); - - $timeUsed = microtime(true) - $startTime; - $this->set(compact('timeUsed', 'stateUsers', 'creationForm', 'possibleReceivers')); - - $this->set('firstDayLastMonth', $firstDayLastMonth); - $this->set('activeUser', $user); - $this->set('creationForm', $creationForm); - $this->set('transactionExecutingCount', $session->read('Transactions.executing')); - $this->set('timeUsed', microtime(true) - $startTime); - $this->set('countUsers', $countUsers); - $this->set('limit', $limit); - $this->set('page', $page); - - if ($this->request->is('post') && (!isset($mode) || !($mode === 'search'))) { - $this->log("real POST", 'debug'); - $mode = 'next'; - if (isset($requestData['add'])) { - $mode = 'add'; - } - //echo "mode: $mode
    "; - $memo = $requestData['memo']; - $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); - //$targetDate = $requestData['target_date']; - if (!isset($requestData['user']) || count($requestData['user']) == 0) { - $this->Flash->error(__('No user selected')); - } else { - $users = $requestData['user']; - $pendingTransactionCount = $session->read('Transactions.pending'); - if ($pendingTransactionCount == null) { - $pendingTransactionCount = 0; - } - if (isset($requestData['user_pending'])) { - $pendings = $requestData['user_pending']; - } else { - $pendings = []; - } - $receiverUsers = $stateUserTable->find('all') - ->where(['id IN' => array_keys($users)]) - ->select(['public_key', 'email', 'id']) - ->contain(false); - - foreach ($receiverUsers as $receiverUser) { - $localAmountCent = $amountCent; - //$localTargetDate = $targetDate; - $id = $receiverUser->id; - if ($requestData['user_amount'][$id] != '') { - $localAmountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['user_amount'][$id]); - } - if (isset($requestData['user_target_date']) && isset($requestData['user_target_date'][$id])) { - $localTargetDate = $requestData['user_target_date'][$id]; - } - if (isset($pendings[$id])) { - $pendings[$id] += $localAmountCent; - } else { - $pendings[$id] = $localAmountCent; - } - $pubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key)); - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session->read('session_id'), - 'email' => $receiverUser->email, - 'ask' => ['user.identHash'] - ]), '/getUserInfos'); - - $identHash = 0; - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - $identHash = $requestAnswear['data']['userData']['identHash']; - } else { - $this->Flash->error(__('Error by requesting LoginServer, please try again')); - } - - //$identHash = TransactionCreation::DRMakeStringHash($receiverUser->email); - $localTargetDateFrozen = FrozenDate::now(); - $localTargetDateFrozen = $localTargetDateFrozen - ->year($localTargetDate['year']) - ->month($localTargetDate['month']) - ->day($localTargetDate['day']); - - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session->read('session_id'), - 'transaction_type' => 'creation', - 'memo' => $memo, - 'amount' => $localAmountCent, - 'target_pubkey' => $pubKeyHex, - 'target_date' => $localTargetDateFrozen, - 'blockchain_type' => $this->blockchainType - ]), '/createTransaction'); - - if('success' != $requestAnswear['state']) { - $this->addAdminError('TransactionCreations', 'createMulti', $requestAnswear, $user['id']); - if ($requestResult['type'] == 'request error') { - $this->Flash->error(__('Error by requesting LoginServer, please try again')); - } else { - $this->Flash->error(__('Error, please wait for the admin to fix it')); - } - } - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - $pendingTransactionCount++; - //echo "pending transaction count: $pendingTransactionCount
    "; - } else { - /* - * if request contain unknown parameter format, shouldn't happen't at all - * {"state": "error", "msg": "parameter format unknown"} - * if json parsing failed - * {"state": "error", "msg": "json exception", "details":"exception text"} - * if session_id is zero or not set - * {"state": "error", "msg": "session_id invalid"} - * if session id wasn't found on login server, if server was restartet or user logged out (also per timeout, default: 15 minutes) - * {"state": "error", "msg": "session not found"} - * if session hasn't active user, shouldn't happen't at all, login-server should be checked if happen - * {"state": "code error", "msg":"user is zero"} - * if transaction type not known - * {"state": "error", "msg":"transaction_type unknown"} - * if receiver wasn't known to Login-Server - * {"state": "not found", "msg":"receiver not found"} - * if receiver account disabled, and therefor cannto receive any coins - * {"state": "disabled", "msg":"receiver is disabled"} - * if amount is invalid in creation - * {"state": "invalid parameter", "msg":"invalid amount", "details":"GDD amount in GDD cent ]0,10000000]"} - * if transaction was okay and will be further proccessed - * {"state":"success"} - */ - $answear_data = $requestAnswear['data']; - if($answear_data['state'] === 'error') { - if($answear_data['msg'] === 'session_id invalid' || $answear_data['msg'] === 'session not found') { - $this->Flash->error(__('Fehler mit der Session, bitte logge dich erneut ein!')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - if($answear_data['msg'] === 'user not in group') { - $this->Flash->error(__('Fehler, Benutzer gehört zu einer anderen Gruppe!')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - } else if($answear_data['state'] === 'not found' && $answear_data['msg'] === 'receiver not found') { - $this->Flash->error(__('Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } else if($answear_data['state'] === 'disabled') { - $this->Flash->error(__('Der Empfänger ist deaktiviert, daher können ihm zurzeit keine Gradidos gesendet werden.')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } else if($answear_data['msg'] === 'invalid amount') { - $this->Flash->error(__('Der Betrag ist ungültig, er muss größer als 0 und <= 1000 sein.')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } else { - $this->Flash->error(__('Unbehandelter Fehler: ') . json_encode($answear_data)); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - } - - } - /*echo "pendings: "; - var_dump($pendings); - echo "
    ";*/ - foreach ($possibleReceivers as $i => $possibleReceiver) { - $id = $possibleReceiver['id']; - if (isset($pendings[$id])) { - $possibleReceivers[$i]['pending'] = $pendings[$id]; - } - } - $this->set('possibleReceivers', $possibleReceivers); - if ($pendingTransactionCount > 0) { - $user_balance = 0; - if (isset($user['balance'])) { - $user_balance = $user['balance']; - } - $session->write('Transactions.pending', $pendingTransactionCount); - - if ($mode === 'next') { - return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303); - } else { - $this->Flash->success(__('Transaction submitted for review.')); - } - } - } - } - } - - public function ajaxCreate() - { - if ($this->request->is('post')) { - $startTime = microtime(true); - $jsonData = $this->request->input('json_decode', true); - $session_id = $jsonData['session_id']; - if(!isset($jsonData['session_id']) || intval($jsonData['session_id']) == 0) { - return $this->returnJson(['state' => 'parameter missing', 'msg' => 'invalid session id']); - } - - $login_result = $this->requestLogin($session_id, false); - if($login_result !== true) { - return $this->returnJson($login_result); - } - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - - $memo = ''; - if(isset($jsonData['memo'])) { - $memo = $jsonData['memo']; - } - $auto_sign = true; - if(isset($jsonData['auto_sign'])) { - $auto_sign = $jsonData['auto_sign']; - } - if(!isset($jsonData['amount']) || intval($jsonData['amount']) <= 0) { - return $this->returnJson(['state' => 'parameter missing', 'msg' => 'amount not set or <= 0']); - } - if(!isset($jsonData['email'])) { - return $this->returnJson(['state' => 'parameter missing', 'msg' => 'no receiver email set']); - } - $amount = intval($jsonData['amount']); - if($amount > 10000000) { - return $this->returnJson(['state' => 'error', 'msg' => 'amount is to big']); - } - if($amount <= 0) { - return $this->returnJson(['state' => 'error', 'msg' => 'amount must be > 0']); - } - if(!isset($jsonData['target_date'])) { - return $this->returnJson(['state' => 'parameter missing', 'msg' => 'target_date not found']); - } - //$targetDate = $requestData['target_date']; - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session_id, - 'email' => $jsonData['email'], - 'ask' => ['user.pubkeyhex', 'user.disabled', 'user.identHash'] - ]), '/getUserInfos'); - $receiverPubKeyHex = ''; - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - // will be allways 64 byte long, even if it is empty - $receiverPubKeyHex = $requestAnswear['data']['userData']['pubkeyhex']; - } else { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'receiver email not found on login-server', - 'details' => $requestAnswear, - 'timeUsed' => microtime(true) - $startTime - ]); - } - if($requestAnswear['data']['userData']['disabled']) { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'receiver is currently disabled, he cannot receive creations', - 'timeUsed' => microtime(true) - $startTime - ]); - } - - $builderResult = TransactionCreation::build( - $amount, - $memo, - $receiverPubKeyHex, - new FrozenDate($jsonData['target_date']) - ); - $transaction_base64 = ''; - if ($builderResult['state'] == 'success') { - // todo: maybe use sodium base 64 encoder to make sure it can be readed from login-server - $transaction_base64 = base64_encode($builderResult['transactionBody']->serializeToString()); - } - - $requestResult = $this->JsonRequestClient->sendTransaction( - $session_id, - $transaction_base64, - $user['balance'], - $auto_sign, - $this->blockchainType - ); - if ($requestResult['state'] != 'success') { - $msg = 'error returned from login server'; - if ($requestResult['type'] === 'request error') { - $msg = 'login server couldn\'t reached'; - } - //$this->Flash->error(__('Error, please wait for the admin to fix it')); - return $this->returnJson([ - 'state' => 'request error', - 'msg' => $msg, - 'details' => $requestResult, - 'timeUsed' => microtime(true) - $startTime - ]); - } else { - $json = $requestResult['data']; - if ($json['state'] != 'success') { - if ($json['msg'] == 'session not found') { - $session->destroy(); - return $this->returnJson(['state' => 'error', 'msg' => 'session not found', 'timeUsed' => microtime(true) - $startTime]); - } else { - return $this->returnJson(['state' => 'error', 'msg' => 'login server error', 'details' => $json, 'timeUsed' => microtime(true) - $startTime]); - } - } else { - return $this->returnJson(['state' => 'success', 'timeUsed' => microtime(true) - $startTime]); - } - } - } - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - - $transactionCreation = $this->TransactionCreations->newEntity(); - if ($this->request->is('post')) { - $transactionCreation = $this->TransactionCreations->patchEntity($transactionCreation, $this->request->getData()); - if ($this->TransactionCreations->save($transactionCreation)) { - $this->Flash->success(__('The transaction creation has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction creation could not be saved. Please, try again.')); - } - $transactions = $this->TransactionCreations->Transactions->find('list', ['limit' => 200]); - $stateUsers = $this->TransactionCreations->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('transactionCreation', 'transactions', 'stateUsers')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Creation id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionCreation = $this->TransactionCreations->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionCreation = $this->TransactionCreations->patchEntity($transactionCreation, $this->request->getData()); - if ($this->TransactionCreations->save($transactionCreation)) { - $this->Flash->success(__('The transaction creation has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction creation could not be saved. Please, try again.')); - } - $transactions = $this->TransactionCreations->Transactions->find('list', ['limit' => 200]); - $stateUsers = $this->TransactionCreations->StateUsers->find('list', ['limit' => 200]); - $this->set(compact('transactionCreation', 'transactions', 'stateUsers')); - } - - /** - * Delete method - * - * @param string|null $id Transaction Creation id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionCreation = $this->TransactionCreations->get($id); - if ($this->TransactionCreations->delete($transactionCreation)) { - $this->Flash->success(__('The transaction creation has been deleted.')); - } else { - $this->Flash->error(__('The transaction creation could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionGroupAddaddressController.php b/community_server/src/Controller/TransactionGroupAddaddressController.php deleted file mode 100644 index fc23c111b..000000000 --- a/community_server/src/Controller/TransactionGroupAddaddressController.php +++ /dev/null @@ -1,113 +0,0 @@ -paginate = [ - 'contain' => ['Transactions', 'AddressTypes'] - ]; - $transactionGroupAddaddress = $this->paginate($this->TransactionGroupAddaddress); - - $this->set(compact('transactionGroupAddaddress')); - } - - /** - * View method - * - * @param string|null $id Transaction Group Addaddres id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id, [ - 'contain' => ['Transactions', 'AddressTypes'] - ]); - - $this->set('transactionGroupAddaddres', $transactionGroupAddaddres); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transactionGroupAddaddres = $this->TransactionGroupAddaddress->newEntity(); - if ($this->request->is('post')) { - $transactionGroupAddaddres = $this->TransactionGroupAddaddress->patchEntity($transactionGroupAddaddres, $this->request->getData()); - if ($this->TransactionGroupAddaddress->save($transactionGroupAddaddres)) { - $this->Flash->success(__('The transaction group addaddres has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction group addaddres could not be saved. Please, try again.')); - } - $transactions = $this->TransactionGroupAddaddress->Transactions->find('list', ['limit' => 200]); - $addressTypes = $this->TransactionGroupAddaddress->AddressTypes->find('list', ['limit' => 200]); - $this->set(compact('transactionGroupAddaddres', 'transactions', 'addressTypes')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Group Addaddres id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionGroupAddaddres = $this->TransactionGroupAddaddress->patchEntity($transactionGroupAddaddres, $this->request->getData()); - if ($this->TransactionGroupAddaddress->save($transactionGroupAddaddres)) { - $this->Flash->success(__('The transaction group addaddres has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction group addaddres could not be saved. Please, try again.')); - } - $transactions = $this->TransactionGroupAddaddress->Transactions->find('list', ['limit' => 200]); - $addressTypes = $this->TransactionGroupAddaddress->AddressTypes->find('list', ['limit' => 200]); - $this->set(compact('transactionGroupAddaddres', 'transactions', 'addressTypes')); - } - - /** - * Delete method - * - * @param string|null $id Transaction Group Addaddres id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id); - if ($this->TransactionGroupAddaddress->delete($transactionGroupAddaddres)) { - $this->Flash->success(__('The transaction group addaddres has been deleted.')); - } else { - $this->Flash->error(__('The transaction group addaddres could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionGroupAllowtradesController.php b/community_server/src/Controller/TransactionGroupAllowtradesController.php deleted file mode 100644 index 0b83332c6..000000000 --- a/community_server/src/Controller/TransactionGroupAllowtradesController.php +++ /dev/null @@ -1,113 +0,0 @@ -paginate = [ - 'contain' => ['Transactions', 'Groups'] - ]; - $transactionGroupAllowtrades = $this->paginate($this->TransactionGroupAllowtrades); - - $this->set(compact('transactionGroupAllowtrades')); - } - - /** - * View method - * - * @param string|null $id Transaction Group Allowtrade id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id, [ - 'contain' => ['Transactions', 'Groups'] - ]); - - $this->set('transactionGroupAllowtrade', $transactionGroupAllowtrade); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->newEntity(); - if ($this->request->is('post')) { - $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->patchEntity($transactionGroupAllowtrade, $this->request->getData()); - if ($this->TransactionGroupAllowtrades->save($transactionGroupAllowtrade)) { - $this->Flash->success(__('The transaction group allowtrade has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction group allowtrade could not be saved. Please, try again.')); - } - $transactions = $this->TransactionGroupAllowtrades->Transactions->find('list', ['limit' => 200]); - $groups = $this->TransactionGroupAllowtrades->Groups->find('list', ['limit' => 200]); - $this->set(compact('transactionGroupAllowtrade', 'transactions', 'groups')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Group Allowtrade id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->patchEntity($transactionGroupAllowtrade, $this->request->getData()); - if ($this->TransactionGroupAllowtrades->save($transactionGroupAllowtrade)) { - $this->Flash->success(__('The transaction group allowtrade has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction group allowtrade could not be saved. Please, try again.')); - } - $transactions = $this->TransactionGroupAllowtrades->Transactions->find('list', ['limit' => 200]); - $groups = $this->TransactionGroupAllowtrades->Groups->find('list', ['limit' => 200]); - $this->set(compact('transactionGroupAllowtrade', 'transactions', 'groups')); - } - - /** - * Delete method - * - * @param string|null $id Transaction Group Allowtrade id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id); - if ($this->TransactionGroupAllowtrades->delete($transactionGroupAllowtrade)) { - $this->Flash->success(__('The transaction group allowtrade has been deleted.')); - } else { - $this->Flash->error(__('The transaction group allowtrade could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionGroupCreatesController.php b/community_server/src/Controller/TransactionGroupCreatesController.php deleted file mode 100644 index 57e5c7d8f..000000000 --- a/community_server/src/Controller/TransactionGroupCreatesController.php +++ /dev/null @@ -1,113 +0,0 @@ -paginate = [ - 'contain' => ['Transactions', 'StateGroups'] - ]; - $transactionGroupCreates = $this->paginate($this->TransactionGroupCreates); - - $this->set(compact('transactionGroupCreates')); - } - - /** - * View method - * - * @param string|null $id Transaction Group Create id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionGroupCreate = $this->TransactionGroupCreates->get($id, [ - 'contain' => ['Transactions', 'StateGroups'] - ]); - - $this->set('transactionGroupCreate', $transactionGroupCreate); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transactionGroupCreate = $this->TransactionGroupCreates->newEntity(); - if ($this->request->is('post')) { - $transactionGroupCreate = $this->TransactionGroupCreates->patchEntity($transactionGroupCreate, $this->request->getData()); - if ($this->TransactionGroupCreates->save($transactionGroupCreate)) { - $this->Flash->success(__('The transaction group create has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction group create could not be saved. Please, try again.')); - } - $transactions = $this->TransactionGroupCreates->Transactions->find('list', ['limit' => 200]); - $stateGroups = $this->TransactionGroupCreates->StateGroups->find('list', ['limit' => 200]); - $this->set(compact('transactionGroupCreate', 'transactions', 'stateGroups')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Group Create id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionGroupCreate = $this->TransactionGroupCreates->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionGroupCreate = $this->TransactionGroupCreates->patchEntity($transactionGroupCreate, $this->request->getData()); - if ($this->TransactionGroupCreates->save($transactionGroupCreate)) { - $this->Flash->success(__('The transaction group create has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction group create could not be saved. Please, try again.')); - } - $transactions = $this->TransactionGroupCreates->Transactions->find('list', ['limit' => 200]); - $stateGroups = $this->TransactionGroupCreates->StateGroups->find('list', ['limit' => 200]); - $this->set(compact('transactionGroupCreate', 'transactions', 'stateGroups')); - } - - /** - * Delete method - * - * @param string|null $id Transaction Group Create id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionGroupCreate = $this->TransactionGroupCreates->get($id); - if ($this->TransactionGroupCreates->delete($transactionGroupCreate)) { - $this->Flash->success(__('The transaction group create has been deleted.')); - } else { - $this->Flash->error(__('The transaction group create could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionSendCoinsController.php b/community_server/src/Controller/TransactionSendCoinsController.php deleted file mode 100644 index bffc88290..000000000 --- a/community_server/src/Controller/TransactionSendCoinsController.php +++ /dev/null @@ -1,469 +0,0 @@ -loadComponent('GradidoNumber'); - $this->loadComponent('JsonRequestClient'); - //$this->Auth->allow(['add', 'edit']); - $this->Auth->allow('create'); - $this->Auth->allow('createRaw'); - $this->Auth->allow('ajaxCreate'); - $this->set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))-> - add(new NaviHierarchyEntry(__('Überweisung'), 'TransactionSendCoins', 'create', true)) - ); - } - - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['Transactions', 'StateUsers', 'ReceiverUsers'] - ]; - $transactionSendCoins = $this->paginate($this->TransactionSendCoins); - $simple = $this->TransactionSendCoins->find('all'); - - $this->set(compact('transactionSendCoins', 'simple')); - } - - /** - * View method - * - * @param string|null $id Transaction Send Coin id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionSendCoin = $this->TransactionSendCoins->get($id, [ - 'contain' => ['Transactions', 'StateUsers', 'ReceiverUsers'] - ]); - - $this->set('transactionSendCoin', $transactionSendCoin); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transactionSendCoin = $this->TransactionSendCoins->newEntity(); - if ($this->request->is('post')) { - $transactionSendCoin = $this->TransactionSendCoins->patchEntity($transactionSendCoin, $this->request->getData()); - if ($this->TransactionSendCoins->save($transactionSendCoin)) { - $this->Flash->success(__('The transaction send coin has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction send coin could not be saved. Please, try again.')); - } - $transactions = $this->TransactionSendCoins->Transactions->find('list', ['limit' => 200]); - $stateUsers = $this->TransactionSendCoins->StateUsers->find('list', ['limit' => 200]); - $receiverUsers = $this->TransactionSendCoins->ReceiverUsers->find('list', ['limit' => 200]); - $this->set(compact('transactionSendCoin', 'transactions', 'stateUsers', 'receiverUsers')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Send Coin id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionSendCoin = $this->TransactionSendCoins->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionSendCoin = $this->TransactionSendCoins->patchEntity($transactionSendCoin, $this->request->getData()); - if ($this->TransactionSendCoins->save($transactionSendCoin)) { - $this->Flash->success(__('The transaction send coin has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction send coin could not be saved. Please, try again.')); - } - $transactions = $this->TransactionSendCoins->Transactions->find('list', ['limit' => 200]); - $stateUsers = $this->TransactionSendCoins->StateUsers->find('list', ['limit' => 200]); - $receiverUsers = $this->TransactionSendCoins->ReceiverUsers->find('list', ['limit' => 200]); - $this->set(compact('transactionSendCoin', 'transactions', 'stateUsers', 'receiverUsers')); - } - - public function create() - { - /*$locale = I18n::getLocale(); - $defaultLocale = I18n::getDefaultLocale(); - echo "locale: $locale, default locale: $defaultLocale
    "; - * */ - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); -// var_dump($user); - if(!$user) { - //return $this->redirect(Router::url('/', true) . 'account/', 303); - $result = $this->requestLogin(); - if($result !== true) { - return $result; - } - $user = $session->read('StateUser'); - } - - $known_groups = $this->JsonRequestClient->sendRequest(json_encode([ - 'ask' => ['groups'] - ]), '/networkInfos'); - - - $transferForm = new TransferForm(); - $this->set('transferForm', $transferForm); - $this->set('timeUsed', microtime(true) - $startTime); - $this->set('groups', $known_groups['data']['data']['groups']); - $this->set('user', $user); - - if ($this->request->is('post')) { - //$this->Flash->error(__('Wird zurzeit noch entwickelt!')); - - $requestData = $this->request->getData(); - $mode = 'next'; - if(isset($requestData['add'])) {$mode = 'add'; } - if($transferForm->validate($requestData)) { - - $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); - - if(!isset($user['balance']) || $amountCent > $user['balance']) { - $this->Flash->error(__('Du hast nicht genug Gradidos!')); - return; - } - - $receiverEmail = $requestData['email']; - if($receiverEmail === $user['email']) { - $this->Flash->error(__('Du kannst dir selbst keine Gradidos senden!')); - return; - } - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session->read('session_id'), - 'transaction_type' => 'transfer', - 'memo' => $requestData['memo'], - 'amount' => $amountCent, - 'target_group' => $known_groups['data']['data']['groups'][$requestData['group']], - 'target_email' => $receiverEmail, - 'blockchain_type' => $this->blockchainType - ]), '/createTransaction'); - - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - $pendingTransactionCount = $session->read('Transactions.pending'); - if($pendingTransactionCount == null) { - $pendingTransactionCount = 1; - } else { - $pendingTransactionCount++; - } - $session->write('Transactions.pending', $pendingTransactionCount); - //echo "pending: " . $pendingTransactionCount; - if($mode === 'next') { - return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303); - } else { - $this->Flash->success(__('Transaction submitted for review.')); - } - } else { - - /* - * if request contain unknown parameter format, shouldn't happen't at all - * {"state": "error", "msg": "parameter format unknown"} - * if json parsing failed - * {"state": "error", "msg": "json exception", "details":"exception text"} - * if session_id is zero or not set - * {"state": "error", "msg": "session_id invalid"} - * if session id wasn't found on login server, if server was restartet or user logged out (also per timeout, default: 15 minutes) - * {"state": "error", "msg": "session not found"} - * if session hasn't active user, shouldn't happen't at all, login-server should be checked if happen - * {"state": "code error", "msg":"user is zero"} - * if transaction type not known - * {"state": "error", "msg":"transaction_type unknown"} - * if receiver wasn't known to Login-Server - * {"state": "not found", "msg":"receiver not found"} - * if receiver account disabled, and therefor cannto receive any coins - * {"state": "disabled", "msg":"receiver is disabled"} - * if transaction was okay and will be further proccessed - * {"state":"success"} - */ - $answear_data = $requestAnswear['data']; - if($answear_data['state'] === 'error') { - if($answear_data['msg'] === 'session_id invalid' || $answear_data['msg'] === 'session not found') { - $this->Flash->error(__('Fehler mit der Session, bitte logge dich erneut ein!')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - if($answear_data['msg'] === 'user not in group') { - $this->Flash->error(__('Empfänger befindet sich nicht in Zielgruppe!')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - if($answear_data['msg'] === 'memo is not set or not in expected range [5;150]') { - $this->Flash->error(__('Ein Verwendungszweck zwischen 5 und 150 Zeichen wird benötig!')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - } else if($answear_data['state'] === 'not found' && $answear_data['msg'] === 'receiver not found') { - $this->Flash->error(__('Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } else if($answear_data['state'] === 'disabled') { - $this->Flash->error(__('Der Empfänger ist deaktiviert, daher können ihm zurzeit keine Gradidos gesendet werden.')); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } else { - $this->Flash->error(__('Unbehandelter Fehler: ') . json_encode($answear_data)); - $this->set('timeUsed', microtime(true) - $startTime); - return; - } - - } - } - } - - $this->set('timeUsed', microtime(true) - $startTime); - } - - public function ajaxCreate() - { - if ($this->request->is('post')) { - $startTime = microtime(true); - $jsonData = $this->request->input('json_decode', true); - $session_id = $jsonData['session_id']; - if(!$session_id) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session id']); - } - - $login_result = $this->requestLogin($session_id, false); - if($login_result !== true) { - return $this->returnJson($login_result); - } - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - - $receiverPubKeyHex = ''; - $senderPubKeyHex = $user['public_hex']; - - if(!isset($jsonData['amount']) || !isset($jsonData['email'])) { - return $this->returnJson(['state' => 'parameter missing', 'msg' => 'amount and/or email not set']); - } - $amount = intval($jsonData['amount']); - if($amount < 0) { - return $this->returnJson(['state' => 'error', 'msg' => 'amout must be > 0 and int']); - } - - if(!isset($user['balance']) || $jsonData['amount'] > $user['balance']) { - return $this->returnJson(['state' => 'error', 'msg' => 'not enough GDD']); - } - $memo = ''; - if(isset($jsonData['memo'])) { - $memo = $jsonData['memo']; - } - - $receiverEmail = $jsonData['email']; - if($receiverEmail === $user['email']) { - return $this->returnJson(['state' => 'error', 'msg' => 'sender and receiver email are the same']); - } - - $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ - 'session_id' => $session_id, - 'email' => $receiverEmail, - 'ask' => ['user.pubkeyhex', 'user.disabled'] - ]), '/getUserInfos'); - if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { - // will be allways 64 byte long, even if it is empty - $receiverPubKeyHex = $requestAnswear['data']['userData']['pubkeyhex']; - } else { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'receiver email not found on login-server', - 'details' => $requestAnswear, - 'timeUsed' => microtime(true) - $startTime - ]); - } - if($requestAnswear['data']['userData']['disabled']) { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'receiver is currently disabled, he cannot receive payments', - 'timeUsed' => microtime(true) - $startTime - ]); - } - - - //var_dump($sessionStateUser); - - $builderResult = TransactionTransfer::build( - $amount, - $memo, - $receiverPubKeyHex, - $senderPubKeyHex - ); - $auto_sign = true; - if(isset($jsonData['auto_sign'])) { - $auto_sign = $jsonData['auto_sign']; - } - if($builderResult['state'] === 'success') { - - $http = new Client(); - try { - $loginServer = Configure::read('LoginServer'); - $url = $loginServer['host'] . ':' . $loginServer['port']; - - $response = $http->post($url . '/checkTransaction', json_encode([ - 'session_id' => $session_id, - 'transaction_base64' => base64_encode($builderResult['transactionBody']->serializeToString()), - 'auto_sign' => $auto_sign, - 'balance' => $user['balance'] - ]), ['type' => 'json']); - $json = $response->getJson(); - if($json['state'] != 'success') { - if($json['msg'] == 'session not found') { - $session->destroy(); - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'session not found', - 'details' => $session_id, - 'timeUsed' => microtime(true) - $startTime - ]); - //$this->Flash->error(__('session not found, please login again')); - } else { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'login server return error', - 'details' => $json, - 'timeUsed' => microtime(true) - $startTime - ]); - } - } else { - return $this->returnJson(['state' => 'success', 'timeUsed' => microtime(true) - $startTime]); - } - - } catch(\Exception $e) { - $msg = $e->getMessage(); - //$this->Flash->error(__('error http request: ') . $msg); - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'error http request', - 'details' => $msg, - 'timeUsed' => microtime(true) - $startTime - ]); - } - - } else { - return $this->returnJson([ - 'state' => 'error', - 'msg' => 'no valid receiver public key given', - 'details' => $receiverPubKeyHex, - 'timeUsed' => microtime(true) - $startTime - ]); - } - } - return $this->returnJson(['state' => 'error', 'msg' => 'no post request']); - } - - public function createRaw() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - - $transferRawForm = new TransferRawForm(); - $this->set('transferRawForm', $transferRawForm); - - if ($this->request->is('post')) { - $requestData = $this->request->getData(); - if($transferRawForm->validate($requestData)) { - $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']); - $sender = ['priv' => $requestData['sender_privkey_hex'], 'pub' => $requestData['sender_pubkey_hex']]; - $reciver = ['pub' => $requestData['receiver_pubkey_hex']]; - - $builderResult = TransactionTransfer::build( - $amountCent, - $requestData['memo'], - $reciver['pub'], - $sender['pub'] - ); - if($builderResult['state'] === 'success') { - $protoTransaction = Transaction::build($builderResult['transactionBody'], $sender); - $transaction = new Transaction($protoTransaction); - if(!$transaction->validate()) { - $this->Flash->error(__('Error validating transaction')); - } else { - if(!$transaction->save()) { - $this->Flash->error(__('Error saving transaction')); - } else { - $this->Flash->success(__('Gradidos erfolgreich überwiesen!')); - } - } - } else { - $this->Flash->error(__('Error building transaction')); - } - - } - //var_dump($requestData); - // - //var_dump($data); - - } - - $this->set('timeUsed', microtime(true) - $startTime); - } - - /** - * Delete method - * - * @param string|null $id Transaction Send Coin id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionSendCoin = $this->TransactionSendCoins->get($id); - if ($this->TransactionSendCoins->delete($transactionSendCoin)) { - $this->Flash->success(__('The transaction send coin has been deleted.')); - } else { - $this->Flash->error(__('The transaction send coin could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionSignaturesController.php b/community_server/src/Controller/TransactionSignaturesController.php deleted file mode 100644 index 91aea9558..000000000 --- a/community_server/src/Controller/TransactionSignaturesController.php +++ /dev/null @@ -1,111 +0,0 @@ -paginate = [ - 'contain' => ['Transactions'] - ]; - $transactionSignatures = $this->paginate($this->TransactionSignatures); - - $this->set(compact('transactionSignatures')); - } - - /** - * View method - * - * @param string|null $id Transaction Signature id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionSignature = $this->TransactionSignatures->get($id, [ - 'contain' => ['Transactions'] - ]); - - $this->set('transactionSignature', $transactionSignature); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transactionSignature = $this->TransactionSignatures->newEntity(); - if ($this->request->is('post')) { - $transactionSignature = $this->TransactionSignatures->patchEntity($transactionSignature, $this->request->getData()); - if ($this->TransactionSignatures->save($transactionSignature)) { - $this->Flash->success(__('The transaction signature has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction signature could not be saved. Please, try again.')); - } - $transactions = $this->TransactionSignatures->Transactions->find('list', ['limit' => 200]); - $this->set(compact('transactionSignature', 'transactions')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Signature id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionSignature = $this->TransactionSignatures->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionSignature = $this->TransactionSignatures->patchEntity($transactionSignature, $this->request->getData()); - if ($this->TransactionSignatures->save($transactionSignature)) { - $this->Flash->success(__('The transaction signature has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction signature could not be saved. Please, try again.')); - } - $transactions = $this->TransactionSignatures->Transactions->find('list', ['limit' => 200]); - $this->set(compact('transactionSignature', 'transactions')); - } - - /** - * Delete method - * - * @param string|null $id Transaction Signature id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionSignature = $this->TransactionSignatures->get($id); - if ($this->TransactionSignatures->delete($transactionSignature)) { - $this->Flash->success(__('The transaction signature has been deleted.')); - } else { - $this->Flash->error(__('The transaction signature could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionTypesController.php b/community_server/src/Controller/TransactionTypesController.php deleted file mode 100644 index 8256b22eb..000000000 --- a/community_server/src/Controller/TransactionTypesController.php +++ /dev/null @@ -1,106 +0,0 @@ -paginate($this->TransactionTypes); - - $this->set(compact('transactionTypes')); - } - - /** - * View method - * - * @param string|null $id Transaction Type id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transactionType = $this->TransactionTypes->get($id, [ - 'contain' => ['Transactions'] - ]); - - $this->set('transactionType', $transactionType); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transactionType = $this->TransactionTypes->newEntity(); - if ($this->request->is('post')) { - $transactionType = $this->TransactionTypes->patchEntity($transactionType, $this->request->getData()); - if ($this->TransactionTypes->save($transactionType)) { - $this->Flash->success(__('The transaction type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction type could not be saved. Please, try again.')); - } - $this->set(compact('transactionType')); - } - - /** - * Edit method - * - * @param string|null $id Transaction Type id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transactionType = $this->TransactionTypes->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transactionType = $this->TransactionTypes->patchEntity($transactionType, $this->request->getData()); - if ($this->TransactionTypes->save($transactionType)) { - $this->Flash->success(__('The transaction type has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction type could not be saved. Please, try again.')); - } - $this->set(compact('transactionType')); - } - - /** - * Delete method - * - * @param string|null $id Transaction Type id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transactionType = $this->TransactionTypes->get($id); - if ($this->TransactionTypes->delete($transactionType)) { - $this->Flash->success(__('The transaction type has been deleted.')); - } else { - $this->Flash->error(__('The transaction type could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/TransactionsController.php b/community_server/src/Controller/TransactionsController.php deleted file mode 100644 index 67526dfcc..000000000 --- a/community_server/src/Controller/TransactionsController.php +++ /dev/null @@ -1,450 +0,0 @@ -loadComponent('GradidoNumber'); - $this->loadComponent('JsonRpcRequestClient'); - $this->Auth->allow(['decode', 'manualTransaction']); - - } - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $this->paginate = [ - 'contain' => ['TransactionTypes'] - ]; - $transactions = $this->paginate($this->Transactions); - - $this->set(compact('transactions')); - } - - public function synchronizeWithStateUserTransactions() - { - $startTime = microtime(true); - $missing_transaction_ids = []; - $transaction_ids = $this->Transactions - ->find('all') - ->select(['id', 'transaction_type_id']) - ->order(['id']) - ->all() - ; - $state_user_transaction_ids = $this->Transactions->StateUserTransactions - ->find('all') - ->select(['transaction_id']) - ->group(['transaction_id']) - ->order(['transaction_id']) - ->toArray() - ; - $i2 = 0; - $count1 = count($transaction_ids); - $count2 = count($state_user_transaction_ids); - foreach($transaction_ids as $i1 => $tr_id) { - //echo "$i1: "; - if($i2 >= $count2) { - $missing_transaction_ids[] = $tr_id; - //echo "adding to missing: $tr_id, continue
    "; - continue; - } - $stu_id = $state_user_transaction_ids[$i2]; - if($tr_id->id == $stu_id->transaction_id) { - $i2++; - //echo "after i2++: $i2
    "; - } else if($tr_id->id < $stu_id->transaction_id) { - $missing_transaction_ids[] = $tr_id; - //echo "adding to missing: $tr_id
    "; - } - } - - if($this->request->is('POST')) { - $tablesForType = [ - 1 => $this->Transactions->TransactionCreations, - 2 => $this->Transactions->TransactionSendCoins, - 3 => $this->Transactions->TransactionGroupCreates, - 4 => $this->Transactions->TransactionGroupAddaddress, - 5 => $this->Transactions->TransactionGroupAddaddress - ]; - $idsForType = []; - foreach($missing_transaction_ids as $i => $transaction) { - if(!isset($idsForType[$transaction->transaction_type_id])) { - $idsForType[$transaction->transaction_type_id] = []; - } - $idsForType[$transaction->transaction_type_id][] = $transaction->id; - if($i > 200) break; - } - $entities = []; - $state_user_ids = []; - foreach($idsForType as $type_id => $transaction_ids) { - $specific_transactions = $tablesForType[$type_id]->find('all')->where(['transaction_id IN' => $transaction_ids])->toArray(); - $keys = $tablesForType[$type_id]->getSchema()->columns(); - //var_dump($keys); - foreach($specific_transactions as $specific) { - - foreach($keys as $key) { - if(preg_match('/_user_id/', $key)) { - $entity = $this->Transactions->StateUserTransactions->newEntity(); - $entity->transaction_id = $specific['transaction_id']; - $entity->transaction_type_id = $type_id; - $entity->state_user_id = $specific[$key]; - if(!in_array($entity->state_user_id, $state_user_ids)) { - array_push($state_user_ids, $entity->state_user_id); - } - $entities[] = $entity; - } - } - } - } - //var_dump($entities); - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - $existingStateUsers = $stateUsersTable->find('all')->select(['id'])->where(['id IN' => $state_user_ids])->order(['id'])->all(); - $existing_state_user_ids = []; - $finalEntities = []; - foreach($existingStateUsers as $stateUser) { - $existing_state_user_ids[] = $stateUser->id; - } - foreach($entities as $entity) { - if(in_array($entity->state_user_id, $existing_state_user_ids)) { - array_push($finalEntities, $entity); - } - } - - - $results = $this->Transactions->StateUserTransactions->saveMany($finalEntities); - foreach($entities as $i => $entity) { - $errors = $entity->getErrors(); - /* if(count($errors)) { - echo "$i: "; - echo json_encode($errors); - echo "
    "; - echo "state_user_id: " . $entity->state_user_id; - echo "
    "; - }*/ - } - $this->set('results', $results); - $this->set('entities', $entities); - } - - $this->set('missing_transactions', $missing_transaction_ids); - $this->set('count1', $count1); - $this->set('count2', $count2); - $timeUsed = microtime(true) - $startTime; - $this->set('timeUsed', $timeUsed); - } - - /** - * View method - * - * @param string|null $id Transaction id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $transaction = $this->Transactions->get($id, [ - 'contain' => ['TransactionTypes', 'TransactionCreations', 'TransactionGroupAddaddress', 'TransactionGroupAllowtrades', 'TransactionGroupCreates', 'TransactionSendCoins', 'TransactionSignatures'] - ]); - - $this->set('transaction', $transaction); - } - - public function manualTransaction() - { - if ($this->request->is('post')) { - $data = $this->request->getData(); - $type = $data['type']; - - $transaction = new \Proto\Gradido\GradidoTransaction(); - $transactionBody = new \Proto\Gradido\TransactionBody(); - $transactionBody->setMemo($data['memo']); - $created = new \Proto\Gradido\TimestampSeconds(); - $now = new Time(); - $created->setSeconds($now->getTimestamp()); - $transactionBody->setCreated($created); - if($type == "creation") { - $creation = new \Proto\Gradido\GradidoCreation(); - $target_date = new \Proto\Gradido\TimestampSeconds(); - $target_time = new Time($data['target_date']); - $target_date->setSeconds($target_time->getTimestamp()); - $creation->setTargetDate($target_date); - $receiver = new \Proto\Gradido\TransferAmount(); - $receiver->setAmount(intval($data['amount'])); - $receiver->setPubkey(hex2bin($data['target_public_key'])); - $creation->setReceiver($receiver); - $transactionBody->setCreation($creation); - } else if($type == "transfer") { - $transfer = new \Proto\Gradido\GradidoTransfer(); - $local_transfer = new \Proto\Gradido\LocalTransfer(); - $sender = new \Proto\Gradido\TransferAmount(); - $sender->setAmount(intval($data['amount'])); - $sender->setPubkey(hex2bin($data['sender_public_key'])); - $local_transfer->setSender($sender); - $local_transfer->setReceiver(hex2bin($data['receiver_public_key'])); - $transfer->setLocal($local_transfer); - $transactionBody->setTransfer($transfer); - } - $body_bytes = $transactionBody->serializeToString(); - $transaction->setBodyBytes($body_bytes); - - $protoSigMap = new \Proto\Gradido\SignatureMap(); - $sigPairs = $protoSigMap->getSigPair(); - //echo "sigPairs: "; var_dump($sigPairs); echo "
    "; - //return null; - - // sign with keys - //foreach($keys as $key) { - $sigPair = new \Proto\Gradido\SignaturePair(); - $sigPair->setPubKey(hex2bin($data['signer_public_key'])); - - $signature = sodium_crypto_sign_detached($body_bytes, hex2bin($data['signer_private_key'])); - echo "signature: " . bin2hex($signature). "
    "; - $sigPair->setEd25519($signature); - - $sigPairs[] = $sigPair; - // SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING - // SODIUM_BASE64_VARIANT_ORIGINAL - $transaction->setSigMap($protoSigMap); - //var_dump($protoSigMap); - $transaction_bin = $transaction->serializeToString(); -// $url_safe = sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_ORIGINAL); - $base64 = [ - //'original' => sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_ORIGINAL), - //'original_nopadding' => sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_ORIGINAL_NO_PADDING), - //'urlsafe' => sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_URLSAFE), - 'urlsafe_nopadding' => sodium_bin2base64($transaction_bin, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING), - 'php' => base64_encode($transaction_bin) - - ]; - - $this->set('base64', $base64); - } - } - - public function decode() - { - $this->viewBuilder()->setLayout('frontend'); - if ($this->request->is('post')) { - $base64 = $this->request->getData('base64'); - if(!$base64 || $base64 == '') { - $this->Flash->error(__('No valid data given, please try again.')); - } else { - try { - $transactionBin = sodium_base642bin($base64, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING); - } catch(Exception $ex) { - var_dump($ex); - } - $transaction = new TransactionBody($transactionBin); - if($transaction->hasErrors()) { - $this->set('errors', $transaction->getErrors()); - } else { - //$transaction->validate(); - if($transaction->hasErrors()) { - $this->set('errors', $transaction->getErrors()); - } - //var_dump($transaction); - echo "
    bin:
    "; - var_dump($transactionBin); - echo "
    "; - $this->set('transaction', $transaction); - } - - } - } - - } - - public function sendToNode() { - $this->viewBuilder()->setLayout('frontend'); - $startTime = microtime(true); - - //$loginServer = Configure::read('LoginServer'); - - $jsonRpcResult = $this->JsonRpcRequestClient->request('getlasttransaction', []); - $result = $jsonRpcResult['result']; - //var_dump($result); - if($result['state'] != 'success') { - $this->Flash->error(__('error retriving last saved transaction from gradido node.')); - $timeUsed = microtime(true) - $startTime; - $this->set('timeUsed', $timeUsed); - return; - } - - $firstId = 1; - if($result['transaction'] != '') { - $lastKnowTransaction = new Transaction($result['transaction']); - $firstId = $lastKnowTransaction->getId()+1; - } - - $transactionIDEntities = $this->Transactions - ->find('all') - ->select(['id']) - ->where(['id >=' => $firstId]) - ; - $transactionIDs = []; - foreach($transactionIDEntities as $entity) { - array_push($transactionIDs, $entity->id); - } - - $csfr_token = $this->request->getParam('_csrfToken'); - $this->set('csfr_token', $csfr_token); - $this->set('transactionIds', $transactionIDs); - - $timeUsed = microtime(true) - $startTime; - $this->set('timeUsed', $timeUsed); - - if ($this->request->is('post')) { - $host = $this->request->getData('host'); - $port = $this->request->getData('port'); - //$gradidod = new JsonRpcClient($host . ':' . $port); - - - //var_dump($transactionIDs); - - //$result = $this->JsonRpcRequestClient->request('puttransaction', ['group' => 'Hallo', 'transaction' => 'Hallo2' ]); - - //$result = $gradidod->putTransaction(['group' => 'Hallo', 'transaction' => 'Hallo2' ]); - //var_dump($result); - - $timeUsed = microtime(true) - $startTime; - $this->set('timeUsed', $timeUsed); - } - } - - public function ajaxPutTransactionToGradidoNode() - { - $startTime = microtime(true); - if($this->request->is('post')) { - //$jsonData = $this->request->input('json_decode', true); - $data = $this->request->getData(); - //$user = $jsonData['user']; - //var_dump($data); - $transactionId = $data['transaction_id']; - if($transactionId == null || $transactionId < 1) { - $timeUsed = microtime(true) - $startTime; - return $this->returnJson(['state' => 'error', 'msg' => 'invalid transaction id', 'timeUsed' => $timeUsed]); - } - try { - $transaction = Transaction::fromTable($transactionId); - } catch(Exception $e) { - echo "exception: "; - var_dump($e); - } - if(is_array($transaction)) { - $timeUsed = microtime(true) - $startTime; - $transaction['timeUsed'] = $timeUsed; - return $this->returnJson($transaction); - } else { - $transactionBase64 = base64_encode($transaction->serializeToString()); - //echo "base64:
    $transactionBase64
    "; - - $result = $this->JsonRpcRequestClient->request('puttransaction', [ - 'group' => 'd502c4254defe1842d71c484dc35f56983ce938e3c22058795c7520b62ab9123', - 'transaction' => $transactionBase64 - ]); - - $timeUsed = microtime(true) - $startTime; - $result['timeUsed'] = $timeUsed; - return $this->returnJson($result); - } - //return $this->returnJson(['state' => 'success', 'timeUsed' => $timeUsed]); - } - $timeUsed = microtime(true) - $startTime; - return $this->returnJson(['state' => 'error', 'msg' => 'no post request', 'timeUsed' => $timeUsed]); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $transaction = $this->Transactions->newEntity(); - if ($this->request->is('post')) { - $transaction = $this->Transactions->patchEntity($transaction, $this->request->getData()); - if ($this->Transactions->save($transaction)) { - $result = $this->Transactions->updateTxHash($transaction, 'start decay'); - if($result === true) { - $this->Flash->success(__('The transaction has been saved.')); - return $this->redirect(['action' => 'index']); - } else { - $this->Flash->error(__('Error by saving: ' . json_encode($result))); - } - } - $this->Flash->error(__('The transaction could not be saved. Please, try again.')); - } - $stateGroups = $this->Transactions->StateGroups->find('list', ['limit' => 200]); - $transactionTypes = $this->Transactions->TransactionTypes->find('list', ['limit' => 200]); - $blockchainTypes = $this->Transactions->BlockchainTypes->find('list'); - $this->set(compact('transaction', 'stateGroups', 'transactionTypes', 'blockchainTypes')); - } - - /** - * Edit method - * - * @param string|null $id Transaction id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $transaction = $this->Transactions->get($id, [ - 'contain' => [] - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $transaction = $this->Transactions->patchEntity($transaction, $this->request->getData()); - if ($this->Transactions->save($transaction)) { - $this->Flash->success(__('The transaction has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The transaction could not be saved. Please, try again.')); - } - $stateGroups = $this->Transactions->StateGroups->find('list', ['limit' => 200]); - $transactionTypes = $this->Transactions->TransactionTypes->find('list', ['limit' => 200]); - $this->set(compact('transaction', 'stateGroups', 'transactionTypes')); - } - - /** - * Delete method - * - * @param string|null $id Transaction id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $transaction = $this->Transactions->get($id); - if ($this->Transactions->delete($transaction)) { - $this->Flash->success(__('The transaction has been deleted.')); - } else { - $this->Flash->error(__('The transaction could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Controller/UsersController.php b/community_server/src/Controller/UsersController.php deleted file mode 100644 index f6b0472d3..000000000 --- a/community_server/src/Controller/UsersController.php +++ /dev/null @@ -1,167 +0,0 @@ -set( - 'naviHierarchy', - (new NaviHierarchy())-> - add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzerstatistiken'), 'Users', 'statistics', true)) - ); - } - - /** - * Index method - * - * @return \Cake\Http\Response|null - */ - public function index() - { - $users = $this->paginate($this->Users); - - $this->set(compact('users')); - } - - public function statistics() - { - $startTime = microtime(true); - $this->viewBuilder()->setLayout('frontend'); - $users = $this->Users->find('all')->select(['id']); - - //$newUsersThisMonth - $now = new Time(); - $sortDate = $this->getStartEndForMonth($now->month, $now->year); - $newUsersThisMonth = $this->Users->find('all') - ->select(['id']) - ->where(['created >=' => $sortDate[0], 'created <' => $sortDate[1]]); - $lastMonth = new Time(); - $lastMonth = $lastMonth->subMonth(1); - $prevSortDate = $this->getStartEndForMonth($lastMonth->month, $lastMonth->year); - $newUsersLastMonth = $this->Users->find('all') - ->select(['id']) - ->where(['created >=' => $prevSortDate[0], 'created <' => $prevSortDate[1]]); - - // new user sorted after date - $connection = ConnectionManager::get('loginServer'); - $newAccountsPerDay = $connection->execute('SELECT count(id) as count, created FROM users GROUP BY CAST(created as DATE) ORDER BY created DESC ')->fetchAll('assoc'); - - $newAccountsTree = []; - foreach($newAccountsPerDay as $entry) { - $created = new Time($entry['created']); - if(!isset($newAccountsTree[$created->year])) { - $newAccountsTree[$created->year] = []; - } - if(!isset($newAccountsTree[$created->year][$created->month])) { - $newAccountsTree[$created->year][$created->month] = ['count' => 0, 'days' => []]; - } - array_push($newAccountsTree[$created->year][$created->month]['days'], $entry); - $newAccountsTree[$created->year][$created->month]['count'] += intval($entry['count']); - } - - // last 5 new users - $lastUsers = $this->Users->find('all')->order(['created DESC'])->limit(5); - - $timeUsed = microtime(true) - $startTime; - - $this->set(compact( - 'users', 'newUsersThisMonth', 'newUsersLastMonth', - 'timeUsed', 'newAccountsTree', 'lastUsers')); - } - - /** - * View method - * - * @param string|null $id User id. - * @return \Cake\Http\Response|null - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function view($id = null) - { - $user = $this->Users->get($id, [ - 'contain' => ['EmailOptIn', 'UserBackups', 'UserRoles'], - ]); - - $this->set('user', $user); - } - - /** - * Add method - * - * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise. - */ - public function add() - { - $user = $this->Users->newEntity(); - if ($this->request->is('post')) { - $user = $this->Users->patchEntity($user, $this->request->getData()); - if ($this->Users->save($user)) { - $this->Flash->success(__('The user has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The user could not be saved. Please, try again.')); - } - $this->set(compact('user')); - } - - /** - * Edit method - * - * @param string|null $id User id. - * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function edit($id = null) - { - $user = $this->Users->get($id, [ - 'contain' => [], - ]); - if ($this->request->is(['patch', 'post', 'put'])) { - $user = $this->Users->patchEntity($user, $this->request->getData()); - if ($this->Users->save($user)) { - $this->Flash->success(__('The user has been saved.')); - - return $this->redirect(['action' => 'index']); - } - $this->Flash->error(__('The user could not be saved. Please, try again.')); - } - $this->set(compact('user')); - } - - /** - * Delete method - * - * @param string|null $id User id. - * @return \Cake\Http\Response|null Redirects to index. - * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. - */ - public function delete($id = null) - { - $this->request->allowMethod(['post', 'delete']); - $user = $this->Users->get($id); - if ($this->Users->delete($user)) { - $this->Flash->success(__('The user has been deleted.')); - } else { - $this->Flash->error(__('The user could not be deleted. Please, try again.')); - } - - return $this->redirect(['action' => 'index']); - } -} diff --git a/community_server/src/Form/AssignRoleForm.php b/community_server/src/Form/AssignRoleForm.php deleted file mode 100644 index 158fa2296..000000000 --- a/community_server/src/Form/AssignRoleForm.php +++ /dev/null @@ -1,30 +0,0 @@ -addField('role_id', ['type' => 'string']); - } - - function validationDefault(Validator $validator) - { - $validator->setProvider('custom', 'App\Model\Validation\GenericValidation'); - - return $validator; - } - - - protected function _execute(array $data) - { - // Send an email. - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Form/CreationForm.php b/community_server/src/Form/CreationForm.php deleted file mode 100644 index 70b4fce40..000000000 --- a/community_server/src/Form/CreationForm.php +++ /dev/null @@ -1,73 +0,0 @@ -addField('receiver_pubkey_hex', ['type' => 'string']) - ->addField('receiver', ['type' => 'select']) - ->addField('amount', ['type' => 'decimal', 'precision' => 2]) - ->addField('target_date', ['type' => 'date']) - ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]); - } - - function validationDefault(Validator $validator) - { - $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation'); - /* - $validator->add('receiver_pubkey_hex', 'length', [ - 'rule' => ['length', 64], - 'message' => 'a valid pubkey in hex format is required (64 character)' - ])->add('receiver_pubkey_hex_select', 'length', [ - 'rule' => ['length', 64], - 'message' => 'a valid pubkey in hex format is required (64 character)', - ]); -*/ - // TODO: add validation for used character to prevent hacking attempts - $validator->add('memo', 'length', [ - 'rule' => ['maxLength', 150], - 'message' => 'max 150 character' - ]) - //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed')) - ->add('memo', 'custom', [ - 'rule' => 'alphaNumeric', - 'provider' => 'custom', - //'message' => __('Only Alpha Numeric Character allowed') - 'message' => __('No HTML Tags like > or < please.') - ]) - ->allowEmptyString('memo', null, 'create') - /*->add('receiver_pubkey_hex', 'custom', [ - 'rule' => 'hexKey64', - 'provider' => 'custom', - 'message' => 'a valid pubkey in hex format is required (64 character)' - ]) - ->allowEmptyString('receiver_pubkey_hex', null, 'create')*/ - ->add('amount', 'custom', [ - 'rule' => 'amount', - 'provider' => 'custom', - 'message' => __('Please give a valid number with maximal 2 decimal places') - ]); - return $validator; - } - /* - * $validator->add('title', 'custom', [ - 'rule' => 'customRule', - 'provider' => 'custom', - 'message' => 'The title is not unique enough' -]); - */ - - protected function _execute(array $data) - { - // Send an email. - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Form/DecodeTransaction.php b/community_server/src/Form/DecodeTransaction.php deleted file mode 100644 index 3ac00faa6..000000000 --- a/community_server/src/Form/DecodeTransaction.php +++ /dev/null @@ -1,8 +0,0 @@ -addField('first_name', ['type' => 'string']) - ->addField('last_name', ['type' => 'string']) - ->addField('profile_img', ['type' => 'string']) - ->addField('profile_desc', ['type' =>'text', 'default' => '', 'rows' => 10, 'maxlength' => 2000]); - } - - function validationDefault(Validator $validator) - { - $validator->setProvider('generic', 'App\Model\Validation\GenericValidation'); - $validator->add('first_name', 'length', [ - 'rule' => ['maxLength', 255], - 'message' => __('The first name should contain max 255 characters') - ]) - ->add('last_name', 'length', [ - 'rule' => ['maxLength', 255], - 'message' => __('The last name should contain max 255 characters') - ]) - ->add('profile_desc', 'length', [ - 'rule' => ['maxLength', 2000], - 'message' => __('The description should contain max 2000 characters') - ]) - ->add('profile_desc', 'generic', [ - 'rule' => 'alphaNumeric', - 'provider' => 'generic', - 'message' => __('No HTML Tags like > or < please.') - ]) - ->allowEmptyString('profile_img', null, 'create') - ->allowEmptyString('profile_desc', null, 'create') - ; - return $validator; - } - - protected function _execute(array $data) - { - // Send an email. (??? xxx) - return true; - } -} diff --git a/community_server/src/Form/TransferForm.php b/community_server/src/Form/TransferForm.php deleted file mode 100644 index cb135ab9e..000000000 --- a/community_server/src/Form/TransferForm.php +++ /dev/null @@ -1,82 +0,0 @@ -addField('email', ['type' => 'string']) - ->addField('group', ['type' => 'string']) - ->addField('amount', ['type' => 'decimal', 'precision' => 2]) - ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]); - } - - function validationDefault(Validator $validator) - { - $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation'); - /* - $validator->add('receiver_pubkey_hex', 'length', [ - 'rule' => ['length', 64], - 'message' => 'a valid pubkey in hex format is required (64 character)' - ])->add('receiver_pubkey_hex_select', 'length', [ - 'rule' => ['length', 64], - 'message' => 'a valid pubkey in hex format is required (64 character)', - ]); -*/ - // TODO: add validation for used character to prevent hacking attempts - $validator->add('email', 'format', [ - 'rule' => 'email', - 'message' => __('A valid email address is required') - ]) - ->add('group', 'custom', [ - 'rule' => 'alphaNumeric', - 'provider' => 'custom', - //'message' => __('Only Alpha Numeric Character allowed') - 'message' => __('No HTML Tags like > or < please.') - ]) - ->add('memo', 'length', [ - 'rule' => ['maxLength', 150], - 'message' => __('The memo should contain max 150 character') - ]) - //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed')) - ->add('memo', 'custom', [ - 'rule' => 'alphaNumeric', - 'provider' => 'custom', - //'message' => __('Only Alpha Numeric Character allowed') - 'message' => __('No HTML Tags like > or < please.') - ]) - ->allowEmptyString('memo', null, 'create') - /*->add('receiver_pubkey_hex', 'custom', [ - 'rule' => 'hexKey64', - 'provider' => 'custom', - 'message' => 'a valid pubkey in hex format is required (64 character)' - ]) - ->allowEmptyString('receiver_pubkey_hex', null, 'create')*/ - ->add('amount', 'custom', [ - 'rule' => 'amount', - 'provider' => 'custom', - 'message' => __('Please give a valid positive number with maximal 2 decimal places') - ]); - return $validator; - } - /* - * $validator->add('title', 'custom', [ - 'rule' => 'customRule', - 'provider' => 'custom', - 'message' => 'The title is not unique enough' -]); - */ - - protected function _execute(array $data) - { - // Send an email. - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Form/TransferRawForm.php b/community_server/src/Form/TransferRawForm.php deleted file mode 100644 index 50c548ec5..000000000 --- a/community_server/src/Form/TransferRawForm.php +++ /dev/null @@ -1,73 +0,0 @@ -addField('sender_privkey_hex', ['type' => 'string']) - ->addField('sender_pubkey_hex', ['type' => 'string']) - ->addField('receiver_pubkey_hex', ['type' => 'string']) - ->addField('amount', ['type' => 'decimal', 'precision' => 2]) - ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]); - } - - function validationDefault(Validator $validator) - { - $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation'); - - $validator - ->add('memo', 'length', [ - 'rule' => ['maxLength', 150], - 'message' => __('The memo should contain max 150 character') - ]) - ->add('memo', 'custom', [ - 'rule' => 'alphaNumeric', - 'provider' => 'custom', - //'message' => __('Only Alpha Numeric Character allowed') - 'message' => __('No HTML Tags like > or < please.') - ]) - ->allowEmptyString('memo', null, 'create') - ->add('receiver_pubkey_hex', 'custom', [ - 'rule' => 'hexKey64', - 'provider' => 'custom', - 'message' => 'a valid pubkey in hex format is required (64 character)' - ]) - ->add('sender_privkey_hex', 'custom', [ - 'rule' => 'hexKey128', - 'provider' => 'custom', - 'message' => 'a valid privkey in hex format is required (128 character)' - ]) - ->add('sender_pubkey_hex', 'custom', [ - 'rule' => 'hexKey64', - 'provider' => 'custom', - 'message' => 'a valid pubkey in hex format is required (64 character)' - ]) - ->add('amount', 'custom', [ - 'rule' => 'amount', - 'provider' => 'custom', - 'message' => __('Please give a valid positive number with maximal 2 decimal places') - ]); - return $validator; - } - /* - * $validator->add('title', 'custom', [ - 'rule' => 'customRule', - 'provider' => 'custom', - 'message' => 'The title is not unique enough' -]); - */ - - protected function _execute(array $data) - { - // Send an email. - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Form/UserSearchForm.php b/community_server/src/Form/UserSearchForm.php deleted file mode 100644 index c68269920..000000000 --- a/community_server/src/Form/UserSearchForm.php +++ /dev/null @@ -1,58 +0,0 @@ -addField('search', ['type' => 'string']) - ->addField('account_state', ['type' => 'select']); - } - - function validationDefault(Validator $validator) - { - $validator->setProvider('custom', 'App\Model\Validation\GenericValidation'); - /* - $validator->add('receiver_pubkey_hex', 'length', [ - 'rule' => ['length', 64], - 'message' => 'a valid pubkey in hex format is required (64 character)' - ])->add('receiver_pubkey_hex_select', 'length', [ - 'rule' => ['length', 64], - 'message' => 'a valid pubkey in hex format is required (64 character)', - ]); -*/ - // TODO: add validation for used character to prevent hacking attempts - $validator->add('search', 'length', [ - 'rule' => ['maxLength', 50], - 'message' => __('The search text should contain max 50 character') - ]) - //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed')) - ->add('search', 'custom', [ - 'rule' => 'alphaNumeric', - 'provider' => 'custom', - //'message' => __('Only Alpha Numeric Character allowed') - 'message' => __('No HTML Tags like < or > please.') - ]); - return $validator; - } - /* - * $validator->add('title', 'custom', [ - 'rule' => 'customRule', - 'provider' => 'custom', - 'message' => 'The title is not unique enough' -]); - */ - - protected function _execute(array $data) - { - // Send an email. - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Locale/cake.pot b/community_server/src/Locale/cake.pot deleted file mode 100644 index 7d317194e..000000000 --- a/community_server/src/Locale/cake.pot +++ /dev/null @@ -1,29 +0,0 @@ -# LANGUAGE translation of CakePHP Application -# Copyright YEAR NAME -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2019-11-12 14:40+0000\n" -"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" -"Last-Translator: NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" - -#: Template/Error/error400.ctp:36 -#: Template/Error/error500.ctp:41 -msgid "Error" -msgstr "" - -#: Template/Error/error400.ctp:37 -msgid "The requested address {0} was not found on this server." -msgstr "" - -#: Template/Error/error500.ctp:39 -msgid "An Internal Error Has Occurred" -msgstr "" - diff --git a/community_server/src/Locale/de_DE/default.mo b/community_server/src/Locale/de_DE/default.mo deleted file mode 100644 index c739334c8..000000000 Binary files a/community_server/src/Locale/de_DE/default.mo and /dev/null differ diff --git a/community_server/src/Locale/de_DE/default.po b/community_server/src/Locale/de_DE/default.po deleted file mode 100644 index 90fa91803..000000000 --- a/community_server/src/Locale/de_DE/default.po +++ /dev/null @@ -1,3097 +0,0 @@ -# LANGUAGE translation of CakePHP Application -# Copyright YEAR NAME -# -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2021-08-11 11:38+0000\n" -"PO-Revision-Date: 2021-08-11 13:39+0200\n" -"Last-Translator: \n" -"Language-Team: LANGUAGE \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.3\n" - -#: Controller/AddressTypesController.php:54 -#: Controller/AddressTypesController.php:78 -msgid "The address type has been saved." -msgstr "" - -#: Controller/AddressTypesController.php:58 -#: Controller/AddressTypesController.php:82 -msgid "The address type could not be saved. Please, try again." -msgstr "" - -#: Controller/AddressTypesController.php:99 -msgid "The address type has been deleted." -msgstr "" - -#: Controller/AddressTypesController.php:101 -msgid "The address type could not be deleted. Please, try again." -msgstr "" - -#: Controller/AdminErrorsController.php:57 -#: Controller/AdminErrorsController.php:82 -msgid "The admin error has been saved." -msgstr "" - -#: Controller/AdminErrorsController.php:61 -#: Controller/AdminErrorsController.php:86 -msgid "The admin error could not be saved. Please, try again." -msgstr "" - -#: Controller/AdminErrorsController.php:104 -msgid "The admin error has been deleted." -msgstr "" - -#: Controller/AdminErrorsController.php:106 -msgid "The admin error could not be deleted. Please, try again." -msgstr "" - -#: Controller/AppController.php:262 -msgid "error updating state user " -msgstr "" - -#: Controller/AppController.php:276 -msgid "error saving state user " -msgstr "" - -#: Controller/AppController.php:286 -msgid "no pubkey" -msgstr "" - -#: Controller/AppController.php:295 -msgid "invalid session" -msgstr "" - -#: Controller/AppController.php:297 -msgid "Konto ist nicht aktiviert!" -msgstr "" - -#: Controller/AppController.php:311 Controller/StateUsersController.php:103 -msgid "error http request: " -msgstr "" - -#: Controller/AppController.php:358 -msgid "(Leere Message)" -msgstr "" - -#: Controller/AppController.php:363 -msgid "(Leere Details)" -msgstr "" - -#: Controller/AppController.php:367 -msgid "Serious error, couldn't save to db, please write the admin: " -msgstr "" - -#: Controller/BlockchainTypesController.php:54 -#: Controller/BlockchainTypesController.php:78 -msgid "The blockchain type has been saved." -msgstr "" - -#: Controller/BlockchainTypesController.php:58 -#: Controller/BlockchainTypesController.php:82 -msgid "The blockchain type could not be saved. Please, try again." -msgstr "" - -#: Controller/BlockchainTypesController.php:99 -msgid "The blockchain type has been deleted." -msgstr "" - -#: Controller/BlockchainTypesController.php:101 -msgid "The blockchain type could not be deleted. Please, try again." -msgstr "" - -#: Controller/CommunityProfilesController.php:54 -#: Controller/CommunityProfilesController.php:78 -msgid "The community profile has been saved." -msgstr "" - -#: Controller/CommunityProfilesController.php:58 -#: Controller/CommunityProfilesController.php:82 -msgid "The community profile could not be saved. Please, try again." -msgstr "" - -#: Controller/CommunityProfilesController.php:99 -msgid "The community profile has been deleted." -msgstr "" - -#: Controller/CommunityProfilesController.php:101 -msgid "The community profile could not be deleted. Please, try again." -msgstr "" - -#: Controller/DashboardController.php:29 Controller/ProfileController.php:28 -#: Controller/StateBalancesController.php:52 -#: Controller/StateBalancesController.php:202 -#: Controller/StateErrorsController.php:26 -#: Controller/StateUserRolesController.php:42 -#: Controller/StateUsersController.php:54 -#: Controller/TransactionCreationsController.php:42 -#: Controller/TransactionSendCoinsController.php:44 -#: Controller/UsersController.php:26 Template/Element/navi.ctp:33 -msgid "Startseite" -msgstr "" - -#: Controller/ElopageBuysController.php:112 -#: Controller/ElopageBuysController.php:137 -msgid "The elopage buy has been saved." -msgstr "" - -#: Controller/ElopageBuysController.php:116 -#: Controller/ElopageBuysController.php:141 -msgid "The elopage buy could not be saved. Please, try again." -msgstr "" - -#: Controller/ElopageBuysController.php:158 -msgid "The elopage buy has been deleted." -msgstr "" - -#: Controller/ElopageBuysController.php:160 -msgid "The elopage buy could not be deleted. Please, try again." -msgstr "" - -#: Controller/JsonRequestHandlerController.php:366 -msgid "Gradido Transaktion fehlgeschlagen!" -msgstr "" - -#: Controller/OperatorTypesController.php:54 -#: Controller/OperatorTypesController.php:78 -msgid "The operator type has been saved." -msgstr "" - -#: Controller/OperatorTypesController.php:58 -#: Controller/OperatorTypesController.php:82 -msgid "The operator type could not be saved. Please, try again." -msgstr "" - -#: Controller/OperatorTypesController.php:99 -msgid "The operator type has been deleted." -msgstr "" - -#: Controller/OperatorTypesController.php:101 -msgid "The operator type could not be deleted. Please, try again." -msgstr "" - -#: Controller/OperatorsController.php:182 -#: Controller/OperatorsController.php:207 -msgid "The operator has been saved." -msgstr "" - -#: Controller/OperatorsController.php:186 -#: Controller/OperatorsController.php:211 -msgid "The operator could not be saved. Please, try again." -msgstr "" - -#: Controller/OperatorsController.php:229 -msgid "The operator has been deleted." -msgstr "" - -#: Controller/OperatorsController.php:231 -msgid "The operator could not be deleted. Please, try again." -msgstr "" - -#: Controller/ProfileController.php:29 Template/Element/user_menu.ctp:15 -#: Template/Profile/index.ctp:19 -msgid "Mein Profil" -msgstr "" - -#: Controller/ProfileController.php:108 -msgid "Dein Profil wurde aktualisiert!" -msgstr "" - -#: Controller/ProfileController.php:111 -msgid "" -"Non-recoverable database problem - state_user doesn't exist or not unique!" -msgstr "" - -#: Controller/ProfileController.php:198 -#: Controller/StateUserRolesController.php:117 -#: Controller/StateUsersController.php:291 -#: Controller/TransactionCreationsController.php:183 -msgid "Something was invalid, please try again!" -msgstr "" - -#: Controller/RolesController.php:56 Controller/RolesController.php:80 -msgid "The role has been saved." -msgstr "" - -#: Controller/RolesController.php:60 Controller/RolesController.php:84 -msgid "The role could not be saved. Please, try again." -msgstr "" - -#: Controller/RolesController.php:101 -msgid "The role has been deleted." -msgstr "" - -#: Controller/RolesController.php:103 -msgid "The role could not be deleted. Please, try again." -msgstr "" - -#: Controller/ServerUsersController.php:42 -msgid "Invalid username or password, try again" -msgstr "" - -#: Controller/ServerUsersController.php:79 -#: Controller/ServerUsersController.php:103 -msgid "The server user has been saved." -msgstr "" - -#: Controller/ServerUsersController.php:83 -#: Controller/ServerUsersController.php:107 -msgid "The server user could not be saved. Please, try again." -msgstr "" - -#: Controller/ServerUsersController.php:124 -msgid "The server user has been deleted." -msgstr "" - -#: Controller/ServerUsersController.php:126 -msgid "The server user could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateBalancesController.php:53 Template/Dashboard/index.ctp:30 -#: Template/Element/navi.ctp:22 Template/StateBalances/overview.ctp:8 -msgid "Kontoübersicht" -msgstr "" - -#: Controller/StateBalancesController.php:203 -#: Template/StateBalances/overview_gdt.ctp:20 -msgid "GDT Kontoübersicht" -msgstr "" - -#: Controller/StateBalancesController.php:252 -msgid "Fehler beim GDT Server, bitte abwarten oder den Admin benachrichtigen!" -msgstr "" - -#: Controller/StateBalancesController.php:351 -#: Controller/StateBalancesController.php:376 -msgid "The state balance has been saved." -msgstr "" - -#: Controller/StateBalancesController.php:355 -#: Controller/StateBalancesController.php:380 -msgid "The state balance could not be saved. Please, try again." -msgstr "" - -#: Controller/StateBalancesController.php:398 -msgid "The state balance has been deleted." -msgstr "" - -#: Controller/StateBalancesController.php:400 -msgid "The state balance could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateCreatedController.php:57 -#: Controller/StateCreatedController.php:83 -msgid "The state created has been saved." -msgstr "" - -#: Controller/StateCreatedController.php:61 -#: Controller/StateCreatedController.php:87 -msgid "The state created could not be saved. Please, try again." -msgstr "" - -#: Controller/StateCreatedController.php:106 -msgid "The state created has been deleted." -msgstr "" - -#: Controller/StateCreatedController.php:108 -msgid "The state created could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateErrorsController.php:27 Template/Dashboard/index.ctp:79 -#: Template/Dashboard/server_index.ctp:31 Template/Element/navi_header.ctp:33 -#: Template/Element/navi_notify.ctp:32 -msgid "Fehler" -msgstr "" - -#: Controller/StateErrorsController.php:75 -msgid "Error belongs to another User, cannot delete" -msgstr "" - -#: Controller/StateErrorsController.php:78 -#: Controller/StateErrorsController.php:166 -msgid "The state error has been deleted." -msgstr "" - -#: Controller/StateErrorsController.php:80 -#: Controller/StateErrorsController.php:168 -msgid "The state error could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateErrorsController.php:117 -#: Controller/StateErrorsController.php:143 -msgid "The state error has been saved." -msgstr "" - -#: Controller/StateErrorsController.php:121 -#: Controller/StateErrorsController.php:147 -msgid "The state error could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupAddressesController.php:57 -#: Controller/StateGroupAddressesController.php:83 -msgid "The state group address has been saved." -msgstr "" - -#: Controller/StateGroupAddressesController.php:61 -#: Controller/StateGroupAddressesController.php:87 -msgid "The state group address could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupAddressesController.php:106 -msgid "The state group address has been deleted." -msgstr "" - -#: Controller/StateGroupAddressesController.php:108 -msgid "The state group address could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:57 -#: Controller/StateGroupRelationshipsController.php:84 -msgid "The state group relationship has been saved." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:61 -#: Controller/StateGroupRelationshipsController.php:88 -msgid "The state group relationship could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:108 -msgid "The state group relationship has been deleted." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:110 -msgid "The state group relationship could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateGroupsController.php:57 -#: Controller/StateGroupsController.php:82 -msgid "The state group has been saved." -msgstr "" - -#: Controller/StateGroupsController.php:61 -#: Controller/StateGroupsController.php:86 -msgid "The state group could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupsController.php:104 -msgid "The state group has been deleted." -msgstr "" - -#: Controller/StateGroupsController.php:106 -msgid "The state group could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:54 -#: Controller/StateRelationshipTypesController.php:78 -msgid "The state relationship type has been saved." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:58 -#: Controller/StateRelationshipTypesController.php:82 -msgid "The state relationship type could not be saved. Please, try again." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:99 -msgid "The state relationship type has been deleted." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:101 -msgid "The state relationship type could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateUserRolesController.php:42 -#: Controller/StateUsersController.php:54 Template/StateUserRoles/search.ctp:9 -#: Template/StateUsers/search.ctp:9 -msgid "Benutzer suchen" -msgstr "" - -#: Controller/StateUserRolesController.php:149 -msgid "Role has been assigned to User." -msgstr "" - -#: Controller/StateUserTransactionsController.php:233 -#: Controller/StateUserTransactionsController.php:260 -msgid "The state user transaction has been saved." -msgstr "" - -#: Controller/StateUserTransactionsController.php:237 -#: Controller/StateUserTransactionsController.php:264 -msgid "The state user transaction could not be saved. Please, try again." -msgstr "" - -#: Controller/StateUserTransactionsController.php:284 -msgid "The state user transaction has been deleted." -msgstr "" - -#: Controller/StateUserTransactionsController.php:286 -msgid "The state user transaction could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateUsersController.php:21 -msgid "account created" -msgstr "Konto angelegt" - -#: Controller/StateUsersController.php:22 -msgid "account not on login-server" -msgstr "Konto nicht auf Login-Server" - -#: Controller/StateUsersController.php:23 -msgid "email activated" -msgstr "Konto aktiviert" - -#: Controller/StateUsersController.php:24 -msgid "account copied to community" -msgstr "Konto kopiert nach Community-Server" - -#: Controller/StateUsersController.php:25 -msgid "email not activated" -msgstr "Konto nicht aktiviert" - -#: Controller/StateUsersController.php:26 -msgid "account multiple times on login-server" -msgstr "Konto mehrfach vorhanden" - -#: Controller/StateUsersController.php:27 -msgid "account not on community server" -msgstr "Konto nicht auf Community-Server" - -#: Controller/StateUsersController.php:28 -msgid "no keys" -msgstr "Keine Schlüssel generiert" - -#: Controller/StateUsersController.php:560 -#: Controller/StateUsersController.php:586 -msgid "The state user has been saved." -msgstr "" - -#: Controller/StateUsersController.php:564 -#: Controller/StateUsersController.php:590 -msgid "The state user could not be saved. Please, try again." -msgstr "" - -#: Controller/StateUsersController.php:609 -msgid "The state user has been deleted." -msgstr "" - -#: Controller/StateUsersController.php:611 -msgid "The state user could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionCreationsController.php:42 -msgid "Gradido schöpfen" -msgstr "" - -#: Controller/TransactionCreationsController.php:149 -#: Controller/TransactionCreationsController.php:385 -#: Controller/TransactionCreationsController.php:408 -msgid "Error by requesting LoginServer, please try again" -msgstr "" - -#: Controller/TransactionCreationsController.php:151 -#: Controller/TransactionCreationsController.php:410 -msgid "Error, please wait for the admin to fix it" -msgstr "" - -#: Controller/TransactionCreationsController.php:161 -msgid "Login Server Error, please wait for the admin to fix it" -msgstr "" - -#: Controller/TransactionCreationsController.php:174 -#: Controller/TransactionCreationsController.php:491 -#: Controller/TransactionSendCoinsController.php:204 -msgid "Transaction submitted for review." -msgstr "" - -#: Controller/TransactionCreationsController.php:179 -msgid "Building transaction failed" -msgstr "" - -#: Controller/TransactionCreationsController.php:342 -msgid "No user selected" -msgstr "" - -#: Controller/TransactionCreationsController.php:442 -#: Controller/TransactionSendCoinsController.php:231 -msgid "Fehler mit der Session, bitte logge dich erneut ein!" -msgstr "" - -#: Controller/TransactionCreationsController.php:447 -msgid "Fehler, Benutzer gehört zu einer anderen Gruppe!" -msgstr "" - -#: Controller/TransactionCreationsController.php:452 -#: Controller/TransactionSendCoinsController.php:246 -msgid "" -"Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto " -"schon angelegt?" -msgstr "" - -#: Controller/TransactionCreationsController.php:456 -#: Controller/TransactionSendCoinsController.php:250 -msgid "" -"Der Empfänger ist deaktiviert, daher können ihm zurzeit keine Gradidos " -"gesendet werden." -msgstr "" - -#: Controller/TransactionCreationsController.php:460 -msgid "Der Betrag ist ungültig, er muss größer als 0 und <= 1000 sein." -msgstr "" - -#: Controller/TransactionCreationsController.php:464 -#: Controller/TransactionSendCoinsController.php:254 -msgid "Unbehandelter Fehler: " -msgstr "" - -#: Controller/TransactionCreationsController.php:625 -#: Controller/TransactionCreationsController.php:651 -msgid "The transaction creation has been saved." -msgstr "" - -#: Controller/TransactionCreationsController.php:629 -#: Controller/TransactionCreationsController.php:655 -msgid "The transaction creation could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionCreationsController.php:674 -msgid "The transaction creation has been deleted." -msgstr "" - -#: Controller/TransactionCreationsController.php:676 -msgid "The transaction creation could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:57 -#: Controller/TransactionGroupAddaddressController.php:83 -msgid "The transaction group addaddres has been saved." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:61 -#: Controller/TransactionGroupAddaddressController.php:87 -msgid "The transaction group addaddres could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:106 -msgid "The transaction group addaddres has been deleted." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:108 -msgid "" -"The transaction group addaddres could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:57 -#: Controller/TransactionGroupAllowtradesController.php:83 -msgid "The transaction group allowtrade has been saved." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:61 -#: Controller/TransactionGroupAllowtradesController.php:87 -msgid "The transaction group allowtrade could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:106 -msgid "The transaction group allowtrade has been deleted." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:108 -msgid "" -"The transaction group allowtrade could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:57 -#: Controller/TransactionGroupCreatesController.php:83 -msgid "The transaction group create has been saved." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:61 -#: Controller/TransactionGroupCreatesController.php:87 -msgid "The transaction group create could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:106 -msgid "The transaction group create has been deleted." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:108 -msgid "The transaction group create could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:45 -#: Template/Dashboard/index.ctp:38 Template/Element/navi.ctp:34 -#: Template/StateUsers/view.ctp:83 Template/StateUsers/view.ctp:117 -#: Template/TransactionSendCoins/create.ctp:9 -#: Template/TransactionSendCoins/create_raw.ctp:9 -msgid "Überweisung" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:92 -#: Controller/TransactionSendCoinsController.php:119 -msgid "The transaction send coin has been saved." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:96 -#: Controller/TransactionSendCoinsController.php:123 -msgid "The transaction send coin could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:173 -msgid "Du hast nicht genug Gradidos!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:179 -msgid "Du kannst dir selbst keine Gradidos senden!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:236 -msgid "Empfänger befindet sich nicht in Zielgruppe!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:241 -msgid "Ein Verwendungszweck zwischen 5 und 150 Zeichen wird benötig!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:428 -msgid "Error validating transaction" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:431 -msgid "Error saving transaction" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:433 -msgid "Gradidos erfolgreich überwiesen!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:437 -msgid "Error building transaction" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:462 -msgid "The transaction send coin has been deleted." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:464 -msgid "The transaction send coin could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionSignaturesController.php:57 -#: Controller/TransactionSignaturesController.php:82 -msgid "The transaction signature has been saved." -msgstr "" - -#: Controller/TransactionSignaturesController.php:61 -#: Controller/TransactionSignaturesController.php:86 -msgid "The transaction signature could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionSignaturesController.php:104 -msgid "The transaction signature has been deleted." -msgstr "" - -#: Controller/TransactionSignaturesController.php:106 -msgid "The transaction signature could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionTypesController.php:54 -#: Controller/TransactionTypesController.php:78 -msgid "The transaction type has been saved." -msgstr "" - -#: Controller/TransactionTypesController.php:58 -#: Controller/TransactionTypesController.php:82 -msgid "The transaction type could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionTypesController.php:99 -msgid "The transaction type has been deleted." -msgstr "" - -#: Controller/TransactionTypesController.php:101 -msgid "The transaction type could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionsController.php:252 -msgid "No valid data given, please try again." -msgstr "" - -#: Controller/TransactionsController.php:289 -msgid "error retriving last saved transaction from gradido node." -msgstr "" - -#: Controller/TransactionsController.php:391 -#: Controller/TransactionsController.php:420 -msgid "The transaction has been saved." -msgstr "" - -#: Controller/TransactionsController.php:394 -msgid "Error by saving: " -msgstr "" - -#: Controller/TransactionsController.php:397 -#: Controller/TransactionsController.php:424 -msgid "The transaction could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionsController.php:443 -msgid "The transaction has been deleted." -msgstr "" - -#: Controller/TransactionsController.php:445 -msgid "The transaction could not be deleted. Please, try again." -msgstr "" - -#: Controller/UsersController.php:26 -msgid "Benutzerstatistiken" -msgstr "" - -#: Controller/UsersController.php:115 Controller/UsersController.php:139 -msgid "The user has been saved." -msgstr "" - -#: Controller/UsersController.php:119 Controller/UsersController.php:143 -msgid "The user could not be saved. Please, try again." -msgstr "" - -#: Controller/UsersController.php:160 -msgid "The user has been deleted." -msgstr "" - -#: Controller/UsersController.php:162 -msgid "The user could not be deleted. Please, try again." -msgstr "" - -#: Form/CreationForm.php:44 Form/ProfileForm.php:39 Form/TransferForm.php:42 -#: Form/TransferForm.php:53 Form/TransferRawForm.php:35 -msgid "No HTML Tags like > or < please." -msgstr "" - -#: Form/CreationForm.php:56 -msgid "Please give a valid number with maximal 2 decimal places" -msgstr "" - -#: Form/ProfileForm.php:26 -msgid "The first name should contain max 255 characters" -msgstr "" - -#: Form/ProfileForm.php:30 -msgid "The last name should contain max 255 characters" -msgstr "" - -#: Form/ProfileForm.php:34 -msgid "The description should contain max 2000 characters" -msgstr "" - -#: Form/TransferForm.php:36 -msgid "A valid email address is required" -msgstr "" - -#: Form/TransferForm.php:46 Form/TransferRawForm.php:29 -msgid "The memo should contain max 150 character" -msgstr "" - -#: Form/TransferForm.php:65 Form/TransferRawForm.php:56 -msgid "Please give a valid positive number with maximal 2 decimal places" -msgstr "" - -#: Form/UserSearchForm.php:34 -msgid "The search text should contain max 50 character" -msgstr "" - -#: Form/UserSearchForm.php:41 -msgid "No HTML Tags like < or > please." -msgstr "" - -#: Model/Table/ServerUsersTable.php:58 -msgid "Please give a username" -msgstr "" - -#: Model/Table/ServerUsersTable.php:64 -msgid "Please give a password" -msgstr "" - -#: Model/Table/ServerUsersTable.php:69 -msgid "Please give a email" -msgstr "" - -#: Model/Transactions/TransactionCreation.php:209 -msgid "Gradido Schöpfung erhalten" -msgstr "" - -#: Model/Transactions/TransactionTransfer.php:210 -msgid "Gradidos erhalten" -msgstr "" - -#: Template/AddressTypes/add.ctp:9 Template/AddressTypes/edit.ctp:9 -#: Template/AddressTypes/index.ctp:9 Template/AddressTypes/index.ctp:25 -#: Template/AddressTypes/view.ctp:9 Template/AddressTypes/view.ctp:45 -#: Template/AddressTypes/view.ctp:73 Template/AdminErrors/add.ctp:9 -#: Template/AdminErrors/edit.ctp:9 Template/AdminErrors/index.ctp:9 -#: Template/AdminErrors/index.ctp:26 Template/AdminErrors/view.ctp:9 -#: Template/BlockchainTypes/add.ctp:9 Template/BlockchainTypes/edit.ctp:9 -#: Template/BlockchainTypes/index.ctp:9 Template/BlockchainTypes/index.ctp:22 -#: Template/BlockchainTypes/view.ctp:9 Template/CommunityProfiles/add.ctp:9 -#: Template/CommunityProfiles/edit.ctp:9 Template/CommunityProfiles/index.ctp:9 -#: Template/CommunityProfiles/index.ctp:21 -#: Template/CommunityProfiles/view.ctp:9 Template/ElopageBuys/add.ctp:9 -#: Template/ElopageBuys/edit.ctp:9 Template/ElopageBuys/index.ctp:9 -#: Template/ElopageBuys/index.ctp:30 Template/ElopageBuys/view.ctp:9 -#: Template/OperatorTypes/edit.ctp:9 Template/OperatorTypes/index.ctp:9 -#: Template/OperatorTypes/index.ctp:23 Template/OperatorTypes/view.ctp:9 -#: Template/OperatorTypes/view.ctp:43 Template/Operators/add.ctp:9 -#: Template/Operators/edit.ctp:9 Template/Operators/index.ctp:9 -#: Template/Operators/index.ctp:24 Template/Operators/view.ctp:9 -#: Template/Roles/add.ctp:9 Template/Roles/edit.ctp:9 -#: Template/Roles/index.ctp:9 Template/Roles/index.ctp:20 -#: Template/Roles/view.ctp:9 Template/ServerUsers/add.ctp:9 -#: Template/ServerUsers/edit.ctp:9 Template/ServerUsers/index.ctp:9 -#: Template/ServerUsers/index.ctp:26 Template/ServerUsers/view.ctp:9 -#: Template/StateBalances/add.ctp:9 Template/StateBalances/edit.ctp:9 -#: Template/StateBalances/index.ctp:9 Template/StateBalances/index.ctp:25 -#: Template/StateBalances/view.ctp:9 Template/StateCreated/add.ctp:9 -#: Template/StateCreated/edit.ctp:9 Template/StateCreated/index.ctp:9 -#: Template/StateCreated/index.ctp:29 Template/StateCreated/view.ctp:9 -#: Template/StateErrors/add.ctp:9 Template/StateErrors/edit.ctp:9 -#: Template/StateErrors/index.ctp:9 Template/StateErrors/index.ctp:26 -#: Template/StateErrors/view.ctp:9 Template/StateGroupAddresses/add.ctp:9 -#: Template/StateGroupAddresses/edit.ctp:9 -#: Template/StateGroupAddresses/index.ctp:9 -#: Template/StateGroupAddresses/index.ctp:26 -#: Template/StateGroupAddresses/view.ctp:9 -#: Template/StateGroupRelationships/add.ctp:9 -#: Template/StateGroupRelationships/edit.ctp:9 -#: Template/StateGroupRelationships/index.ctp:9 -#: Template/StateGroupRelationships/index.ctp:22 -#: Template/StateGroupRelationships/view.ctp:9 Template/StateGroups/add.ctp:9 -#: Template/StateGroups/edit.ctp:9 Template/StateGroups/index.ctp:9 -#: Template/StateGroups/index.ctp:29 Template/StateGroups/view.ctp:9 -#: Template/StateGroups/view.ctp:49 Template/StateGroups/view.ctp:76 -#: Template/StateGroups/view.ctp:104 Template/StateGroups/view.ctp:133 -#: Template/StateRelationshipTypes/add.ctp:9 -#: Template/StateRelationshipTypes/edit.ctp:9 -#: Template/StateRelationshipTypes/index.ctp:9 -#: Template/StateRelationshipTypes/index.ctp:21 -#: Template/StateRelationshipTypes/view.ctp:9 -#: Template/StateUserRoles/index.ctp:9 Template/StateUserRoles/index.ctp:36 -#: Template/StateUserRoles/search.ctp:33 -#: Template/StateUserTransactions/add.ctp:9 -#: Template/StateUserTransactions/edit.ctp:9 -#: Template/StateUserTransactions/index.ctp:9 -#: Template/StateUserTransactions/index.ctp:28 -#: Template/StateUserTransactions/view.ctp:9 Template/StateUsers/add.ctp:9 -#: Template/StateUsers/edit.ctp:9 Template/StateUsers/index.ctp:9 -#: Template/StateUsers/index.ctp:36 Template/StateUsers/view.ctp:9 -#: Template/StateUsers/view.ctp:34 Template/StateUsers/view.ctp:58 -#: Template/StateUsers/view.ctp:89 Template/StateUsers/view.ctp:122 -#: Template/TransactionCreations/add.ctp:9 -#: Template/TransactionCreations/edit.ctp:9 -#: Template/TransactionCreations/index.ctp:9 -#: Template/TransactionCreations/index.ctp:28 -#: Template/TransactionCreations/view.ctp:9 -#: Template/TransactionGroupAddaddress/add.ctp:9 -#: Template/TransactionGroupAddaddress/edit.ctp:9 -#: Template/TransactionGroupAddaddress/index.ctp:9 -#: Template/TransactionGroupAddaddress/index.ctp:26 -#: Template/TransactionGroupAddaddress/view.ctp:9 -#: Template/TransactionGroupAllowtrades/add.ctp:9 -#: Template/TransactionGroupAllowtrades/edit.ctp:9 -#: Template/TransactionGroupAllowtrades/index.ctp:9 -#: Template/TransactionGroupAllowtrades/index.ctp:24 -#: Template/TransactionGroupAllowtrades/view.ctp:9 -#: Template/TransactionGroupCreates/add.ctp:9 -#: Template/TransactionGroupCreates/edit.ctp:9 -#: Template/TransactionGroupCreates/index.ctp:9 -#: Template/TransactionGroupCreates/index.ctp:26 -#: Template/TransactionGroupCreates/view.ctp:9 -#: Template/TransactionSendCoins/add.ctp:9 -#: Template/TransactionSendCoins/edit.ctp:9 -#: Template/TransactionSendCoins/index.ctp:9 -#: Template/TransactionSendCoins/index.ctp:28 -#: Template/TransactionSendCoins/view.ctp:9 -#: Template/TransactionSignatures/add.ctp:9 -#: Template/TransactionSignatures/edit.ctp:9 -#: Template/TransactionSignatures/index.ctp:9 -#: Template/TransactionSignatures/index.ctp:22 -#: Template/TransactionSignatures/view.ctp:9 -#: Template/TransactionTypes/add.ctp:9 Template/TransactionTypes/edit.ctp:9 -#: Template/TransactionTypes/index.ctp:9 Template/TransactionTypes/index.ctp:23 -#: Template/TransactionTypes/view.ctp:9 Template/TransactionTypes/view.ctp:44 -#: Template/Transactions/add.ctp:9 Template/Transactions/edit.ctp:9 -#: Template/Transactions/index.ctp:9 Template/Transactions/view.ctp:9 -#: Template/Transactions/view.ctp:66 Template/Transactions/view.ctp:97 -#: Template/Transactions/view.ctp:125 Template/Transactions/view.ctp:152 -#: Template/Transactions/view.ctp:180 Template/Transactions/view.ctp:211 -#: Template/Transactions/view.ctp:241 Template/Users/add.ctp:9 -#: Template/Users/edit.ctp:9 Template/Users/index.ctp:9 -#: Template/Users/index.ctp:26 Template/Users/view.ctp:9 -msgid "Actions" -msgstr "" - -#: Template/AddressTypes/add.ctp:10 Template/AddressTypes/edit.ctp:16 -#: Template/AddressTypes/view.ctp:12 Template/StateGroupAddresses/add.ctp:13 -#: Template/StateGroupAddresses/edit.ctp:19 -#: Template/StateGroupAddresses/index.ctp:13 -#: Template/StateGroupAddresses/view.ctp:16 -#: Template/TransactionGroupAddaddress/add.ctp:13 -#: Template/TransactionGroupAddaddress/edit.ctp:19 -#: Template/TransactionGroupAddaddress/index.ctp:13 -#: Template/TransactionGroupAddaddress/view.ctp:16 -msgid "List Address Types" -msgstr "" - -#: Template/AddressTypes/add.ctp:11 Template/AddressTypes/edit.ctp:17 -#: Template/AddressTypes/index.ctp:11 Template/AddressTypes/view.ctp:14 -#: Template/StateGroupAddresses/add.ctp:10 -#: Template/StateGroupAddresses/edit.ctp:16 -#: Template/StateGroupAddresses/view.ctp:12 Template/StateGroups/add.ctp:11 -#: Template/StateGroups/edit.ctp:17 Template/StateGroups/index.ctp:11 -#: Template/StateGroups/view.ctp:14 -msgid "List State Group Addresses" -msgstr "" - -#: Template/AddressTypes/add.ctp:12 Template/AddressTypes/edit.ctp:18 -#: Template/AddressTypes/index.ctp:12 Template/AddressTypes/view.ctp:15 -#: Template/StateGroupAddresses/index.ctp:10 -#: Template/StateGroupAddresses/view.ctp:13 Template/StateGroups/add.ctp:12 -#: Template/StateGroups/edit.ctp:18 Template/StateGroups/index.ctp:12 -#: Template/StateGroups/view.ctp:15 -msgid "New State Group Address" -msgstr "" - -#: Template/AddressTypes/add.ctp:13 Template/AddressTypes/edit.ctp:19 -#: Template/AddressTypes/index.ctp:13 Template/AddressTypes/view.ctp:16 -#: Template/TransactionGroupAddaddress/add.ctp:10 -#: Template/TransactionGroupAddaddress/edit.ctp:16 -#: Template/TransactionGroupAddaddress/view.ctp:12 -#: Template/Transactions/add.ctp:19 Template/Transactions/edit.ctp:25 -#: Template/Transactions/index.ctp:19 Template/Transactions/view.ctp:22 -msgid "List Transaction Group Addaddress" -msgstr "" - -#: Template/AddressTypes/add.ctp:14 Template/AddressTypes/edit.ctp:20 -#: Template/AddressTypes/index.ctp:14 Template/AddressTypes/view.ctp:17 -#: Template/TransactionGroupAddaddress/index.ctp:10 -#: Template/TransactionGroupAddaddress/view.ctp:13 -#: Template/Transactions/add.ctp:20 Template/Transactions/edit.ctp:26 -#: Template/Transactions/index.ctp:20 Template/Transactions/view.ctp:23 -msgid "New Transaction Group Addaddres" -msgstr "" - -#: Template/AddressTypes/add.ctp:20 -msgid "Add Address Type" -msgstr "" - -#: Template/AddressTypes/add.ctp:26 Template/AddressTypes/edit.ctp:32 -#: Template/AdminErrors/add.ctp:28 Template/AdminErrors/edit.ctp:34 -#: Template/BlockchainTypes/add.ctp:23 Template/BlockchainTypes/edit.ctp:29 -#: Template/CommunityProfiles/add.ctp:22 Template/CommunityProfiles/edit.ctp:28 -#: Template/ElopageBuys/add.ctp:31 Template/ElopageBuys/edit.ctp:37 -#: Template/OperatorTypes/add.ctp:24 Template/OperatorTypes/edit.ctp:30 -#: Template/Operators/add.ctp:24 Template/Operators/edit.ctp:30 -#: Template/Roles/add.ctp:21 Template/Roles/edit.ctp:27 -#: Template/ServerUsers/add.ctp:24 Template/ServerUsers/edit.ctp:32 -#: Template/StateBalances/add.ctp:25 Template/StateBalances/edit.ctp:31 -#: Template/StateCreated/add.ctp:29 Template/StateCreated/edit.ctp:35 -#: Template/StateErrors/add.ctp:27 Template/StateErrors/edit.ctp:33 -#: Template/StateGroupAddresses/add.ctp:26 -#: Template/StateGroupAddresses/edit.ctp:32 -#: Template/StateGroupRelationships/add.ctp:23 -#: Template/StateGroupRelationships/edit.ctp:29 Template/StateGroups/add.ctp:30 -#: Template/StateGroups/edit.ctp:36 Template/StateRelationshipTypes/add.ctp:22 -#: Template/StateRelationshipTypes/edit.ctp:28 -#: Template/StateUserTransactions/add.ctp:29 -#: Template/StateUserTransactions/edit.ctp:35 Template/StateUsers/add.ctp:32 -#: Template/StateUsers/edit.ctp:37 Template/TransactionCreations/add.ctp:27 -#: Template/TransactionCreations/edit.ctp:33 -#: Template/TransactionGroupAddaddress/add.ctp:26 -#: Template/TransactionGroupAddaddress/edit.ctp:32 -#: Template/TransactionGroupAllowtrades/add.ctp:25 -#: Template/TransactionGroupAllowtrades/edit.ctp:31 -#: Template/TransactionGroupCreates/add.ctp:27 -#: Template/TransactionGroupCreates/edit.ctp:33 -#: Template/TransactionSendCoins/add.ctp:28 -#: Template/TransactionSendCoins/edit.ctp:34 -#: Template/TransactionSignatures/add.ctp:23 -#: Template/TransactionSignatures/edit.ctp:29 -#: Template/TransactionTypes/add.ctp:24 Template/TransactionTypes/edit.ctp:30 -#: Template/Transactions/add.ctp:42 Template/Transactions/edit.ctp:47 -#: Template/Users/add.ctp:26 Template/Users/edit.ctp:32 -msgid "Submit" -msgstr "" - -#: Template/AddressTypes/edit.ctp:11 Template/AddressTypes/index.ctp:37 -#: Template/AddressTypes/view.ctp:56 Template/AddressTypes/view.ctp:85 -#: Template/AdminErrors/edit.ctp:11 Template/AdminErrors/index.ctp:43 -#: Template/BlockchainTypes/edit.ctp:11 Template/BlockchainTypes/index.ctp:35 -#: Template/CommunityProfiles/edit.ctp:11 -#: Template/CommunityProfiles/index.ctp:33 Template/ElopageBuys/edit.ctp:11 -#: Template/OperatorTypes/index.ctp:35 Template/OperatorTypes/view.ctp:54 -#: Template/Operators/edit.ctp:11 Template/Operators/index.ctp:40 -#: Template/Roles/edit.ctp:11 Template/Roles/index.ctp:31 -#: Template/ServerUsers/edit.ctp:11 Template/ServerUsers/index.ctp:43 -#: Template/StateBalances/edit.ctp:11 Template/StateBalances/index.ctp:38 -#: Template/StateCreated/edit.ctp:11 Template/StateCreated/index.ctp:45 -#: Template/StateErrors/edit.ctp:11 Template/StateErrors/index.ctp:39 -#: Template/StateErrors/show_for_user.ctp:44 -#: Template/StateGroupAddresses/edit.ctp:11 -#: Template/StateGroupAddresses/index.ctp:39 -#: Template/StateGroupRelationships/edit.ctp:11 -#: Template/StateGroupRelationships/index.ctp:35 -#: Template/StateGroups/edit.ctp:11 Template/StateGroups/index.ctp:41 -#: Template/StateGroups/view.ctp:60 Template/StateGroups/view.ctp:87 -#: Template/StateGroups/view.ctp:116 Template/StateGroups/view.ctp:145 -#: Template/StateRelationshipTypes/edit.ctp:11 -#: Template/StateRelationshipTypes/index.ctp:33 -#: Template/StateUserRoles/index.ctp:53 -#: Template/StateUserTransactions/edit.ctp:11 -#: Template/StateUserTransactions/index.ctp:41 Template/StateUsers/edit.ctp:11 -#: Template/StateUsers/index.ctp:53 Template/TransactionCreations/edit.ctp:11 -#: Template/TransactionGroupAddaddress/edit.ctp:11 -#: Template/TransactionGroupAddaddress/index.ctp:39 -#: Template/TransactionGroupAllowtrades/edit.ctp:11 -#: Template/TransactionGroupAllowtrades/index.ctp:37 -#: Template/TransactionGroupCreates/edit.ctp:11 -#: Template/TransactionGroupCreates/index.ctp:39 -#: Template/TransactionSendCoins/edit.ctp:11 -#: Template/TransactionSignatures/edit.ctp:11 -#: Template/TransactionSignatures/index.ctp:33 -#: Template/TransactionTypes/edit.ctp:11 Template/TransactionTypes/index.ctp:35 -#: Template/TransactionTypes/view.ctp:56 Template/Transactions/edit.ctp:11 -#: Template/Transactions/view.ctp:80 Template/Transactions/view.ctp:109 -#: Template/Transactions/view.ctp:136 Template/Transactions/view.ctp:163 -#: Template/Transactions/view.ctp:192 Template/Transactions/view.ctp:225 -#: Template/Transactions/view.ctp:252 Template/Users/edit.ctp:11 -#: Template/Users/index.ctp:43 -msgid "Delete" -msgstr "" - -#: Template/AddressTypes/edit.ctp:13 Template/AddressTypes/index.ctp:37 -#: Template/AddressTypes/view.ctp:11 Template/AddressTypes/view.ctp:56 -#: Template/AddressTypes/view.ctp:85 Template/AdminErrors/edit.ctp:13 -#: Template/AdminErrors/index.ctp:43 Template/AdminErrors/view.ctp:11 -#: Template/BlockchainTypes/edit.ctp:13 Template/BlockchainTypes/index.ctp:35 -#: Template/BlockchainTypes/view.ctp:11 Template/CommunityProfiles/edit.ctp:13 -#: Template/CommunityProfiles/index.ctp:33 -#: Template/CommunityProfiles/view.ctp:11 Template/ElopageBuys/edit.ctp:13 -#: Template/ElopageBuys/index.ctp:51 Template/ElopageBuys/view.ctp:11 -#: Template/OperatorTypes/index.ctp:35 Template/OperatorTypes/view.ctp:11 -#: Template/OperatorTypes/view.ctp:54 Template/Operators/edit.ctp:13 -#: Template/Operators/index.ctp:40 Template/Operators/view.ctp:11 -#: Template/Roles/edit.ctp:13 Template/Roles/index.ctp:31 -#: Template/Roles/view.ctp:11 Template/ServerUsers/edit.ctp:13 -#: Template/ServerUsers/index.ctp:43 Template/ServerUsers/view.ctp:11 -#: Template/StateBalances/edit.ctp:13 Template/StateBalances/index.ctp:38 -#: Template/StateBalances/view.ctp:11 Template/StateCreated/edit.ctp:13 -#: Template/StateCreated/index.ctp:45 Template/StateCreated/view.ctp:11 -#: Template/StateErrors/edit.ctp:13 Template/StateErrors/index.ctp:39 -#: Template/StateErrors/view.ctp:11 Template/StateGroupAddresses/edit.ctp:13 -#: Template/StateGroupAddresses/index.ctp:39 -#: Template/StateGroupAddresses/view.ctp:11 -#: Template/StateGroupRelationships/edit.ctp:13 -#: Template/StateGroupRelationships/index.ctp:35 -#: Template/StateGroupRelationships/view.ctp:11 -#: Template/StateGroups/edit.ctp:13 Template/StateGroups/index.ctp:41 -#: Template/StateGroups/view.ctp:11 Template/StateGroups/view.ctp:60 -#: Template/StateGroups/view.ctp:87 Template/StateGroups/view.ctp:116 -#: Template/StateGroups/view.ctp:145 -#: Template/StateRelationshipTypes/edit.ctp:13 -#: Template/StateRelationshipTypes/index.ctp:33 -#: Template/StateRelationshipTypes/view.ctp:11 -#: Template/StateUserRoles/index.ctp:53 -#: Template/StateUserTransactions/edit.ctp:13 -#: Template/StateUserTransactions/index.ctp:41 -#: Template/StateUserTransactions/view.ctp:11 Template/StateUsers/edit.ctp:13 -#: Template/StateUsers/index.ctp:53 Template/StateUsers/view.ctp:11 -#: Template/TransactionCreations/edit.ctp:13 -#: Template/TransactionCreations/view.ctp:11 -#: Template/TransactionGroupAddaddress/edit.ctp:13 -#: Template/TransactionGroupAddaddress/index.ctp:39 -#: Template/TransactionGroupAddaddress/view.ctp:11 -#: Template/TransactionGroupAllowtrades/edit.ctp:13 -#: Template/TransactionGroupAllowtrades/index.ctp:37 -#: Template/TransactionGroupAllowtrades/view.ctp:11 -#: Template/TransactionGroupCreates/edit.ctp:13 -#: Template/TransactionGroupCreates/index.ctp:39 -#: Template/TransactionGroupCreates/view.ctp:11 -#: Template/TransactionSendCoins/edit.ctp:13 -#: Template/TransactionSendCoins/view.ctp:11 -#: Template/TransactionSignatures/edit.ctp:13 -#: Template/TransactionSignatures/index.ctp:33 -#: Template/TransactionSignatures/view.ctp:11 -#: Template/TransactionTypes/edit.ctp:13 Template/TransactionTypes/index.ctp:35 -#: Template/TransactionTypes/view.ctp:11 Template/TransactionTypes/view.ctp:56 -#: Template/Transactions/edit.ctp:13 Template/Transactions/view.ctp:11 -#: Template/Transactions/view.ctp:80 Template/Transactions/view.ctp:109 -#: Template/Transactions/view.ctp:136 Template/Transactions/view.ctp:163 -#: Template/Transactions/view.ctp:192 Template/Transactions/view.ctp:225 -#: Template/Transactions/view.ctp:252 Template/Users/edit.ctp:13 -#: Template/Users/index.ctp:43 Template/Users/view.ctp:11 -msgid "Are you sure you want to delete # {0}?" -msgstr "" - -#: Template/AddressTypes/edit.ctp:26 Template/AddressTypes/view.ctp:10 -msgid "Edit Address Type" -msgstr "" - -#: Template/AddressTypes/index.ctp:10 Template/AddressTypes/view.ctp:13 -#: Template/StateGroupAddresses/add.ctp:14 -#: Template/StateGroupAddresses/edit.ctp:20 -#: Template/StateGroupAddresses/index.ctp:14 -#: Template/StateGroupAddresses/view.ctp:17 -#: Template/TransactionGroupAddaddress/add.ctp:14 -#: Template/TransactionGroupAddaddress/edit.ctp:20 -#: Template/TransactionGroupAddaddress/index.ctp:14 -#: Template/TransactionGroupAddaddress/view.ctp:17 -msgid "New Address Type" -msgstr "" - -#: Template/AddressTypes/index.ctp:18 -msgid "Address Types" -msgstr "" - -#: Template/AddressTypes/index.ctp:35 Template/AddressTypes/view.ctp:54 -#: Template/AddressTypes/view.ctp:83 Template/AdminErrors/index.ctp:39 -#: Template/BlockchainTypes/index.ctp:33 -#: Template/CommunityProfiles/index.ctp:31 Template/ElopageBuys/index.ctp:49 -#: Template/OperatorTypes/view.ctp:52 Template/Operators/index.ctp:38 -#: Template/Roles/index.ctp:29 Template/ServerUsers/index.ctp:41 -#: Template/StateBalances/index.ctp:36 Template/StateCreated/index.ctp:43 -#: Template/StateErrors/index.ctp:37 Template/StateGroupAddresses/index.ctp:37 -#: Template/StateGroupRelationships/index.ctp:33 -#: Template/StateGroups/index.ctp:39 Template/StateGroups/view.ctp:58 -#: Template/StateGroups/view.ctp:85 Template/StateGroups/view.ctp:114 -#: Template/StateGroups/view.ctp:143 -#: Template/StateRelationshipTypes/index.ctp:31 -#: Template/StateUserRoles/index.ctp:51 -#: Template/StateUserTransactions/index.ctp:39 Template/StateUsers/index.ctp:51 -#: Template/StateUsers/view.ctp:41 Template/StateUsers/view.ctp:71 -#: Template/StateUsers/view.ctp:104 Template/StateUsers/view.ctp:136 -#: Template/TransactionCreations/index.ctp:42 -#: Template/TransactionGroupAddaddress/index.ctp:37 -#: Template/TransactionGroupAllowtrades/index.ctp:35 -#: Template/TransactionGroupCreates/index.ctp:37 -#: Template/TransactionSendCoins/index.ctp:41 -#: Template/TransactionSignatures/index.ctp:31 -#: Template/TransactionTypes/index.ctp:33 Template/TransactionTypes/view.ctp:54 -#: Template/Transactions/view.ctp:78 Template/Transactions/view.ctp:107 -#: Template/Transactions/view.ctp:134 Template/Transactions/view.ctp:161 -#: Template/Transactions/view.ctp:190 Template/Transactions/view.ctp:223 -#: Template/Transactions/view.ctp:250 Template/Users/index.ctp:41 -msgid "View" -msgstr "" - -#: Template/AddressTypes/index.ctp:36 Template/AddressTypes/view.ctp:55 -#: Template/AddressTypes/view.ctp:84 Template/AdminErrors/index.ctp:41 -#: Template/BlockchainTypes/index.ctp:34 -#: Template/CommunityProfiles/index.ctp:32 Template/ElopageBuys/index.ctp:50 -#: Template/OperatorTypes/view.ctp:53 Template/Operators/index.ctp:39 -#: Template/Roles/index.ctp:30 Template/ServerUsers/index.ctp:42 -#: Template/StateBalances/index.ctp:37 Template/StateCreated/index.ctp:44 -#: Template/StateErrors/index.ctp:38 Template/StateGroupAddresses/index.ctp:38 -#: Template/StateGroupRelationships/index.ctp:34 -#: Template/StateGroups/index.ctp:40 Template/StateGroups/view.ctp:59 -#: Template/StateGroups/view.ctp:86 Template/StateGroups/view.ctp:115 -#: Template/StateGroups/view.ctp:144 -#: Template/StateRelationshipTypes/index.ctp:32 -#: Template/StateUserRoles/index.ctp:52 -#: Template/StateUserTransactions/index.ctp:40 Template/StateUsers/index.ctp:52 -#: Template/TransactionGroupAddaddress/index.ctp:38 -#: Template/TransactionGroupAllowtrades/index.ctp:36 -#: Template/TransactionGroupCreates/index.ctp:38 -#: Template/TransactionSignatures/index.ctp:32 -#: Template/TransactionTypes/index.ctp:34 Template/TransactionTypes/view.ctp:55 -#: Template/Transactions/view.ctp:79 Template/Transactions/view.ctp:108 -#: Template/Transactions/view.ctp:135 Template/Transactions/view.ctp:162 -#: Template/Transactions/view.ctp:191 Template/Transactions/view.ctp:224 -#: Template/Transactions/view.ctp:251 Template/Users/index.ctp:42 -msgid "Edit" -msgstr "" - -#: Template/AddressTypes/index.ctp:45 Template/AdminErrors/index.ctp:50 -#: Template/BlockchainTypes/index.ctp:43 -#: Template/CommunityProfiles/index.ctp:41 Template/ElopageBuys/index.ctp:59 -#: Template/Operators/index.ctp:48 Template/Roles/index.ctp:39 -#: Template/ServerUsers/index.ctp:51 Template/StateBalances/index.ctp:46 -#: Template/StateCreated/index.ctp:53 Template/StateErrors/index.ctp:47 -#: Template/StateGroupAddresses/index.ctp:47 -#: Template/StateGroupRelationships/index.ctp:43 -#: Template/StateGroups/index.ctp:49 -#: Template/StateRelationshipTypes/index.ctp:41 -#: Template/StateUserRoles/index.ctp:61 -#: Template/StateUserTransactions/index.ctp:49 Template/StateUsers/index.ctp:61 -#: Template/TransactionCreations/index.ctp:50 -#: Template/TransactionGroupAddaddress/index.ctp:47 -#: Template/TransactionGroupAllowtrades/index.ctp:45 -#: Template/TransactionGroupCreates/index.ctp:47 -#: Template/TransactionSendCoins/index.ctp:49 -#: Template/TransactionSignatures/index.ctp:41 -#: Template/TransactionTypes/index.ctp:43 Template/Transactions/index.ctp:50 -#: Template/Users/index.ctp:51 -msgid "first" -msgstr "" - -#: Template/AddressTypes/index.ctp:46 Template/AdminErrors/index.ctp:51 -#: Template/BlockchainTypes/index.ctp:44 -#: Template/CommunityProfiles/index.ctp:42 Template/ElopageBuys/index.ctp:60 -#: Template/Operators/index.ctp:49 Template/Roles/index.ctp:40 -#: Template/ServerUsers/index.ctp:52 Template/StateBalances/index.ctp:47 -#: Template/StateCreated/index.ctp:54 Template/StateErrors/index.ctp:48 -#: Template/StateGroupAddresses/index.ctp:48 -#: Template/StateGroupRelationships/index.ctp:44 -#: Template/StateGroups/index.ctp:50 -#: Template/StateRelationshipTypes/index.ctp:42 -#: Template/StateUserRoles/index.ctp:62 -#: Template/StateUserTransactions/index.ctp:50 Template/StateUsers/index.ctp:62 -#: Template/TransactionCreations/index.ctp:51 -#: Template/TransactionGroupAddaddress/index.ctp:48 -#: Template/TransactionGroupAllowtrades/index.ctp:46 -#: Template/TransactionGroupCreates/index.ctp:48 -#: Template/TransactionSendCoins/index.ctp:50 -#: Template/TransactionSignatures/index.ctp:42 -#: Template/TransactionTypes/index.ctp:44 Template/Transactions/index.ctp:51 -#: Template/Users/index.ctp:52 -msgid "previous" -msgstr "" - -#: Template/AddressTypes/index.ctp:48 Template/AdminErrors/index.ctp:53 -#: Template/BlockchainTypes/index.ctp:46 -#: Template/CommunityProfiles/index.ctp:44 Template/ElopageBuys/index.ctp:62 -#: Template/Operators/index.ctp:51 Template/Roles/index.ctp:42 -#: Template/ServerUsers/index.ctp:54 Template/StateBalances/index.ctp:49 -#: Template/StateCreated/index.ctp:56 Template/StateErrors/index.ctp:50 -#: Template/StateGroupAddresses/index.ctp:50 -#: Template/StateGroupRelationships/index.ctp:46 -#: Template/StateGroups/index.ctp:52 -#: Template/StateRelationshipTypes/index.ctp:44 -#: Template/StateUserRoles/index.ctp:64 -#: Template/StateUserTransactions/index.ctp:52 Template/StateUsers/index.ctp:64 -#: Template/TransactionCreations/index.ctp:53 -#: Template/TransactionGroupAddaddress/index.ctp:50 -#: Template/TransactionGroupAllowtrades/index.ctp:48 -#: Template/TransactionGroupCreates/index.ctp:50 -#: Template/TransactionSendCoins/index.ctp:52 -#: Template/TransactionSignatures/index.ctp:44 -#: Template/TransactionTypes/index.ctp:46 Template/Transactions/index.ctp:53 -#: Template/Users/index.ctp:54 -msgid "next" -msgstr "" - -#: Template/AddressTypes/index.ctp:49 Template/AdminErrors/index.ctp:54 -#: Template/BlockchainTypes/index.ctp:47 -#: Template/CommunityProfiles/index.ctp:45 Template/ElopageBuys/index.ctp:63 -#: Template/Operators/index.ctp:52 Template/Roles/index.ctp:43 -#: Template/ServerUsers/index.ctp:55 Template/StateBalances/index.ctp:50 -#: Template/StateCreated/index.ctp:57 Template/StateErrors/index.ctp:51 -#: Template/StateGroupAddresses/index.ctp:51 -#: Template/StateGroupRelationships/index.ctp:47 -#: Template/StateGroups/index.ctp:53 -#: Template/StateRelationshipTypes/index.ctp:45 -#: Template/StateUserRoles/index.ctp:65 -#: Template/StateUserTransactions/index.ctp:53 Template/StateUsers/index.ctp:65 -#: Template/TransactionCreations/index.ctp:54 -#: Template/TransactionGroupAddaddress/index.ctp:51 -#: Template/TransactionGroupAllowtrades/index.ctp:49 -#: Template/TransactionGroupCreates/index.ctp:51 -#: Template/TransactionSendCoins/index.ctp:53 -#: Template/TransactionSignatures/index.ctp:45 -#: Template/TransactionTypes/index.ctp:47 Template/Transactions/index.ctp:54 -#: Template/Users/index.ctp:55 -msgid "last" -msgstr "" - -#: Template/AddressTypes/index.ctp:51 Template/AdminErrors/index.ctp:56 -#: Template/BlockchainTypes/index.ctp:49 -#: Template/CommunityProfiles/index.ctp:47 Template/ElopageBuys/index.ctp:65 -#: Template/Operators/index.ctp:54 Template/Roles/index.ctp:45 -#: Template/ServerUsers/index.ctp:57 Template/StateBalances/index.ctp:52 -#: Template/StateCreated/index.ctp:59 Template/StateErrors/index.ctp:53 -#: Template/StateGroupAddresses/index.ctp:53 -#: Template/StateGroupRelationships/index.ctp:49 -#: Template/StateGroups/index.ctp:55 -#: Template/StateRelationshipTypes/index.ctp:47 -#: Template/StateUserRoles/index.ctp:67 -#: Template/StateUserTransactions/index.ctp:55 Template/StateUsers/index.ctp:67 -#: Template/TransactionCreations/index.ctp:56 -#: Template/TransactionGroupAddaddress/index.ctp:53 -#: Template/TransactionGroupAllowtrades/index.ctp:51 -#: Template/TransactionGroupCreates/index.ctp:53 -#: Template/TransactionSendCoins/index.ctp:55 -#: Template/TransactionSignatures/index.ctp:47 -#: Template/TransactionTypes/index.ctp:49 Template/Transactions/index.ctp:56 -#: Template/Users/index.ctp:57 -msgid "" -"Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} " -"total" -msgstr "" - -#: Template/AddressTypes/view.ctp:11 -msgid "Delete Address Type" -msgstr "" - -#: Template/AddressTypes/view.ctp:24 Template/BlockchainTypes/view.ctp:20 -#: Template/OperatorTypes/view.ctp:22 Template/StateGroups/view.ctp:28 -#: Template/StateGroups/view.ctp:103 -#: Template/StateRelationshipTypes/view.ctp:20 -#: Template/TransactionGroupCreates/view.ctp:32 -#: Template/TransactionTypes/view.ctp:22 Template/Transactions/view.ctp:179 -#: Template/Users/statistics.ctp:64 -msgid "Name" -msgstr "" - -#: Template/AddressTypes/view.ctp:28 Template/BlockchainTypes/view.ctp:24 -#: Template/OperatorTypes/view.ctp:26 -#: Template/StateRelationshipTypes/view.ctp:24 -#: Template/TransactionTypes/view.ctp:26 -msgid "Text" -msgstr "" - -#: Template/AddressTypes/view.ctp:32 Template/AddressTypes/view.ctp:41 -#: Template/AddressTypes/view.ctp:68 Template/AdminErrors/view.ctp:46 -#: Template/BlockchainTypes/view.ctp:32 Template/CommunityProfiles/view.ctp:24 -#: Template/OperatorTypes/view.ctp:30 Template/OperatorTypes/view.ctp:39 -#: Template/Operators/view.ctp:32 Template/Roles/view.ctp:24 -#: Template/ServerUsers/view.ctp:36 Template/StateBalances/view.ctp:27 -#: Template/StateCreated/view.ctp:32 Template/StateErrors/view.ctp:32 -#: Template/StateGroupAddresses/view.ctp:28 -#: Template/StateGroupRelationships/view.ctp:20 -#: Template/StateGroups/view.ctp:32 Template/StateGroups/view.ctp:45 -#: Template/StateGroups/view.ctp:72 Template/StateGroups/view.ctp:99 -#: Template/StateGroups/view.ctp:128 -#: Template/StateRelationshipTypes/view.ctp:28 -#: Template/StateUserTransactions/view.ctp:38 -#: Template/TransactionCreations/view.ctp:32 -#: Template/TransactionGroupAddaddress/view.ctp:32 -#: Template/TransactionGroupAllowtrades/view.ctp:26 -#: Template/TransactionGroupCreates/view.ctp:36 -#: Template/TransactionSendCoins/view.ctp:32 -#: Template/TransactionSignatures/view.ctp:26 -#: Template/TransactionTypes/view.ctp:30 Template/TransactionTypes/view.ctp:39 -#: Template/Transactions/view.ctp:46 Template/Transactions/view.ctp:59 -#: Template/Transactions/view.ctp:92 Template/Transactions/view.ctp:121 -#: Template/Transactions/view.ctp:148 Template/Transactions/view.ctp:175 -#: Template/Transactions/view.ctp:204 Template/Transactions/view.ctp:237 -#: Template/Users/view.ctp:36 -msgid "Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:37 Template/StateGroups/view.ctp:41 -msgid "Related State Group Addresses" -msgstr "" - -#: Template/AddressTypes/view.ctp:42 Template/StateGroupAddresses/view.ctp:32 -#: Template/TransactionGroupAllowtrades/view.ctp:30 -#: Template/Transactions/view.ctp:150 -msgid "Group Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:43 Template/AddressTypes/view.ctp:72 -#: Template/StateGroups/view.ctp:47 Template/StateGroups/view.ctp:75 -#: Template/Transactions/view.ctp:124 -msgid "Public Key" -msgstr "" - -#: Template/AddressTypes/view.ctp:44 Template/AddressTypes/view.ctp:70 -#: Template/StateGroups/view.ctp:48 Template/Transactions/view.ctp:123 -msgid "Address Type Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:64 Template/Transactions/view.ctp:117 -msgid "Related Transaction Group Addaddress" -msgstr "" - -#: Template/AddressTypes/view.ctp:69 Template/StateGroups/view.ctp:100 -#: Template/Transactions/view.ctp:60 Template/Transactions/view.ctp:93 -#: Template/Transactions/view.ctp:122 Template/Transactions/view.ctp:149 -#: Template/Transactions/view.ctp:176 Template/Transactions/view.ctp:205 -#: Template/Transactions/view.ctp:238 -msgid "Transaction Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:71 -msgid "Remove From Group" -msgstr "" - -#: Template/AdminErrors/add.ctp:10 Template/AdminErrors/edit.ctp:16 -#: Template/AdminErrors/view.ctp:12 -msgid "List Admin Errors" -msgstr "" - -#: Template/AdminErrors/add.ctp:11 Template/AdminErrors/edit.ctp:17 -#: Template/AdminErrors/index.ctp:11 Template/AdminErrors/view.ctp:14 -#: Template/StateBalances/add.ctp:11 Template/StateBalances/edit.ctp:17 -#: Template/StateBalances/index.ctp:11 Template/StateBalances/view.ctp:14 -#: Template/StateCreated/add.ctp:13 Template/StateCreated/edit.ctp:19 -#: Template/StateCreated/index.ctp:13 Template/StateCreated/view.ctp:16 -#: Template/StateErrors/add.ctp:11 Template/StateErrors/edit.ctp:17 -#: Template/StateErrors/index.ctp:11 Template/StateErrors/view.ctp:14 -#: Template/StateGroups/add.ctp:13 Template/StateGroups/edit.ctp:19 -#: Template/StateGroups/index.ctp:13 Template/StateGroups/view.ctp:16 -#: Template/StateUserTransactions/add.ctp:11 -#: Template/StateUserTransactions/edit.ctp:17 -#: Template/StateUserTransactions/index.ctp:11 -#: Template/StateUserTransactions/view.ctp:14 Template/StateUsers/add.ctp:10 -#: Template/StateUsers/edit.ctp:16 Template/StateUsers/view.ctp:12 -#: Template/TransactionCreations/add.ctp:13 -#: Template/TransactionCreations/edit.ctp:19 -#: Template/TransactionCreations/index.ctp:13 -#: Template/TransactionCreations/view.ctp:16 -#: Template/TransactionSendCoins/add.ctp:13 -#: Template/TransactionSendCoins/edit.ctp:19 -#: Template/TransactionSendCoins/index.ctp:13 -#: Template/TransactionSendCoins/view.ctp:16 -msgid "List State Users" -msgstr "" - -#: Template/AdminErrors/add.ctp:12 Template/AdminErrors/edit.ctp:18 -#: Template/AdminErrors/index.ctp:12 Template/AdminErrors/view.ctp:15 -#: Template/StateBalances/add.ctp:12 Template/StateBalances/edit.ctp:18 -#: Template/StateBalances/index.ctp:12 Template/StateBalances/view.ctp:15 -#: Template/StateCreated/add.ctp:14 Template/StateCreated/edit.ctp:20 -#: Template/StateCreated/index.ctp:14 Template/StateCreated/view.ctp:17 -#: Template/StateErrors/add.ctp:12 Template/StateErrors/edit.ctp:18 -#: Template/StateErrors/index.ctp:12 Template/StateErrors/view.ctp:15 -#: Template/StateGroups/add.ctp:14 Template/StateGroups/edit.ctp:20 -#: Template/StateGroups/index.ctp:14 Template/StateGroups/view.ctp:17 -#: Template/StateUserRoles/index.ctp:10 -#: Template/StateUserTransactions/add.ctp:12 -#: Template/StateUserTransactions/edit.ctp:18 -#: Template/StateUserTransactions/index.ctp:12 -#: Template/StateUserTransactions/view.ctp:15 Template/StateUsers/index.ctp:10 -#: Template/StateUsers/view.ctp:13 Template/TransactionCreations/add.ctp:14 -#: Template/TransactionCreations/edit.ctp:20 -#: Template/TransactionCreations/index.ctp:14 -#: Template/TransactionCreations/view.ctp:17 -#: Template/TransactionSendCoins/add.ctp:14 -#: Template/TransactionSendCoins/edit.ctp:20 -#: Template/TransactionSendCoins/index.ctp:14 -#: Template/TransactionSendCoins/view.ctp:17 -msgid "New State User" -msgstr "" - -#: Template/AdminErrors/add.ctp:18 -msgid "Add Admin Error" -msgstr "" - -#: Template/AdminErrors/edit.ctp:24 Template/AdminErrors/view.ctp:10 -msgid "Edit Admin Error" -msgstr "" - -#: Template/AdminErrors/index.ctp:10 Template/AdminErrors/view.ctp:13 -msgid "New Admin Error" -msgstr "" - -#: Template/AdminErrors/view.ctp:11 -msgid "Delete Admin Error" -msgstr "" - -#: Template/AdminErrors/view.ctp:22 Template/StateBalances/view.ctp:23 -#: Template/StateCreated/view.ctp:28 Template/StateErrors/view.ctp:24 -#: Template/StateUserTransactions/view.ctp:26 -#: Template/TransactionCreations/view.ctp:28 -#: Template/TransactionSendCoins/view.ctp:28 -msgid "State User" -msgstr "" - -#: Template/AdminErrors/view.ctp:26 -msgid "Controller" -msgstr "" - -#: Template/AdminErrors/view.ctp:30 -msgid "Action" -msgstr "" - -#: Template/AdminErrors/view.ctp:34 -msgid "State" -msgstr "" - -#: Template/AdminErrors/view.ctp:38 -msgid "Msg" -msgstr "" - -#: Template/AdminErrors/view.ctp:42 -msgid "Details" -msgstr "" - -#: Template/AdminErrors/view.ctp:50 Template/ServerUsers/view.ctp:44 -#: Template/StateCreated/view.ctp:48 Template/StateErrors/view.ctp:36 -#: Template/Transactions/view.ctp:64 Template/Users/view.ctp:44 -msgid "Created" -msgstr "" - -#: Template/BlockchainTypes/add.ctp:10 Template/BlockchainTypes/edit.ctp:16 -#: Template/BlockchainTypes/view.ctp:12 -msgid "List Blockchain Types" -msgstr "" - -#: Template/BlockchainTypes/add.ctp:16 -msgid "Add Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/edit.ctp:22 Template/BlockchainTypes/view.ctp:10 -msgid "Edit Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/index.ctp:10 Template/BlockchainTypes/view.ctp:13 -msgid "New Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/index.ctp:14 -msgid "Blockchain Types" -msgstr "" - -#: Template/BlockchainTypes/view.ctp:11 -msgid "Delete Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/view.ctp:28 -msgid "Symbol" -msgstr "" - -#: Template/CommunityProfiles/add.ctp:10 Template/CommunityProfiles/edit.ctp:16 -#: Template/CommunityProfiles/view.ctp:12 -msgid "List Community Profiles" -msgstr "" - -#: Template/CommunityProfiles/add.ctp:16 -msgid "Add Community Profile" -msgstr "" - -#: Template/CommunityProfiles/edit.ctp:22 -#: Template/CommunityProfiles/view.ctp:10 -msgid "Edit Community Profile" -msgstr "" - -#: Template/CommunityProfiles/index.ctp:10 -#: Template/CommunityProfiles/view.ctp:13 -msgid "New Community Profile" -msgstr "" - -#: Template/CommunityProfiles/index.ctp:14 -msgid "Community Profiles" -msgstr "" - -#: Template/CommunityProfiles/view.ctp:11 -msgid "Delete Community Profile" -msgstr "" - -#: Template/CommunityProfiles/view.ctp:20 -msgid "Profile Desc" -msgstr "" - -#: Template/CommunityProfiles/view.ctp:28 Template/Transactions/view.ctp:63 -#: Template/Transactions/view.ctp:94 Template/Transactions/view.ctp:206 -msgid "State User Id" -msgstr "" - -#: Template/Dashboard/error_http_request.ctp:9 -msgid "Error, Please try again" -msgstr "" - -#: Template/Dashboard/error_http_request.ctp:13 Template/Layout/error.ctp:43 -msgid "Back" -msgstr "" - -#: Template/Dashboard/index.ctp:14 Template/Dashboard/index.ctp:18 -#: Template/Dashboard/server_index.ctp:9 -msgid "Willkommen" -msgstr "" - -#: Template/Dashboard/index.ctp:47 -msgid "löschen" -msgstr "" - -#: Template/Dashboard/index.ctp:51 -msgid "Adminbereich" -msgstr "" - -#: Template/Dashboard/index.ctp:57 Template/Dashboard/server_index.ctp:21 -msgid "viele schöpfen" -msgstr "" - -#: Template/Dashboard/index.ctp:70 -msgid "Anmeldungen" -msgstr "" - -#: Template/Dashboard/index.ctp:94 -msgid "suchen" -msgstr "" - -#: Template/Dashboard/index.ctp:102 -msgid "hinzufügen" -msgstr "" - -#: Template/Dashboard/index.ctp:108 -msgid "hat sein Passwort und Passphrase vergessen" -msgstr "" - -#: Template/Dashboard/index.ctp:119 -msgid "Gruppen" -msgstr "" - -#: Template/Dashboard/index.ctp:125 -msgid "Server" -msgstr "" - -#: Template/Dashboard/index.ctp:131 -msgid "Topics" -msgstr "" - -#: Template/Dashboard/index.ctp:139 -msgid "Hedera Accounts" -msgstr "" - -#: Template/Element/navi.ctp:35 -msgid "Mitgliederbereich" -msgstr "" - -#: Template/Element/navi_header.ctp:38 Template/Element/navi_notify.ctp:35 -msgid "Transaktionen sind noch zu unterzeichnen" -msgstr "" - -#: Template/Element/user_menu.ctp:22 -msgid "Abmelden" -msgstr "" - -#: Template/Element/Flash/success.ctp:9 -msgid "Info:" -msgstr "" - -#: Template/ElopageBuys/add.ctp:10 Template/ElopageBuys/edit.ctp:16 -#: Template/ElopageBuys/view.ctp:12 -msgid "List Elopage Buys" -msgstr "" - -#: Template/ElopageBuys/add.ctp:16 -msgid "Add Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/edit.ctp:22 Template/ElopageBuys/view.ctp:10 -msgid "Edit Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/index.ctp:10 Template/ElopageBuys/view.ctp:13 -msgid "New Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/index.ctp:14 -msgid "Elopage Buys" -msgstr "" - -#: Template/ElopageBuys/statistics.ctp:28 Template/Users/statistics.ctp:49 -msgid "Anmeldungen diesen Monat" -msgstr "" - -#: Template/ElopageBuys/view.ctp:11 -msgid "Delete Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/view.ctp:20 -msgid "Payer Email" -msgstr "" - -#: Template/ElopageBuys/view.ctp:24 -msgid "Publisher Email" -msgstr "" - -#: Template/ElopageBuys/view.ctp:28 -msgid "Event" -msgstr "" - -#: Template/ElopageBuys/view.ctp:36 -msgid "Elopage User Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:40 -msgid "Affiliate Program Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:44 -msgid "Publisher Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:48 -msgid "Order Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:52 -msgid "Product Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:56 -msgid "Product Price" -msgstr "" - -#: Template/ElopageBuys/view.ctp:60 -msgid "Success Date" -msgstr "" - -#: Template/ElopageBuys/view.ctp:64 -msgid "Payed" -msgstr "" - -#: Template/ElopageBuys/view.ctp:65 Template/ServerUsers/view.ctp:53 -#: Template/TransactionGroupAllowtrades/view.ctp:35 Template/Users/view.ctp:49 -msgid "Yes" -msgstr "" - -#: Template/ElopageBuys/view.ctp:65 Template/ServerUsers/view.ctp:53 -#: Template/TransactionGroupAllowtrades/view.ctp:35 Template/Users/view.ctp:49 -msgid "No" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:8 -msgid "Gradido Schöpfung" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:9 -#: Template/Email/text/notification_transaction_failed.ctp:14 -#: Template/Email/text/notification_transfer.ctp:12 -msgid "Hallo" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:11 -msgid "für dich wurden soeben {0} geschöpft." -msgstr "" - -#: Template/Email/text/notification_creation.ctp:16 -#: Template/Email/text/notification_transaction_failed.ctp:46 -#: Template/Email/text/notification_transfer.ctp:19 -msgid "Bitte antworte nicht auf diese E-Mail!" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:18 -#: Template/Email/text/notification_transaction_failed.ctp:49 -#: Template/Email/text/notification_transfer.ctp:25 -msgid "Mit freundlichen Grüßen" -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:8 -msgid "Gradido Transaktion fehlgeschlagen" -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:16 -msgid "Deine letzte Transaktion ist leider fehlgeschlagen." -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:20 -msgid "Du wolltest {0} für {1} schöpfen." -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:24 -msgid "Das Zieldatum war: " -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:26 -msgid "Du wolltest {0} an {1} senden." -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:32 -msgid "Das ist schief gelaufen: " -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:35 -msgid "Fehler beim speichern in der Datenbank. Bitte versuche es später erneut" -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:36 -msgid "Fehler beim parsen der Transaktion. Bitte versuche es später erneut" -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:8 -msgid "Gradido Überweisung" -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:14 -msgid "Du hast soeben {0} von {1} erhalten." -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:15 -msgid "{0} schreibt:" -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:20 -msgid "Wenn Du " -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:20 -msgid " per E-Mail antworten willst, schreibe stattdessen an die Adresse: " -msgstr "" - -#: Template/Layout/default.ctp:38 -msgid "Logout" -msgstr "" - -#: Template/Layout/error.ctp:35 -msgid "Error" -msgstr "" - -#: Template/Layout/frontend.ctp:95 -msgid "Datenschutzerklärung" -msgstr "" - -#: Template/Layout/frontend.ctp:96 -msgid "Impressum" -msgstr "" - -#: Template/Layout/frontend.ctp:108 -msgid "Community Server in Entwicklung" -msgstr "" - -#: Template/OperatorTypes/add.ctp:10 Template/OperatorTypes/edit.ctp:16 -#: Template/OperatorTypes/view.ctp:12 -msgid "List Operator Types" -msgstr "" - -#: Template/OperatorTypes/add.ctp:11 Template/OperatorTypes/edit.ctp:17 -#: Template/OperatorTypes/index.ctp:11 Template/OperatorTypes/view.ctp:14 -#: Template/Operators/add.ctp:10 Template/Operators/edit.ctp:16 -#: Template/Operators/view.ctp:12 -msgid "List Operators" -msgstr "" - -#: Template/OperatorTypes/add.ctp:12 Template/OperatorTypes/edit.ctp:18 -#: Template/OperatorTypes/index.ctp:12 Template/OperatorTypes/view.ctp:15 -#: Template/Operators/index.ctp:10 Template/Operators/view.ctp:13 -msgid "New Operator" -msgstr "" - -#: Template/OperatorTypes/add.ctp:18 -msgid "Add Operator Type" -msgstr "" - -#: Template/OperatorTypes/edit.ctp:24 Template/OperatorTypes/view.ctp:10 -msgid "Edit Operator Type" -msgstr "" - -#: Template/OperatorTypes/index.ctp:10 Template/OperatorTypes/view.ctp:13 -msgid "New Operator Type" -msgstr "" - -#: Template/OperatorTypes/index.ctp:16 -msgid "Operator Types" -msgstr "" - -#: Template/OperatorTypes/view.ctp:11 -msgid "Delete Operator Type" -msgstr "" - -#: Template/OperatorTypes/view.ctp:35 -msgid "Related Operators" -msgstr "" - -#: Template/OperatorTypes/view.ctp:40 Template/Operators/view.ctp:20 -#: Template/ServerUsers/view.ctp:20 -msgid "Username" -msgstr "" - -#: Template/OperatorTypes/view.ctp:41 Template/Operators/view.ctp:36 -msgid "Operator Type Id" -msgstr "" - -#: Template/OperatorTypes/view.ctp:42 Template/Operators/view.ctp:28 -msgid "Data Base64" -msgstr "" - -#: Template/Operators/add.ctp:16 -msgid "Add Operator" -msgstr "" - -#: Template/Operators/edit.ctp:22 Template/Operators/view.ctp:10 -msgid "Edit Operator" -msgstr "" - -#: Template/Operators/index.ctp:14 -msgid "Operators" -msgstr "" - -#: Template/Operators/view.ctp:11 -msgid "Delete Operator" -msgstr "" - -#: Template/Operators/view.ctp:24 -msgid "User Pubkey" -msgstr "" - -#: Template/Profile/edit.ctp:9 -msgid "Profil ändern" -msgstr "" - -#: Template/Profile/edit.ctp:18 -msgid "Vorname" -msgstr "" - -#: Template/Profile/edit.ctp:19 -msgid "Nachname" -msgstr "" - -#: Template/Profile/edit.ctp:20 -msgid "Profilbild" -msgstr "" - -#: Template/Profile/edit.ctp:25 -msgid "Beschreibung" -msgstr "" - -#: Template/Profile/edit.ctp:26 -msgid "Daten speichern" -msgstr "" - -#: Template/Roles/add.ctp:10 Template/Roles/edit.ctp:16 -#: Template/Roles/view.ctp:12 -msgid "List Roles" -msgstr "" - -#: Template/Roles/add.ctp:16 -msgid "Add Role" -msgstr "" - -#: Template/Roles/edit.ctp:22 Template/Roles/view.ctp:10 -msgid "Edit Role" -msgstr "" - -#: Template/Roles/index.ctp:10 Template/Roles/view.ctp:13 -msgid "New Role" -msgstr "" - -#: Template/Roles/index.ctp:14 -msgid "Roles" -msgstr "" - -#: Template/Roles/view.ctp:11 -msgid "Delete Role" -msgstr "" - -#: Template/Roles/view.ctp:20 -msgid "Title" -msgstr "" - -#: Template/ServerUsers/add.ctp:10 Template/ServerUsers/edit.ctp:16 -#: Template/ServerUsers/view.ctp:12 -msgid "List Server Users" -msgstr "" - -#: Template/ServerUsers/add.ctp:16 -msgid "Add Server User" -msgstr "" - -#: Template/ServerUsers/edit.ctp:22 Template/ServerUsers/view.ctp:10 -msgid "Edit Server User" -msgstr "" - -#: Template/ServerUsers/index.ctp:10 Template/ServerUsers/view.ctp:13 -msgid "New Server User" -msgstr "" - -#: Template/ServerUsers/index.ctp:14 -msgid "Server Users" -msgstr "" - -#: Template/ServerUsers/login.ctp:16 -msgid "Please enter your username and password" -msgstr "" - -#: Template/ServerUsers/login.ctp:20 -msgid "Login" -msgstr "" - -#: Template/ServerUsers/view.ctp:11 -msgid "Delete Server User" -msgstr "" - -#: Template/ServerUsers/view.ctp:24 Template/Users/view.ctp:40 -msgid "Password" -msgstr "" - -#: Template/ServerUsers/view.ctp:28 Template/Users/view.ctp:20 -msgid "Email" -msgstr "" - -#: Template/ServerUsers/view.ctp:32 Template/StateUserRoles/assign_role.ctp:45 -#: Template/StateUserRoles/search.ctp:32 -msgid "Role" -msgstr "" - -#: Template/ServerUsers/view.ctp:40 -msgid "Last Login" -msgstr "" - -#: Template/ServerUsers/view.ctp:48 Template/StateBalances/view.ctp:35 -msgid "Modified" -msgstr "" - -#: Template/ServerUsers/view.ctp:52 -msgid "Activated" -msgstr "" - -#: Template/StateBalances/add.ctp:10 Template/StateBalances/edit.ctp:16 -#: Template/StateBalances/view.ctp:12 Template/StateUserRoles/index.ctp:13 -#: Template/StateUsers/add.ctp:13 Template/StateUsers/edit.ctp:19 -#: Template/StateUsers/index.ctp:13 Template/StateUsers/view.ctp:16 -msgid "List State Balances" -msgstr "" - -#: Template/StateBalances/add.ctp:19 -msgid "Add State Balance" -msgstr "" - -#: Template/StateBalances/edit.ctp:25 Template/StateBalances/view.ctp:10 -msgid "Edit State Balance" -msgstr "" - -#: Template/StateBalances/index.ctp:10 Template/StateBalances/view.ctp:13 -#: Template/StateUserRoles/index.ctp:14 Template/StateUsers/add.ctp:14 -#: Template/StateUsers/edit.ctp:20 Template/StateUsers/index.ctp:14 -#: Template/StateUsers/view.ctp:17 -msgid "New State Balance" -msgstr "" - -#: Template/StateBalances/index.ctp:16 -msgid "State Balances" -msgstr "" - -#: Template/StateBalances/overview.ctp:10 -msgid "Aktueller Kontostand: " -msgstr "" - -#: Template/StateBalances/overview.ctp:34 -msgid "Absender" -msgstr "" - -#: Template/StateBalances/overview.ctp:35 Template/StateUsers/view.ctp:57 -#: Template/StateUsers/view.ctp:87 Template/StateUsers/view.ctp:121 -#: Template/TransactionSendCoins/create.ctp:21 -#: Template/TransactionSendCoins/create_raw.ctp:32 -msgid "Verwendungszweck" -msgstr "" - -#: Template/StateBalances/overview.ctp:36 -#: Template/StateBalances/overview_gdt.ctp:42 -#: Template/StateBalances/overview_gdt.ctp:75 -msgid "Datum" -msgstr "" - -#: Template/StateBalances/overview.ctp:37 Template/StateUsers/view.ctp:56 -#: Template/StateUsers/view.ctp:86 Template/StateUsers/view.ctp:120 -msgid "Betrag" -msgstr "" - -#: Template/StateBalances/overview.ctp:38 -msgid "Transaktions Nr." -msgstr "" - -#: Template/StateBalances/overview.ctp:38 -msgid "Nr" -msgstr "" - -#: Template/StateBalances/overview.ctp:75 -msgid "Geschöpft" -msgstr "" - -#: Template/StateBalances/overview.ctp:78 -msgid "Gesendet" -msgstr "" - -#: Template/StateBalances/overview.ctp:81 -msgid "Empfangen" -msgstr "" - -#: Template/StateBalances/overview.ctp:84 -msgid "Vergänglichkeit" -msgstr "" - -#: Template/StateBalances/overview.ctp:124 -#: Template/TransactionCreations/create_multi.ctp:184 -msgid "Laufende Transaktion" -msgstr "" - -#: Template/StateBalances/overview.ctp:126 -#: Template/TransactionCreations/create_multi.ctp:186 -msgid "Laufende Transaktionen" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:21 -msgid "Zur Verfügung: " -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:31 -msgid "Nur die letzten 100 Einträge werden angezeigt!" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:38 -msgid "Eigene Einzahlungen" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:41 Template/Users/statistics.ctp:65 -msgid "E-Mail" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:43 -msgid "Kommentar" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:44 -#: Template/StateBalances/overview_gdt.ctp:76 -msgid "Euro" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:45 -#: Template/StateBalances/overview_gdt.ctp:77 -msgid "Factor" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:46 -#: Template/StateBalances/overview_gdt.ctp:78 -msgid "GDT" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:71 -msgid "Einzahlungen anderer (Publisherprogramm)" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:74 -msgid "Einzahlender" -msgstr "" - -#: Template/StateBalances/view.ctp:11 -msgid "Delete State Balance" -msgstr "" - -#: Template/StateBalances/view.ctp:31 Template/StateUsers/view.ctp:33 -#: Template/TransactionCreations/view.ctp:36 -#: Template/TransactionSendCoins/view.ctp:36 Template/Transactions/view.ctp:95 -#: Template/Transactions/view.ctp:209 -msgid "Amount" -msgstr "" - -#: Template/StateCreated/add.ctp:10 Template/StateCreated/edit.ctp:16 -#: Template/StateCreated/view.ctp:12 Template/StateUserRoles/index.ctp:15 -#: Template/StateUsers/add.ctp:15 Template/StateUsers/edit.ctp:21 -#: Template/StateUsers/index.ctp:15 Template/Transactions/add.ctp:15 -#: Template/Transactions/edit.ctp:21 Template/Transactions/index.ctp:15 -#: Template/Transactions/view.ctp:18 -msgid "List State Created" -msgstr "" - -#: Template/StateCreated/add.ctp:11 Template/StateCreated/edit.ctp:17 -#: Template/StateCreated/index.ctp:11 Template/StateCreated/view.ctp:14 -#: Template/StateGroups/add.ctp:17 Template/StateGroups/edit.ctp:23 -#: Template/StateGroups/index.ctp:17 Template/StateGroups/view.ctp:20 -#: Template/StateUserTransactions/add.ctp:13 -#: Template/StateUserTransactions/edit.ctp:19 -#: Template/StateUserTransactions/index.ctp:13 -#: Template/StateUserTransactions/view.ctp:16 -#: Template/TransactionCreations/add.ctp:11 -#: Template/TransactionCreations/edit.ctp:17 -#: Template/TransactionCreations/index.ctp:11 -#: Template/TransactionCreations/view.ctp:14 -#: Template/TransactionGroupAddaddress/add.ctp:11 -#: Template/TransactionGroupAddaddress/edit.ctp:17 -#: Template/TransactionGroupAddaddress/index.ctp:11 -#: Template/TransactionGroupAddaddress/view.ctp:14 -#: Template/TransactionGroupAllowtrades/add.ctp:11 -#: Template/TransactionGroupAllowtrades/edit.ctp:17 -#: Template/TransactionGroupAllowtrades/index.ctp:11 -#: Template/TransactionGroupAllowtrades/view.ctp:14 -#: Template/TransactionGroupCreates/add.ctp:11 -#: Template/TransactionGroupCreates/edit.ctp:17 -#: Template/TransactionGroupCreates/index.ctp:11 -#: Template/TransactionGroupCreates/view.ctp:14 -#: Template/TransactionSendCoins/add.ctp:11 -#: Template/TransactionSendCoins/edit.ctp:17 -#: Template/TransactionSendCoins/index.ctp:11 -#: Template/TransactionSendCoins/view.ctp:14 -#: Template/TransactionSignatures/add.ctp:11 -#: Template/TransactionSignatures/edit.ctp:17 -#: Template/TransactionSignatures/index.ctp:11 -#: Template/TransactionSignatures/view.ctp:14 -#: Template/TransactionTypes/add.ctp:11 Template/TransactionTypes/edit.ctp:17 -#: Template/TransactionTypes/index.ctp:11 Template/TransactionTypes/view.ctp:14 -#: Template/Transactions/add.ctp:10 Template/Transactions/edit.ctp:16 -#: Template/Transactions/view.ctp:12 -msgid "List Transactions" -msgstr "" - -#: Template/StateCreated/add.ctp:12 Template/StateCreated/edit.ctp:18 -#: Template/StateCreated/index.ctp:12 Template/StateCreated/view.ctp:15 -#: Template/StateGroups/add.ctp:18 Template/StateGroups/edit.ctp:24 -#: Template/StateGroups/index.ctp:18 Template/StateGroups/view.ctp:21 -#: Template/StateUserTransactions/add.ctp:14 -#: Template/StateUserTransactions/edit.ctp:20 -#: Template/StateUserTransactions/index.ctp:14 -#: Template/StateUserTransactions/view.ctp:17 -#: Template/TransactionCreations/add.ctp:12 -#: Template/TransactionCreations/edit.ctp:18 -#: Template/TransactionCreations/index.ctp:12 -#: Template/TransactionCreations/view.ctp:15 -#: Template/TransactionGroupAddaddress/add.ctp:12 -#: Template/TransactionGroupAddaddress/edit.ctp:18 -#: Template/TransactionGroupAddaddress/index.ctp:12 -#: Template/TransactionGroupAddaddress/view.ctp:15 -#: Template/TransactionGroupAllowtrades/add.ctp:12 -#: Template/TransactionGroupAllowtrades/edit.ctp:18 -#: Template/TransactionGroupAllowtrades/index.ctp:12 -#: Template/TransactionGroupAllowtrades/view.ctp:15 -#: Template/TransactionGroupCreates/add.ctp:12 -#: Template/TransactionGroupCreates/edit.ctp:18 -#: Template/TransactionGroupCreates/index.ctp:12 -#: Template/TransactionGroupCreates/view.ctp:15 -#: Template/TransactionSendCoins/add.ctp:12 -#: Template/TransactionSendCoins/edit.ctp:18 -#: Template/TransactionSendCoins/index.ctp:12 -#: Template/TransactionSendCoins/view.ctp:15 -#: Template/TransactionSignatures/add.ctp:12 -#: Template/TransactionSignatures/edit.ctp:18 -#: Template/TransactionSignatures/index.ctp:12 -#: Template/TransactionSignatures/view.ctp:15 -#: Template/TransactionTypes/add.ctp:12 Template/TransactionTypes/edit.ctp:18 -#: Template/TransactionTypes/index.ctp:12 Template/TransactionTypes/view.ctp:15 -#: Template/Transactions/index.ctp:10 Template/Transactions/view.ctp:13 -msgid "New Transaction" -msgstr "" - -#: Template/StateCreated/add.ctp:20 -msgid "Add State Created" -msgstr "" - -#: Template/StateCreated/edit.ctp:26 Template/StateCreated/view.ctp:10 -msgid "Edit State Created" -msgstr "" - -#: Template/StateCreated/index.ctp:10 Template/StateCreated/view.ctp:13 -#: Template/StateUserRoles/index.ctp:16 Template/StateUsers/add.ctp:16 -#: Template/StateUsers/edit.ctp:22 Template/StateUsers/index.ctp:16 -#: Template/Transactions/add.ctp:16 Template/Transactions/edit.ctp:22 -#: Template/Transactions/index.ctp:16 Template/Transactions/view.ctp:19 -msgid "New State Created" -msgstr "" - -#: Template/StateCreated/index.ctp:18 -msgid "State Created" -msgstr "" - -#: Template/StateCreated/view.ctp:11 -msgid "Delete State Created" -msgstr "" - -#: Template/StateCreated/view.ctp:24 Template/StateUserTransactions/view.ctp:30 -#: Template/StateUsers/view.ctp:53 Template/TransactionCreations/view.ctp:24 -#: Template/TransactionGroupAddaddress/view.ctp:24 -#: Template/TransactionGroupAllowtrades/view.ctp:22 -#: Template/TransactionGroupCreates/view.ctp:24 -#: Template/TransactionSendCoins/view.ctp:24 -#: Template/TransactionSignatures/view.ctp:22 -msgid "Transaction" -msgstr "" - -#: Template/StateCreated/view.ctp:36 Template/Transactions/view.ctp:61 -msgid "Month" -msgstr "" - -#: Template/StateCreated/view.ctp:40 Template/Transactions/view.ctp:62 -msgid "Year" -msgstr "" - -#: Template/StateCreated/view.ctp:44 Template/Transactions/view.ctp:65 -msgid "Short Ident Hash" -msgstr "" - -#: Template/StateErrors/add.ctp:10 Template/StateErrors/edit.ctp:16 -#: Template/StateErrors/view.ctp:12 -msgid "List State Errors" -msgstr "" - -#: Template/StateErrors/add.ctp:13 Template/StateErrors/edit.ctp:19 -#: Template/StateErrors/index.ctp:13 Template/StateErrors/view.ctp:16 -#: Template/StateUserTransactions/add.ctp:15 -#: Template/StateUserTransactions/edit.ctp:21 -#: Template/StateUserTransactions/index.ctp:15 -#: Template/StateUserTransactions/view.ctp:18 -#: Template/TransactionTypes/add.ctp:10 Template/TransactionTypes/edit.ctp:16 -#: Template/TransactionTypes/view.ctp:12 Template/Transactions/add.ctp:13 -#: Template/Transactions/edit.ctp:19 Template/Transactions/index.ctp:13 -#: Template/Transactions/view.ctp:16 -msgid "List Transaction Types" -msgstr "" - -#: Template/StateErrors/add.ctp:14 Template/StateErrors/edit.ctp:20 -#: Template/StateErrors/index.ctp:14 Template/StateErrors/view.ctp:17 -#: Template/StateUserTransactions/add.ctp:16 -#: Template/StateUserTransactions/edit.ctp:22 -#: Template/StateUserTransactions/index.ctp:16 -#: Template/StateUserTransactions/view.ctp:19 -#: Template/TransactionTypes/index.ctp:10 Template/TransactionTypes/view.ctp:13 -#: Template/Transactions/add.ctp:14 Template/Transactions/edit.ctp:20 -#: Template/Transactions/index.ctp:14 Template/Transactions/view.ctp:17 -msgid "New Transaction Type" -msgstr "" - -#: Template/StateErrors/add.ctp:20 -msgid "Add State Error" -msgstr "" - -#: Template/StateErrors/edit.ctp:26 Template/StateErrors/view.ctp:10 -msgid "Edit State Error" -msgstr "" - -#: Template/StateErrors/index.ctp:10 Template/StateErrors/view.ctp:13 -msgid "New State Error" -msgstr "" - -#: Template/StateErrors/index.ctp:18 -msgid "State Errors" -msgstr "" - -#: Template/StateErrors/show_for_user.ctp:9 -msgid "Fehlermeldungen" -msgstr "" - -#: Template/StateErrors/view.ctp:11 -msgid "Delete State Error" -msgstr "" - -#: Template/StateErrors/view.ctp:28 Template/StateUserTransactions/view.ctp:34 -#: Template/Transactions/view.ctp:42 -msgid "Transaction Type" -msgstr "" - -#: Template/StateErrors/view.ctp:41 -msgid "Message Json" -msgstr "" - -#: Template/StateGroupAddresses/add.ctp:11 -#: Template/StateGroupAddresses/edit.ctp:17 -#: Template/StateGroupAddresses/index.ctp:11 -#: Template/StateGroupAddresses/view.ctp:14 Template/StateGroups/add.ctp:10 -#: Template/StateGroups/edit.ctp:16 Template/StateGroups/view.ctp:12 -#: Template/StateUserRoles/index.ctp:11 Template/StateUsers/add.ctp:11 -#: Template/StateUsers/edit.ctp:17 Template/StateUsers/index.ctp:11 -#: Template/StateUsers/view.ctp:14 Template/TransactionGroupCreates/add.ctp:13 -#: Template/TransactionGroupCreates/edit.ctp:19 -#: Template/TransactionGroupCreates/index.ctp:13 -#: Template/TransactionGroupCreates/view.ctp:16 -#: Template/Transactions/add.ctp:11 Template/Transactions/edit.ctp:17 -#: Template/Transactions/index.ctp:11 Template/Transactions/view.ctp:14 -msgid "List State Groups" -msgstr "" - -#: Template/StateGroupAddresses/add.ctp:12 -#: Template/StateGroupAddresses/edit.ctp:18 -#: Template/StateGroupAddresses/index.ctp:12 -#: Template/StateGroupAddresses/view.ctp:15 Template/StateGroups/index.ctp:10 -#: Template/StateGroups/view.ctp:13 Template/StateUserRoles/index.ctp:12 -#: Template/StateUsers/add.ctp:12 Template/StateUsers/edit.ctp:18 -#: Template/StateUsers/index.ctp:12 Template/StateUsers/view.ctp:15 -#: Template/TransactionGroupCreates/add.ctp:14 -#: Template/TransactionGroupCreates/edit.ctp:20 -#: Template/TransactionGroupCreates/index.ctp:14 -#: Template/TransactionGroupCreates/view.ctp:17 -#: Template/Transactions/add.ctp:12 Template/Transactions/edit.ctp:18 -#: Template/Transactions/index.ctp:12 Template/Transactions/view.ctp:15 -msgid "New State Group" -msgstr "" - -#: Template/StateGroupAddresses/add.ctp:20 -msgid "Add State Group Address" -msgstr "" - -#: Template/StateGroupAddresses/edit.ctp:26 -#: Template/StateGroupAddresses/view.ctp:10 -msgid "Edit State Group Address" -msgstr "" - -#: Template/StateGroupAddresses/index.ctp:18 -msgid "State Group Addresses" -msgstr "" - -#: Template/StateGroupAddresses/index.ctp:25 -#: Template/TransactionGroupAddaddress/index.ctp:25 -msgid "user public key" -msgstr "" - -#: Template/StateGroupAddresses/view.ctp:11 -msgid "Delete State Group Address" -msgstr "" - -#: Template/StateGroupAddresses/view.ctp:24 -#: Template/TransactionGroupAddaddress/view.ctp:28 -msgid "Address Type" -msgstr "" - -#: Template/StateGroupRelationships/add.ctp:10 -#: Template/StateGroupRelationships/edit.ctp:16 -#: Template/StateGroupRelationships/view.ctp:12 -msgid "List State Group Relationships" -msgstr "" - -#: Template/StateGroupRelationships/add.ctp:16 -msgid "Add State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/edit.ctp:22 -#: Template/StateGroupRelationships/view.ctp:10 -msgid "Edit State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/index.ctp:10 -#: Template/StateGroupRelationships/view.ctp:13 -msgid "New State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/index.ctp:14 -msgid "State Group Relationships" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:11 -msgid "Delete State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:24 -msgid "State Group1 Id" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:28 -msgid "State Group2 Id" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:32 -msgid "State Relationship Id" -msgstr "" - -#: Template/StateGroups/add.ctp:15 Template/StateGroups/edit.ctp:21 -#: Template/StateGroups/index.ctp:15 Template/StateGroups/view.ctp:18 -#: Template/TransactionGroupCreates/add.ctp:10 -#: Template/TransactionGroupCreates/edit.ctp:16 -#: Template/TransactionGroupCreates/view.ctp:12 -#: Template/Transactions/add.ctp:23 Template/Transactions/edit.ctp:29 -#: Template/Transactions/index.ctp:23 Template/Transactions/view.ctp:26 -msgid "List Transaction Group Creates" -msgstr "" - -#: Template/StateGroups/add.ctp:16 Template/StateGroups/edit.ctp:22 -#: Template/StateGroups/index.ctp:16 Template/StateGroups/view.ctp:19 -#: Template/TransactionGroupCreates/index.ctp:10 -#: Template/TransactionGroupCreates/view.ctp:13 -#: Template/Transactions/add.ctp:24 Template/Transactions/edit.ctp:30 -#: Template/Transactions/index.ctp:24 Template/Transactions/view.ctp:27 -msgid "New Transaction Group Create" -msgstr "" - -#: Template/StateGroups/add.ctp:24 -msgid "Add State Group" -msgstr "" - -#: Template/StateGroups/edit.ctp:30 Template/StateGroups/view.ctp:10 -msgid "Edit State Group" -msgstr "" - -#: Template/StateGroups/index.ctp:22 -msgid "State Groups" -msgstr "" - -#: Template/StateGroups/view.ctp:11 -msgid "Delete State Group" -msgstr "" - -#: Template/StateGroups/view.ctp:36 -msgid "User Count" -msgstr "" - -#: Template/StateGroups/view.ctp:46 Template/StateGroups/view.ctp:74 -#: Template/StateGroups/view.ctp:102 Template/StateGroups/view.ctp:129 -#: Template/TransactionTypes/view.ctp:40 Template/Transactions/view.ctp:178 -msgid "State Group Id" -msgstr "" - -#: Template/StateGroups/view.ctp:68 -msgid "Related State Users" -msgstr "" - -#: Template/StateGroups/view.ctp:73 -msgid "Index Id" -msgstr "" - -#: Template/StateGroups/view.ctp:95 Template/Transactions/view.ctp:171 -msgid "Related Transaction Group Creates" -msgstr "" - -#: Template/StateGroups/view.ctp:101 Template/Transactions/view.ctp:177 -msgid "Group Public Key" -msgstr "" - -#: Template/StateGroups/view.ctp:124 Template/TransactionTypes/view.ctp:35 -msgid "Related Transactions" -msgstr "" - -#: Template/StateGroups/view.ctp:130 Template/TransactionTypes/view.ctp:41 -msgid "Transaction Type Id" -msgstr "" - -#: Template/StateGroups/view.ctp:131 Template/TransactionTypes/view.ctp:42 -msgid "Tx Hash" -msgstr "" - -#: Template/StateGroups/view.ctp:132 Template/TransactionTypes/view.ctp:43 -#: Template/Transactions/view.ctp:50 -msgid "Received" -msgstr "" - -#: Template/StateRelationshipTypes/add.ctp:10 -#: Template/StateRelationshipTypes/edit.ctp:16 -#: Template/StateRelationshipTypes/view.ctp:12 -msgid "List State Relationship Types" -msgstr "" - -#: Template/StateRelationshipTypes/add.ctp:16 -msgid "Add State Relationship Type" -msgstr "" - -#: Template/StateRelationshipTypes/edit.ctp:22 -#: Template/StateRelationshipTypes/view.ctp:10 -msgid "Edit State Relationship Type" -msgstr "" - -#: Template/StateRelationshipTypes/index.ctp:10 -#: Template/StateRelationshipTypes/view.ctp:13 -msgid "New State Relationship Type" -msgstr "" - -#: Template/StateRelationshipTypes/index.ctp:14 -msgid "State Relationship Types" -msgstr "" - -#: Template/StateRelationshipTypes/view.ctp:11 -msgid "Delete State Relationship Type" -msgstr "" - -#: Template/StateUserRoles/assign_role.ctp:9 -#: Template/StateUserRoles/assign_role.ctp:46 -#: Template/StateUserRoles/search.ctp:47 -msgid "Assign Role" -msgstr "" - -#: Template/StateUserRoles/index.ctp:17 Template/StateUsers/add.ctp:17 -#: Template/StateUsers/edit.ctp:23 Template/StateUsers/index.ctp:17 -#: Template/StateUsers/view.ctp:18 Template/TransactionCreations/add.ctp:10 -#: Template/TransactionCreations/edit.ctp:16 -#: Template/TransactionCreations/view.ctp:12 Template/Transactions/add.ctp:17 -#: Template/Transactions/edit.ctp:23 Template/Transactions/index.ctp:17 -#: Template/Transactions/view.ctp:20 -msgid "List Transaction Creations" -msgstr "" - -#: Template/StateUserRoles/index.ctp:18 Template/StateUsers/add.ctp:18 -#: Template/StateUsers/edit.ctp:24 Template/StateUsers/index.ctp:18 -#: Template/StateUsers/view.ctp:19 Template/TransactionCreations/index.ctp:10 -#: Template/TransactionCreations/view.ctp:13 Template/Transactions/add.ctp:18 -#: Template/Transactions/edit.ctp:24 Template/Transactions/index.ctp:18 -#: Template/Transactions/view.ctp:21 -msgid "New Transaction Creation" -msgstr "" - -#: Template/StateUserRoles/index.ctp:19 Template/StateUsers/add.ctp:19 -#: Template/StateUsers/edit.ctp:25 Template/StateUsers/index.ctp:19 -#: Template/StateUsers/view.ctp:20 Template/TransactionSendCoins/add.ctp:10 -#: Template/TransactionSendCoins/edit.ctp:16 -#: Template/TransactionSendCoins/view.ctp:12 Template/Transactions/add.ctp:25 -#: Template/Transactions/edit.ctp:31 Template/Transactions/index.ctp:25 -#: Template/Transactions/view.ctp:28 -msgid "List Transaction Send Coins" -msgstr "" - -#: Template/StateUserRoles/index.ctp:20 Template/StateUsers/add.ctp:20 -#: Template/StateUsers/edit.ctp:26 Template/StateUsers/index.ctp:20 -#: Template/StateUsers/view.ctp:21 Template/TransactionSendCoins/index.ctp:10 -#: Template/TransactionSendCoins/view.ctp:13 Template/Transactions/add.ctp:26 -#: Template/Transactions/edit.ctp:32 Template/Transactions/index.ctp:26 -#: Template/Transactions/view.ctp:29 -msgid "New Transaction Send Coin" -msgstr "" - -#: Template/StateUserRoles/index.ctp:24 Template/StateUserRoles/search.ctp:25 -#: Template/StateUsers/index.ctp:24 -msgid "State Users" -msgstr "" - -#: Template/StateUserRoles/search.ctp:19 Template/StateUsers/search.ctp:57 -msgid "Suchbegriff" -msgstr "" - -#: Template/StateUserRoles/search.ctp:19 Template/StateUsers/search.ctp:57 -msgid "Vorname/Nachname/E-Mail" -msgstr "" - -#: Template/StateUserRoles/search.ctp:20 Template/StateUsers/search.ctp:59 -#: Template/TransactionCreations/create_multi.ctp:35 -msgid "Suchen" -msgstr "" - -#: Template/StateUserTransactions/add.ctp:10 -#: Template/StateUserTransactions/edit.ctp:16 -#: Template/StateUserTransactions/view.ctp:12 -msgid "List State User Transactions" -msgstr "" - -#: Template/StateUserTransactions/add.ctp:22 -msgid "Add State User Transaction" -msgstr "" - -#: Template/StateUserTransactions/edit.ctp:28 -#: Template/StateUserTransactions/view.ctp:10 -msgid "Edit State User Transaction" -msgstr "" - -#: Template/StateUserTransactions/index.ctp:10 -#: Template/StateUserTransactions/view.ctp:13 -msgid "New State User Transaction" -msgstr "" - -#: Template/StateUserTransactions/index.ctp:20 -msgid "State User Transactions" -msgstr "" - -#: Template/StateUserTransactions/view.ctp:11 -msgid "Delete State User Transaction" -msgstr "" - -#: Template/StateUsers/add.ctp:26 -msgid "Add State User" -msgstr "" - -#: Template/StateUsers/edit.ctp:32 Template/StateUsers/view.ctp:10 -msgid "Edit State User" -msgstr "" - -#: Template/StateUsers/search.ctp:16 -msgid "Alle" -msgstr "" - -#: Template/StateUsers/search.ctp:21 -msgid "Konto nicht aktiviert" -msgstr "" - -#: Template/StateUsers/search.ctp:58 -msgid "Konto Status" -msgstr "" - -#: Template/StateUsers/view.ctp:11 -msgid "Delete State User" -msgstr "" - -#: Template/StateUsers/view.ctp:28 -msgid "State Balance" -msgstr "" - -#: Template/StateUsers/view.ctp:32 -msgid "Letztes Update" -msgstr "" - -#: Template/StateUsers/view.ctp:49 -msgid "Schöpfungen" -msgstr "" - -#: Template/StateUsers/view.ctp:54 Template/StateUsers/view.ctp:84 -#: Template/StateUsers/view.ctp:118 -msgid "Erhalten" -msgstr "" - -#: Template/StateUsers/view.ctp:55 -msgid "Verrechnungs-Datum" -msgstr "" - -#: Template/StateUsers/view.ctp:79 -msgid "Versendete Überweisungen" -msgstr "" - -#: Template/StateUsers/view.ctp:85 -msgid "Empfänger " -msgstr "" - -#: Template/StateUsers/view.ctp:88 -msgid "Betrag nach Senden" -msgstr "" - -#: Template/StateUsers/view.ctp:113 -msgid "Empfangende Überweisungen" -msgstr "" - -#: Template/StateUsers/view.ctp:119 -msgid "Sender" -msgstr "" - -#: Template/TransactionCreations/add.ctp:20 -msgid "Add Transaction Creation" -msgstr "" - -#: Template/TransactionCreations/create.ctp:17 -#: Template/TransactionCreations/create_multi.ctp:17 -msgid "Schöpfungstransaktion" -msgstr "" - -#: Template/TransactionCreations/create.ctp:28 -#: Template/TransactionCreations/create_multi.ctp:125 -msgid "Transaktion(en) abschließen" -msgstr "" - -#: Template/TransactionCreations/create.ctp:29 -#: Template/TransactionCreations/create_multi.ctp:126 -#: Template/TransactionSendCoins/create.ctp:24 -msgid "Weitere Transaktion erstellen" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:34 -msgid "Suche" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:38 -msgid "Memo" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:39 -#: Template/TransactionSendCoins/create.ctp:22 -#: Template/TransactionSendCoins/create_raw.ctp:33 -msgid "Betrag in GDD" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:46 -msgid "Zieldatum" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:81 -msgid "Für benutzerdefinierten Betrag" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:189 -msgid "Alle Transaktionen abgeschlossen!" -msgstr "" - -#: Template/TransactionCreations/edit.ctp:26 -#: Template/TransactionCreations/view.ctp:10 -msgid "Edit Transaction Creation" -msgstr "" - -#: Template/TransactionCreations/index.ctp:18 -msgid "Transaction Creations" -msgstr "" - -#: Template/TransactionCreations/view.ctp:11 -msgid "Delete Transaction Creation" -msgstr "" - -#: Template/TransactionGroupAddaddress/add.ctp:20 -msgid "Add Transaction Group Addaddres" -msgstr "" - -#: Template/TransactionGroupAddaddress/edit.ctp:26 -#: Template/TransactionGroupAddaddress/view.ctp:10 -msgid "Edit Transaction Group Addaddres" -msgstr "" - -#: Template/TransactionGroupAddaddress/index.ctp:18 -msgid "Transaction Group Addaddress" -msgstr "" - -#: Template/TransactionGroupAddaddress/view.ctp:11 -msgid "Delete Transaction Group Addaddres" -msgstr "" - -#: Template/TransactionGroupAllowtrades/add.ctp:10 -#: Template/TransactionGroupAllowtrades/edit.ctp:16 -#: Template/TransactionGroupAllowtrades/view.ctp:12 -#: Template/Transactions/add.ctp:21 Template/Transactions/edit.ctp:27 -#: Template/Transactions/index.ctp:21 Template/Transactions/view.ctp:24 -msgid "List Transaction Group Allowtrades" -msgstr "" - -#: Template/TransactionGroupAllowtrades/add.ctp:18 -msgid "Add Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/edit.ctp:24 -#: Template/TransactionGroupAllowtrades/view.ctp:10 -msgid "Edit Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/index.ctp:10 -#: Template/TransactionGroupAllowtrades/view.ctp:13 -#: Template/Transactions/add.ctp:22 Template/Transactions/edit.ctp:28 -#: Template/Transactions/index.ctp:22 Template/Transactions/view.ctp:25 -msgid "New Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/index.ctp:16 -msgid "Transaction Group Allowtrades" -msgstr "" - -#: Template/TransactionGroupAllowtrades/view.ctp:11 -msgid "Delete Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/view.ctp:34 -#: Template/Transactions/view.ctp:151 -msgid "Allow" -msgstr "" - -#: Template/TransactionGroupCreates/add.ctp:20 -msgid "Add Transaction Group Create" -msgstr "" - -#: Template/TransactionGroupCreates/edit.ctp:26 -#: Template/TransactionGroupCreates/view.ctp:10 -msgid "Edit Transaction Group Create" -msgstr "" - -#: Template/TransactionGroupCreates/index.ctp:18 -msgid "Transaction Group Creates" -msgstr "" - -#: Template/TransactionGroupCreates/view.ctp:11 -msgid "Delete Transaction Group Create" -msgstr "" - -#: Template/TransactionGroupCreates/view.ctp:28 -#: Template/Transactions/view.ctp:38 -msgid "State Group" -msgstr "" - -#: Template/TransactionSendCoins/add.ctp:20 -msgid "Add Transaction Send Coin" -msgstr "" - -#: Template/TransactionSendCoins/create.ctp:19 -msgid "Empfänger" -msgstr "" - -#: Template/TransactionSendCoins/create.ctp:20 -msgid "Community Alias" -msgstr "" - -#: Template/TransactionSendCoins/create.ctp:23 -#: Template/TransactionSendCoins/create_raw.ctp:34 -msgid "Transaktion abschließen" -msgstr "" - -#: Template/TransactionSendCoins/create_raw.ctp:29 -msgid "Sender Private Key" -msgstr "" - -#: Template/TransactionSendCoins/create_raw.ctp:30 -msgid "Sender Public Key" -msgstr "" - -#: Template/TransactionSendCoins/create_raw.ctp:31 -msgid "Empfänger Public Key" -msgstr "" - -#: Template/TransactionSendCoins/edit.ctp:26 -#: Template/TransactionSendCoins/view.ctp:10 -msgid "Edit Transaction Send Coin" -msgstr "" - -#: Template/TransactionSendCoins/index.ctp:18 -msgid "Transaction Send Coins" -msgstr "" - -#: Template/TransactionSendCoins/view.ctp:11 -msgid "Delete Transaction Send Coin" -msgstr "" - -#: Template/TransactionSendCoins/view.ctp:40 Template/Transactions/view.ctp:210 -msgid "Sender Final Balance" -msgstr "" - -#: Template/TransactionSignatures/add.ctp:10 -#: Template/TransactionSignatures/edit.ctp:16 -#: Template/TransactionSignatures/view.ctp:12 Template/Transactions/add.ctp:27 -#: Template/Transactions/edit.ctp:33 Template/Transactions/index.ctp:27 -#: Template/Transactions/view.ctp:30 -msgid "List Transaction Signatures" -msgstr "" - -#: Template/TransactionSignatures/add.ctp:18 -msgid "Add Transaction Signature" -msgstr "" - -#: Template/TransactionSignatures/edit.ctp:24 -#: Template/TransactionSignatures/view.ctp:10 -msgid "Edit Transaction Signature" -msgstr "" - -#: Template/TransactionSignatures/index.ctp:10 -#: Template/TransactionSignatures/view.ctp:13 Template/Transactions/add.ctp:28 -#: Template/Transactions/edit.ctp:34 Template/Transactions/index.ctp:28 -#: Template/Transactions/view.ctp:31 -msgid "New Transaction Signature" -msgstr "" - -#: Template/TransactionSignatures/index.ctp:16 -msgid "Transaction Signatures" -msgstr "" - -#: Template/TransactionSignatures/view.ctp:11 -msgid "Delete Transaction Signature" -msgstr "" - -#: Template/TransactionTypes/add.ctp:18 -msgid "Add Transaction Type" -msgstr "" - -#: Template/TransactionTypes/edit.ctp:24 Template/TransactionTypes/view.ctp:10 -msgid "Edit Transaction Type" -msgstr "" - -#: Template/TransactionTypes/index.ctp:16 -msgid "Transaction Types" -msgstr "" - -#: Template/TransactionTypes/view.ctp:11 -msgid "Delete Transaction Type" -msgstr "" - -#: Template/Transactions/add.ctp:34 -msgid "Add Transaction" -msgstr "" - -#: Template/Transactions/edit.ctp:40 Template/Transactions/view.ctp:10 -msgid "Edit Transaction" -msgstr "" - -#: Template/Transactions/manual_transaction.ctp:26 -msgid "Creation Transaction" -msgstr "" - -#: Template/Transactions/manual_transaction.ctp:41 -msgid "Transfer Transaction" -msgstr "" - -#: Template/Transactions/send_to_node.ctp:8 -msgid "Transaktionen an Gradido-Node senden" -msgstr "" - -#: Template/Transactions/synchronize_with_state_user_transactions.ctp:44 -msgid "Synchronize" -msgstr "" - -#: Template/Transactions/view.ctp:11 -msgid "Delete Transaction" -msgstr "" - -#: Template/Transactions/view.ctp:55 -msgid "Related State Created" -msgstr "" - -#: Template/Transactions/view.ctp:88 -msgid "Related Transaction Creations" -msgstr "" - -#: Template/Transactions/view.ctp:96 -msgid "Ident Hash" -msgstr "" - -#: Template/Transactions/view.ctp:144 -msgid "Related Transaction Group Allowtrades" -msgstr "" - -#: Template/Transactions/view.ctp:200 -msgid "Related Transaction Send Coins" -msgstr "" - -#: Template/Transactions/view.ctp:207 -msgid "Receiver Public Key" -msgstr "" - -#: Template/Transactions/view.ctp:208 -msgid "Receiver User Id" -msgstr "" - -#: Template/Transactions/view.ctp:233 -msgid "Related Transaction Signatures" -msgstr "" - -#: Template/Transactions/view.ctp:239 -msgid "Signature" -msgstr "" - -#: Template/Transactions/view.ctp:240 -msgid "Pubkey" -msgstr "" - -#: Template/Users/add.ctp:10 Template/Users/edit.ctp:16 -#: Template/Users/view.ctp:12 -msgid "List Users" -msgstr "" - -#: Template/Users/add.ctp:16 -msgid "Add User" -msgstr "" - -#: Template/Users/edit.ctp:22 Template/Users/view.ctp:10 -msgid "Edit User" -msgstr "" - -#: Template/Users/index.ctp:10 Template/Users/view.ctp:13 -msgid "New User" -msgstr "" - -#: Template/Users/index.ctp:14 -msgid "Users" -msgstr "" - -#: Template/Users/statistics.ctp:9 -msgid "Benutzer Statistiken" -msgstr "" - -#: Template/Users/statistics.ctp:39 -msgid "Alle Anmeldungen" -msgstr "" - -#: Template/Users/statistics.ctp:56 -msgid "Anmeldungen im Vergleich zum letzten Monat, 0% = gleiche Anzahl" -msgstr "" - -#: Template/Users/statistics.ctp:61 -msgid "Letzte Anmeldungen" -msgstr "" - -#: Template/Users/statistics.ctp:66 -msgid "Erstellt" -msgstr "" - -#: Template/Users/statistics.ctp:79 -msgid "Anmeldungen detailliert" -msgstr "" - -#: Template/Users/statistics.ctp:82 -msgid "Jahr" -msgstr "" - -#: Template/Users/statistics.ctp:83 -msgid "Monat" -msgstr "" - -#: Template/Users/statistics.ctp:84 -msgid "Anzahl Anmeldungen" -msgstr "" - -#: Template/Users/view.ctp:11 -msgid "Delete User" -msgstr "" - -#: Template/Users/view.ctp:24 -msgid "First Name" -msgstr "" - -#: Template/Users/view.ctp:28 -msgid "Last Name" -msgstr "" - -#: Template/Users/view.ctp:32 -msgid "Language" -msgstr "" - -#: Template/Users/view.ctp:48 -msgid "Email Checked" -msgstr "" diff --git a/community_server/src/Locale/default.pot b/community_server/src/Locale/default.pot deleted file mode 100644 index 0c9ada315..000000000 --- a/community_server/src/Locale/default.pot +++ /dev/null @@ -1,3566 +0,0 @@ -# LANGUAGE translation of CakePHP Application -# Copyright YEAR NAME -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2021-08-11 11:38+0000\n" -"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" -"Last-Translator: NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" - -#: Controller/AddressTypesController.php:54 -#: Controller/AddressTypesController.php:78 -msgid "The address type has been saved." -msgstr "" - -#: Controller/AddressTypesController.php:58 -#: Controller/AddressTypesController.php:82 -msgid "The address type could not be saved. Please, try again." -msgstr "" - -#: Controller/AddressTypesController.php:99 -msgid "The address type has been deleted." -msgstr "" - -#: Controller/AddressTypesController.php:101 -msgid "The address type could not be deleted. Please, try again." -msgstr "" - -#: Controller/AdminErrorsController.php:57 -#: Controller/AdminErrorsController.php:82 -msgid "The admin error has been saved." -msgstr "" - -#: Controller/AdminErrorsController.php:61 -#: Controller/AdminErrorsController.php:86 -msgid "The admin error could not be saved. Please, try again." -msgstr "" - -#: Controller/AdminErrorsController.php:104 -msgid "The admin error has been deleted." -msgstr "" - -#: Controller/AdminErrorsController.php:106 -msgid "The admin error could not be deleted. Please, try again." -msgstr "" - -#: Controller/AppController.php:262 -msgid "error updating state user " -msgstr "" - -#: Controller/AppController.php:276 -msgid "error saving state user " -msgstr "" - -#: Controller/AppController.php:286 -msgid "no pubkey" -msgstr "" - -#: Controller/AppController.php:295 -msgid "invalid session" -msgstr "" - -#: Controller/AppController.php:297 -msgid "Konto ist nicht aktiviert!" -msgstr "" - -#: Controller/AppController.php:311 -#: Controller/StateUsersController.php:103 -msgid "error http request: " -msgstr "" - -#: Controller/AppController.php:358 -msgid "(Leere Message)" -msgstr "" - -#: Controller/AppController.php:363 -msgid "(Leere Details)" -msgstr "" - -#: Controller/AppController.php:367 -msgid "Serious error, couldn't save to db, please write the admin: " -msgstr "" - -#: Controller/BlockchainTypesController.php:54 -#: Controller/BlockchainTypesController.php:78 -msgid "The blockchain type has been saved." -msgstr "" - -#: Controller/BlockchainTypesController.php:58 -#: Controller/BlockchainTypesController.php:82 -msgid "The blockchain type could not be saved. Please, try again." -msgstr "" - -#: Controller/BlockchainTypesController.php:99 -msgid "The blockchain type has been deleted." -msgstr "" - -#: Controller/BlockchainTypesController.php:101 -msgid "The blockchain type could not be deleted. Please, try again." -msgstr "" - -#: Controller/CommunityProfilesController.php:54 -#: Controller/CommunityProfilesController.php:78 -msgid "The community profile has been saved." -msgstr "" - -#: Controller/CommunityProfilesController.php:58 -#: Controller/CommunityProfilesController.php:82 -msgid "The community profile could not be saved. Please, try again." -msgstr "" - -#: Controller/CommunityProfilesController.php:99 -msgid "The community profile has been deleted." -msgstr "" - -#: Controller/CommunityProfilesController.php:101 -msgid "The community profile could not be deleted. Please, try again." -msgstr "" - -#: Controller/DashboardController.php:29 -#: Controller/ProfileController.php:28 -#: Controller/StateBalancesController.php:52 -#: Controller/StateBalancesController.php:202 -#: Controller/StateErrorsController.php:26 -#: Controller/StateUserRolesController.php:42 -#: Controller/StateUsersController.php:54 -#: Controller/TransactionCreationsController.php:42 -#: Controller/TransactionSendCoinsController.php:44 -#: Controller/UsersController.php:26 -#: Template/Element/navi.ctp:33 -msgid "Startseite" -msgstr "" - -#: Controller/ElopageBuysController.php:112 -#: Controller/ElopageBuysController.php:137 -msgid "The elopage buy has been saved." -msgstr "" - -#: Controller/ElopageBuysController.php:116 -#: Controller/ElopageBuysController.php:141 -msgid "The elopage buy could not be saved. Please, try again." -msgstr "" - -#: Controller/ElopageBuysController.php:158 -msgid "The elopage buy has been deleted." -msgstr "" - -#: Controller/ElopageBuysController.php:160 -msgid "The elopage buy could not be deleted. Please, try again." -msgstr "" - -#: Controller/JsonRequestHandlerController.php:366 -msgid "Gradido Transaktion fehlgeschlagen!" -msgstr "" - -#: Controller/OperatorTypesController.php:54 -#: Controller/OperatorTypesController.php:78 -msgid "The operator type has been saved." -msgstr "" - -#: Controller/OperatorTypesController.php:58 -#: Controller/OperatorTypesController.php:82 -msgid "The operator type could not be saved. Please, try again." -msgstr "" - -#: Controller/OperatorTypesController.php:99 -msgid "The operator type has been deleted." -msgstr "" - -#: Controller/OperatorTypesController.php:101 -msgid "The operator type could not be deleted. Please, try again." -msgstr "" - -#: Controller/OperatorsController.php:182 -#: Controller/OperatorsController.php:207 -msgid "The operator has been saved." -msgstr "" - -#: Controller/OperatorsController.php:186 -#: Controller/OperatorsController.php:211 -msgid "The operator could not be saved. Please, try again." -msgstr "" - -#: Controller/OperatorsController.php:229 -msgid "The operator has been deleted." -msgstr "" - -#: Controller/OperatorsController.php:231 -msgid "The operator could not be deleted. Please, try again." -msgstr "" - -#: Controller/ProfileController.php:29 -#: Template/Element/user_menu.ctp:15 -#: Template/Profile/index.ctp:19 -msgid "Mein Profil" -msgstr "" - -#: Controller/ProfileController.php:108 -msgid "Dein Profil wurde aktualisiert!" -msgstr "" - -#: Controller/ProfileController.php:111 -msgid "Non-recoverable database problem - state_user doesn't exist or not unique!" -msgstr "" - -#: Controller/ProfileController.php:198 -#: Controller/StateUserRolesController.php:117 -#: Controller/StateUsersController.php:291 -#: Controller/TransactionCreationsController.php:183 -msgid "Something was invalid, please try again!" -msgstr "" - -#: Controller/RolesController.php:56 -#: Controller/RolesController.php:80 -msgid "The role has been saved." -msgstr "" - -#: Controller/RolesController.php:60 -#: Controller/RolesController.php:84 -msgid "The role could not be saved. Please, try again." -msgstr "" - -#: Controller/RolesController.php:101 -msgid "The role has been deleted." -msgstr "" - -#: Controller/RolesController.php:103 -msgid "The role could not be deleted. Please, try again." -msgstr "" - -#: Controller/ServerUsersController.php:42 -msgid "Invalid username or password, try again" -msgstr "" - -#: Controller/ServerUsersController.php:79 -#: Controller/ServerUsersController.php:103 -msgid "The server user has been saved." -msgstr "" - -#: Controller/ServerUsersController.php:83 -#: Controller/ServerUsersController.php:107 -msgid "The server user could not be saved. Please, try again." -msgstr "" - -#: Controller/ServerUsersController.php:124 -msgid "The server user has been deleted." -msgstr "" - -#: Controller/ServerUsersController.php:126 -msgid "The server user could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateBalancesController.php:53 -#: Template/Dashboard/index.ctp:30 -#: Template/Element/navi.ctp:22 -#: Template/StateBalances/overview.ctp:8 -msgid "Kontoübersicht" -msgstr "" - -#: Controller/StateBalancesController.php:203 -#: Template/StateBalances/overview_gdt.ctp:20 -msgid "GDT Kontoübersicht" -msgstr "" - -#: Controller/StateBalancesController.php:252 -msgid "Fehler beim GDT Server, bitte abwarten oder den Admin benachrichtigen!" -msgstr "" - -#: Controller/StateBalancesController.php:351 -#: Controller/StateBalancesController.php:376 -msgid "The state balance has been saved." -msgstr "" - -#: Controller/StateBalancesController.php:355 -#: Controller/StateBalancesController.php:380 -msgid "The state balance could not be saved. Please, try again." -msgstr "" - -#: Controller/StateBalancesController.php:398 -msgid "The state balance has been deleted." -msgstr "" - -#: Controller/StateBalancesController.php:400 -msgid "The state balance could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateCreatedController.php:57 -#: Controller/StateCreatedController.php:83 -msgid "The state created has been saved." -msgstr "" - -#: Controller/StateCreatedController.php:61 -#: Controller/StateCreatedController.php:87 -msgid "The state created could not be saved. Please, try again." -msgstr "" - -#: Controller/StateCreatedController.php:106 -msgid "The state created has been deleted." -msgstr "" - -#: Controller/StateCreatedController.php:108 -msgid "The state created could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateErrorsController.php:27 -#: Template/Dashboard/index.ctp:79 -#: Template/Dashboard/server_index.ctp:31 -#: Template/Element/navi_header.ctp:33 -#: Template/Element/navi_notify.ctp:32 -msgid "Fehler" -msgstr "" - -#: Controller/StateErrorsController.php:75 -msgid "Error belongs to another User, cannot delete" -msgstr "" - -#: Controller/StateErrorsController.php:78 -#: Controller/StateErrorsController.php:166 -msgid "The state error has been deleted." -msgstr "" - -#: Controller/StateErrorsController.php:80 -#: Controller/StateErrorsController.php:168 -msgid "The state error could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateErrorsController.php:117 -#: Controller/StateErrorsController.php:143 -msgid "The state error has been saved." -msgstr "" - -#: Controller/StateErrorsController.php:121 -#: Controller/StateErrorsController.php:147 -msgid "The state error could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupAddressesController.php:57 -#: Controller/StateGroupAddressesController.php:83 -msgid "The state group address has been saved." -msgstr "" - -#: Controller/StateGroupAddressesController.php:61 -#: Controller/StateGroupAddressesController.php:87 -msgid "The state group address could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupAddressesController.php:106 -msgid "The state group address has been deleted." -msgstr "" - -#: Controller/StateGroupAddressesController.php:108 -msgid "The state group address could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:57 -#: Controller/StateGroupRelationshipsController.php:84 -msgid "The state group relationship has been saved." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:61 -#: Controller/StateGroupRelationshipsController.php:88 -msgid "The state group relationship could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:108 -msgid "The state group relationship has been deleted." -msgstr "" - -#: Controller/StateGroupRelationshipsController.php:110 -msgid "The state group relationship could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateGroupsController.php:57 -#: Controller/StateGroupsController.php:82 -msgid "The state group has been saved." -msgstr "" - -#: Controller/StateGroupsController.php:61 -#: Controller/StateGroupsController.php:86 -msgid "The state group could not be saved. Please, try again." -msgstr "" - -#: Controller/StateGroupsController.php:104 -msgid "The state group has been deleted." -msgstr "" - -#: Controller/StateGroupsController.php:106 -msgid "The state group could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:54 -#: Controller/StateRelationshipTypesController.php:78 -msgid "The state relationship type has been saved." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:58 -#: Controller/StateRelationshipTypesController.php:82 -msgid "The state relationship type could not be saved. Please, try again." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:99 -msgid "The state relationship type has been deleted." -msgstr "" - -#: Controller/StateRelationshipTypesController.php:101 -msgid "The state relationship type could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateUserRolesController.php:42 -#: Controller/StateUsersController.php:54 -#: Template/StateUserRoles/search.ctp:9 -#: Template/StateUsers/search.ctp:9 -msgid "Benutzer suchen" -msgstr "" - -#: Controller/StateUserRolesController.php:149 -msgid "Role has been assigned to User." -msgstr "" - -#: Controller/StateUserTransactionsController.php:233 -#: Controller/StateUserTransactionsController.php:260 -msgid "The state user transaction has been saved." -msgstr "" - -#: Controller/StateUserTransactionsController.php:237 -#: Controller/StateUserTransactionsController.php:264 -msgid "The state user transaction could not be saved. Please, try again." -msgstr "" - -#: Controller/StateUserTransactionsController.php:284 -msgid "The state user transaction has been deleted." -msgstr "" - -#: Controller/StateUserTransactionsController.php:286 -msgid "The state user transaction could not be deleted. Please, try again." -msgstr "" - -#: Controller/StateUsersController.php:21 -msgid "account created" -msgstr "" - -#: Controller/StateUsersController.php:22 -msgid "account not on login-server" -msgstr "" - -#: Controller/StateUsersController.php:23 -msgid "email activated" -msgstr "" - -#: Controller/StateUsersController.php:24 -msgid "account copied to community" -msgstr "" - -#: Controller/StateUsersController.php:25 -msgid "email not activated" -msgstr "" - -#: Controller/StateUsersController.php:26 -msgid "account multiple times on login-server" -msgstr "" - -#: Controller/StateUsersController.php:27 -msgid "account not on community server" -msgstr "" - -#: Controller/StateUsersController.php:28 -msgid "no keys" -msgstr "" - -#: Controller/StateUsersController.php:560 -#: Controller/StateUsersController.php:586 -msgid "The state user has been saved." -msgstr "" - -#: Controller/StateUsersController.php:564 -#: Controller/StateUsersController.php:590 -msgid "The state user could not be saved. Please, try again." -msgstr "" - -#: Controller/StateUsersController.php:609 -msgid "The state user has been deleted." -msgstr "" - -#: Controller/StateUsersController.php:611 -msgid "The state user could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionCreationsController.php:42 -msgid "Gradido schöpfen" -msgstr "" - -#: Controller/TransactionCreationsController.php:149 -#: Controller/TransactionCreationsController.php:385 -#: Controller/TransactionCreationsController.php:408 -msgid "Error by requesting LoginServer, please try again" -msgstr "" - -#: Controller/TransactionCreationsController.php:151 -#: Controller/TransactionCreationsController.php:410 -msgid "Error, please wait for the admin to fix it" -msgstr "" - -#: Controller/TransactionCreationsController.php:161 -msgid "Login Server Error, please wait for the admin to fix it" -msgstr "" - -#: Controller/TransactionCreationsController.php:174 -#: Controller/TransactionCreationsController.php:491 -#: Controller/TransactionSendCoinsController.php:204 -msgid "Transaction submitted for review." -msgstr "" - -#: Controller/TransactionCreationsController.php:179 -msgid "Building transaction failed" -msgstr "" - -#: Controller/TransactionCreationsController.php:342 -msgid "No user selected" -msgstr "" - -#: Controller/TransactionCreationsController.php:442 -#: Controller/TransactionSendCoinsController.php:231 -msgid "Fehler mit der Session, bitte logge dich erneut ein!" -msgstr "" - -#: Controller/TransactionCreationsController.php:447 -msgid "Fehler, Benutzer gehört zu einer anderen Gruppe!" -msgstr "" - -#: Controller/TransactionCreationsController.php:452 -#: Controller/TransactionSendCoinsController.php:246 -msgid "Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?" -msgstr "" - -#: Controller/TransactionCreationsController.php:456 -#: Controller/TransactionSendCoinsController.php:250 -msgid "Der Empfänger ist deaktiviert, daher können ihm zurzeit keine Gradidos gesendet werden." -msgstr "" - -#: Controller/TransactionCreationsController.php:460 -msgid "Der Betrag ist ungültig, er muss größer als 0 und <= 1000 sein." -msgstr "" - -#: Controller/TransactionCreationsController.php:464 -#: Controller/TransactionSendCoinsController.php:254 -msgid "Unbehandelter Fehler: " -msgstr "" - -#: Controller/TransactionCreationsController.php:625 -#: Controller/TransactionCreationsController.php:651 -msgid "The transaction creation has been saved." -msgstr "" - -#: Controller/TransactionCreationsController.php:629 -#: Controller/TransactionCreationsController.php:655 -msgid "The transaction creation could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionCreationsController.php:674 -msgid "The transaction creation has been deleted." -msgstr "" - -#: Controller/TransactionCreationsController.php:676 -msgid "The transaction creation could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:57 -#: Controller/TransactionGroupAddaddressController.php:83 -msgid "The transaction group addaddres has been saved." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:61 -#: Controller/TransactionGroupAddaddressController.php:87 -msgid "The transaction group addaddres could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:106 -msgid "The transaction group addaddres has been deleted." -msgstr "" - -#: Controller/TransactionGroupAddaddressController.php:108 -msgid "The transaction group addaddres could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:57 -#: Controller/TransactionGroupAllowtradesController.php:83 -msgid "The transaction group allowtrade has been saved." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:61 -#: Controller/TransactionGroupAllowtradesController.php:87 -msgid "The transaction group allowtrade could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:106 -msgid "The transaction group allowtrade has been deleted." -msgstr "" - -#: Controller/TransactionGroupAllowtradesController.php:108 -msgid "The transaction group allowtrade could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:57 -#: Controller/TransactionGroupCreatesController.php:83 -msgid "The transaction group create has been saved." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:61 -#: Controller/TransactionGroupCreatesController.php:87 -msgid "The transaction group create could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:106 -msgid "The transaction group create has been deleted." -msgstr "" - -#: Controller/TransactionGroupCreatesController.php:108 -msgid "The transaction group create could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:45 -#: Template/Dashboard/index.ctp:38 -#: Template/Element/navi.ctp:34 -#: Template/StateUsers/view.ctp:83 -#: Template/StateUsers/view.ctp:117 -#: Template/TransactionSendCoins/create.ctp:9 -#: Template/TransactionSendCoins/create_raw.ctp:9 -msgid "Überweisung" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:92 -#: Controller/TransactionSendCoinsController.php:119 -msgid "The transaction send coin has been saved." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:96 -#: Controller/TransactionSendCoinsController.php:123 -msgid "The transaction send coin could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:173 -msgid "Du hast nicht genug Gradidos!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:179 -msgid "Du kannst dir selbst keine Gradidos senden!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:236 -msgid "Empfänger befindet sich nicht in Zielgruppe!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:241 -msgid "Ein Verwendungszweck zwischen 5 und 150 Zeichen wird benötig!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:428 -msgid "Error validating transaction" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:431 -msgid "Error saving transaction" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:433 -msgid "Gradidos erfolgreich überwiesen!" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:437 -msgid "Error building transaction" -msgstr "" - -#: Controller/TransactionSendCoinsController.php:462 -msgid "The transaction send coin has been deleted." -msgstr "" - -#: Controller/TransactionSendCoinsController.php:464 -msgid "The transaction send coin could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionSignaturesController.php:57 -#: Controller/TransactionSignaturesController.php:82 -msgid "The transaction signature has been saved." -msgstr "" - -#: Controller/TransactionSignaturesController.php:61 -#: Controller/TransactionSignaturesController.php:86 -msgid "The transaction signature could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionSignaturesController.php:104 -msgid "The transaction signature has been deleted." -msgstr "" - -#: Controller/TransactionSignaturesController.php:106 -msgid "The transaction signature could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionTypesController.php:54 -#: Controller/TransactionTypesController.php:78 -msgid "The transaction type has been saved." -msgstr "" - -#: Controller/TransactionTypesController.php:58 -#: Controller/TransactionTypesController.php:82 -msgid "The transaction type could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionTypesController.php:99 -msgid "The transaction type has been deleted." -msgstr "" - -#: Controller/TransactionTypesController.php:101 -msgid "The transaction type could not be deleted. Please, try again." -msgstr "" - -#: Controller/TransactionsController.php:252 -msgid "No valid data given, please try again." -msgstr "" - -#: Controller/TransactionsController.php:289 -msgid "error retriving last saved transaction from gradido node." -msgstr "" - -#: Controller/TransactionsController.php:391 -#: Controller/TransactionsController.php:420 -msgid "The transaction has been saved." -msgstr "" - -#: Controller/TransactionsController.php:394 -msgid "Error by saving: " -msgstr "" - -#: Controller/TransactionsController.php:397 -#: Controller/TransactionsController.php:424 -msgid "The transaction could not be saved. Please, try again." -msgstr "" - -#: Controller/TransactionsController.php:443 -msgid "The transaction has been deleted." -msgstr "" - -#: Controller/TransactionsController.php:445 -msgid "The transaction could not be deleted. Please, try again." -msgstr "" - -#: Controller/UsersController.php:26 -msgid "Benutzerstatistiken" -msgstr "" - -#: Controller/UsersController.php:115 -#: Controller/UsersController.php:139 -msgid "The user has been saved." -msgstr "" - -#: Controller/UsersController.php:119 -#: Controller/UsersController.php:143 -msgid "The user could not be saved. Please, try again." -msgstr "" - -#: Controller/UsersController.php:160 -msgid "The user has been deleted." -msgstr "" - -#: Controller/UsersController.php:162 -msgid "The user could not be deleted. Please, try again." -msgstr "" - -#: Form/CreationForm.php:44 -#: Form/ProfileForm.php:39 -#: Form/TransferForm.php:42 -#: Form/TransferForm.php:53 -#: Form/TransferRawForm.php:35 -msgid "No HTML Tags like > or < please." -msgstr "" - -#: Form/CreationForm.php:56 -msgid "Please give a valid number with maximal 2 decimal places" -msgstr "" - -#: Form/ProfileForm.php:26 -msgid "The first name should contain max 255 characters" -msgstr "" - -#: Form/ProfileForm.php:30 -msgid "The last name should contain max 255 characters" -msgstr "" - -#: Form/ProfileForm.php:34 -msgid "The description should contain max 2000 characters" -msgstr "" - -#: Form/TransferForm.php:36 -msgid "A valid email address is required" -msgstr "" - -#: Form/TransferForm.php:46 -#: Form/TransferRawForm.php:29 -msgid "The memo should contain max 150 character" -msgstr "" - -#: Form/TransferForm.php:65 -#: Form/TransferRawForm.php:56 -msgid "Please give a valid positive number with maximal 2 decimal places" -msgstr "" - -#: Form/UserSearchForm.php:34 -msgid "The search text should contain max 50 character" -msgstr "" - -#: Form/UserSearchForm.php:41 -msgid "No HTML Tags like < or > please." -msgstr "" - -#: Model/Table/ServerUsersTable.php:58 -msgid "Please give a username" -msgstr "" - -#: Model/Table/ServerUsersTable.php:64 -msgid "Please give a password" -msgstr "" - -#: Model/Table/ServerUsersTable.php:69 -msgid "Please give a email" -msgstr "" - -#: Model/Transactions/TransactionCreation.php:209 -msgid "Gradido Schöpfung erhalten" -msgstr "" - -#: Model/Transactions/TransactionTransfer.php:210 -msgid "Gradidos erhalten" -msgstr "" - -#: Template/AddressTypes/add.ctp:9 -#: Template/AddressTypes/edit.ctp:9 -#: Template/AddressTypes/index.ctp:9 -#: Template/AddressTypes/index.ctp:25 -#: Template/AddressTypes/view.ctp:9 -#: Template/AddressTypes/view.ctp:45 -#: Template/AddressTypes/view.ctp:73 -#: Template/AdminErrors/add.ctp:9 -#: Template/AdminErrors/edit.ctp:9 -#: Template/AdminErrors/index.ctp:9 -#: Template/AdminErrors/index.ctp:26 -#: Template/AdminErrors/view.ctp:9 -#: Template/BlockchainTypes/add.ctp:9 -#: Template/BlockchainTypes/edit.ctp:9 -#: Template/BlockchainTypes/index.ctp:9 -#: Template/BlockchainTypes/index.ctp:22 -#: Template/BlockchainTypes/view.ctp:9 -#: Template/CommunityProfiles/add.ctp:9 -#: Template/CommunityProfiles/edit.ctp:9 -#: Template/CommunityProfiles/index.ctp:9 -#: Template/CommunityProfiles/index.ctp:21 -#: Template/CommunityProfiles/view.ctp:9 -#: Template/ElopageBuys/add.ctp:9 -#: Template/ElopageBuys/edit.ctp:9 -#: Template/ElopageBuys/index.ctp:9 -#: Template/ElopageBuys/index.ctp:30 -#: Template/ElopageBuys/view.ctp:9 -#: Template/OperatorTypes/add.ctp:9 -#: Template/OperatorTypes/edit.ctp:9 -#: Template/OperatorTypes/index.ctp:9 -#: Template/OperatorTypes/index.ctp:23 -#: Template/OperatorTypes/view.ctp:9 -#: Template/OperatorTypes/view.ctp:43 -#: Template/Operators/add.ctp:9 -#: Template/Operators/edit.ctp:9 -#: Template/Operators/index.ctp:9 -#: Template/Operators/index.ctp:24 -#: Template/Operators/view.ctp:9 -#: Template/Roles/add.ctp:9 -#: Template/Roles/edit.ctp:9 -#: Template/Roles/index.ctp:9 -#: Template/Roles/index.ctp:20 -#: Template/Roles/view.ctp:9 -#: Template/ServerUsers/add.ctp:9 -#: Template/ServerUsers/edit.ctp:9 -#: Template/ServerUsers/index.ctp:9 -#: Template/ServerUsers/index.ctp:26 -#: Template/ServerUsers/view.ctp:9 -#: Template/StateBalances/add.ctp:9 -#: Template/StateBalances/edit.ctp:9 -#: Template/StateBalances/index.ctp:9 -#: Template/StateBalances/index.ctp:25 -#: Template/StateBalances/view.ctp:9 -#: Template/StateCreated/add.ctp:9 -#: Template/StateCreated/edit.ctp:9 -#: Template/StateCreated/index.ctp:9 -#: Template/StateCreated/index.ctp:29 -#: Template/StateCreated/view.ctp:9 -#: Template/StateErrors/add.ctp:9 -#: Template/StateErrors/edit.ctp:9 -#: Template/StateErrors/index.ctp:9 -#: Template/StateErrors/index.ctp:26 -#: Template/StateErrors/view.ctp:9 -#: Template/StateGroupAddresses/add.ctp:9 -#: Template/StateGroupAddresses/edit.ctp:9 -#: Template/StateGroupAddresses/index.ctp:9 -#: Template/StateGroupAddresses/index.ctp:26 -#: Template/StateGroupAddresses/view.ctp:9 -#: Template/StateGroupRelationships/add.ctp:9 -#: Template/StateGroupRelationships/edit.ctp:9 -#: Template/StateGroupRelationships/index.ctp:9 -#: Template/StateGroupRelationships/index.ctp:22 -#: Template/StateGroupRelationships/view.ctp:9 -#: Template/StateGroups/add.ctp:9 -#: Template/StateGroups/edit.ctp:9 -#: Template/StateGroups/index.ctp:9 -#: Template/StateGroups/index.ctp:29 -#: Template/StateGroups/view.ctp:9 -#: Template/StateGroups/view.ctp:49 -#: Template/StateGroups/view.ctp:76 -#: Template/StateGroups/view.ctp:104 -#: Template/StateGroups/view.ctp:133 -#: Template/StateRelationshipTypes/add.ctp:9 -#: Template/StateRelationshipTypes/edit.ctp:9 -#: Template/StateRelationshipTypes/index.ctp:9 -#: Template/StateRelationshipTypes/index.ctp:21 -#: Template/StateRelationshipTypes/view.ctp:9 -#: Template/StateUserRoles/index.ctp:9 -#: Template/StateUserRoles/index.ctp:36 -#: Template/StateUserRoles/search.ctp:33 -#: Template/StateUserTransactions/add.ctp:9 -#: Template/StateUserTransactions/edit.ctp:9 -#: Template/StateUserTransactions/index.ctp:9 -#: Template/StateUserTransactions/index.ctp:28 -#: Template/StateUserTransactions/view.ctp:9 -#: Template/StateUsers/add.ctp:9 -#: Template/StateUsers/edit.ctp:9 -#: Template/StateUsers/index.ctp:9 -#: Template/StateUsers/index.ctp:36 -#: Template/StateUsers/view.ctp:9 -#: Template/StateUsers/view.ctp:34 -#: Template/StateUsers/view.ctp:58 -#: Template/StateUsers/view.ctp:89 -#: Template/StateUsers/view.ctp:122 -#: Template/TransactionCreations/add.ctp:9 -#: Template/TransactionCreations/edit.ctp:9 -#: Template/TransactionCreations/index.ctp:9 -#: Template/TransactionCreations/index.ctp:28 -#: Template/TransactionCreations/view.ctp:9 -#: Template/TransactionGroupAddaddress/add.ctp:9 -#: Template/TransactionGroupAddaddress/edit.ctp:9 -#: Template/TransactionGroupAddaddress/index.ctp:9 -#: Template/TransactionGroupAddaddress/index.ctp:26 -#: Template/TransactionGroupAddaddress/view.ctp:9 -#: Template/TransactionGroupAllowtrades/add.ctp:9 -#: Template/TransactionGroupAllowtrades/edit.ctp:9 -#: Template/TransactionGroupAllowtrades/index.ctp:9 -#: Template/TransactionGroupAllowtrades/index.ctp:24 -#: Template/TransactionGroupAllowtrades/view.ctp:9 -#: Template/TransactionGroupCreates/add.ctp:9 -#: Template/TransactionGroupCreates/edit.ctp:9 -#: Template/TransactionGroupCreates/index.ctp:9 -#: Template/TransactionGroupCreates/index.ctp:26 -#: Template/TransactionGroupCreates/view.ctp:9 -#: Template/TransactionSendCoins/add.ctp:9 -#: Template/TransactionSendCoins/edit.ctp:9 -#: Template/TransactionSendCoins/index.ctp:9 -#: Template/TransactionSendCoins/index.ctp:28 -#: Template/TransactionSendCoins/view.ctp:9 -#: Template/TransactionSignatures/add.ctp:9 -#: Template/TransactionSignatures/edit.ctp:9 -#: Template/TransactionSignatures/index.ctp:9 -#: Template/TransactionSignatures/index.ctp:22 -#: Template/TransactionSignatures/view.ctp:9 -#: Template/TransactionTypes/add.ctp:9 -#: Template/TransactionTypes/edit.ctp:9 -#: Template/TransactionTypes/index.ctp:9 -#: Template/TransactionTypes/index.ctp:23 -#: Template/TransactionTypes/view.ctp:9 -#: Template/TransactionTypes/view.ctp:44 -#: Template/Transactions/add.ctp:9 -#: Template/Transactions/edit.ctp:9 -#: Template/Transactions/index.ctp:9 -#: Template/Transactions/view.ctp:9 -#: Template/Transactions/view.ctp:66 -#: Template/Transactions/view.ctp:97 -#: Template/Transactions/view.ctp:125 -#: Template/Transactions/view.ctp:152 -#: Template/Transactions/view.ctp:180 -#: Template/Transactions/view.ctp:211 -#: Template/Transactions/view.ctp:241 -#: Template/Users/add.ctp:9 -#: Template/Users/edit.ctp:9 -#: Template/Users/index.ctp:9 -#: Template/Users/index.ctp:26 -#: Template/Users/view.ctp:9 -msgid "Actions" -msgstr "" - -#: Template/AddressTypes/add.ctp:10 -#: Template/AddressTypes/edit.ctp:16 -#: Template/AddressTypes/view.ctp:12 -#: Template/StateGroupAddresses/add.ctp:13 -#: Template/StateGroupAddresses/edit.ctp:19 -#: Template/StateGroupAddresses/index.ctp:13 -#: Template/StateGroupAddresses/view.ctp:16 -#: Template/TransactionGroupAddaddress/add.ctp:13 -#: Template/TransactionGroupAddaddress/edit.ctp:19 -#: Template/TransactionGroupAddaddress/index.ctp:13 -#: Template/TransactionGroupAddaddress/view.ctp:16 -msgid "List Address Types" -msgstr "" - -#: Template/AddressTypes/add.ctp:11 -#: Template/AddressTypes/edit.ctp:17 -#: Template/AddressTypes/index.ctp:11 -#: Template/AddressTypes/view.ctp:14 -#: Template/StateGroupAddresses/add.ctp:10 -#: Template/StateGroupAddresses/edit.ctp:16 -#: Template/StateGroupAddresses/view.ctp:12 -#: Template/StateGroups/add.ctp:11 -#: Template/StateGroups/edit.ctp:17 -#: Template/StateGroups/index.ctp:11 -#: Template/StateGroups/view.ctp:14 -msgid "List State Group Addresses" -msgstr "" - -#: Template/AddressTypes/add.ctp:12 -#: Template/AddressTypes/edit.ctp:18 -#: Template/AddressTypes/index.ctp:12 -#: Template/AddressTypes/view.ctp:15 -#: Template/StateGroupAddresses/index.ctp:10 -#: Template/StateGroupAddresses/view.ctp:13 -#: Template/StateGroups/add.ctp:12 -#: Template/StateGroups/edit.ctp:18 -#: Template/StateGroups/index.ctp:12 -#: Template/StateGroups/view.ctp:15 -msgid "New State Group Address" -msgstr "" - -#: Template/AddressTypes/add.ctp:13 -#: Template/AddressTypes/edit.ctp:19 -#: Template/AddressTypes/index.ctp:13 -#: Template/AddressTypes/view.ctp:16 -#: Template/TransactionGroupAddaddress/add.ctp:10 -#: Template/TransactionGroupAddaddress/edit.ctp:16 -#: Template/TransactionGroupAddaddress/view.ctp:12 -#: Template/Transactions/add.ctp:19 -#: Template/Transactions/edit.ctp:25 -#: Template/Transactions/index.ctp:19 -#: Template/Transactions/view.ctp:22 -msgid "List Transaction Group Addaddress" -msgstr "" - -#: Template/AddressTypes/add.ctp:14 -#: Template/AddressTypes/edit.ctp:20 -#: Template/AddressTypes/index.ctp:14 -#: Template/AddressTypes/view.ctp:17 -#: Template/TransactionGroupAddaddress/index.ctp:10 -#: Template/TransactionGroupAddaddress/view.ctp:13 -#: Template/Transactions/add.ctp:20 -#: Template/Transactions/edit.ctp:26 -#: Template/Transactions/index.ctp:20 -#: Template/Transactions/view.ctp:23 -msgid "New Transaction Group Addaddres" -msgstr "" - -#: Template/AddressTypes/add.ctp:20 -msgid "Add Address Type" -msgstr "" - -#: Template/AddressTypes/add.ctp:26 -#: Template/AddressTypes/edit.ctp:32 -#: Template/AdminErrors/add.ctp:28 -#: Template/AdminErrors/edit.ctp:34 -#: Template/BlockchainTypes/add.ctp:23 -#: Template/BlockchainTypes/edit.ctp:29 -#: Template/CommunityProfiles/add.ctp:22 -#: Template/CommunityProfiles/edit.ctp:28 -#: Template/ElopageBuys/add.ctp:31 -#: Template/ElopageBuys/edit.ctp:37 -#: Template/OperatorTypes/add.ctp:24 -#: Template/OperatorTypes/edit.ctp:30 -#: Template/Operators/add.ctp:24 -#: Template/Operators/edit.ctp:30 -#: Template/Roles/add.ctp:21 -#: Template/Roles/edit.ctp:27 -#: Template/ServerUsers/add.ctp:24 -#: Template/ServerUsers/edit.ctp:32 -#: Template/StateBalances/add.ctp:25 -#: Template/StateBalances/edit.ctp:31 -#: Template/StateCreated/add.ctp:29 -#: Template/StateCreated/edit.ctp:35 -#: Template/StateErrors/add.ctp:27 -#: Template/StateErrors/edit.ctp:33 -#: Template/StateGroupAddresses/add.ctp:26 -#: Template/StateGroupAddresses/edit.ctp:32 -#: Template/StateGroupRelationships/add.ctp:23 -#: Template/StateGroupRelationships/edit.ctp:29 -#: Template/StateGroups/add.ctp:30 -#: Template/StateGroups/edit.ctp:36 -#: Template/StateRelationshipTypes/add.ctp:22 -#: Template/StateRelationshipTypes/edit.ctp:28 -#: Template/StateUserTransactions/add.ctp:29 -#: Template/StateUserTransactions/edit.ctp:35 -#: Template/StateUsers/add.ctp:32 -#: Template/StateUsers/edit.ctp:37 -#: Template/TransactionCreations/add.ctp:27 -#: Template/TransactionCreations/edit.ctp:33 -#: Template/TransactionGroupAddaddress/add.ctp:26 -#: Template/TransactionGroupAddaddress/edit.ctp:32 -#: Template/TransactionGroupAllowtrades/add.ctp:25 -#: Template/TransactionGroupAllowtrades/edit.ctp:31 -#: Template/TransactionGroupCreates/add.ctp:27 -#: Template/TransactionGroupCreates/edit.ctp:33 -#: Template/TransactionSendCoins/add.ctp:28 -#: Template/TransactionSendCoins/edit.ctp:34 -#: Template/TransactionSignatures/add.ctp:23 -#: Template/TransactionSignatures/edit.ctp:29 -#: Template/TransactionTypes/add.ctp:24 -#: Template/TransactionTypes/edit.ctp:30 -#: Template/Transactions/add.ctp:42 -#: Template/Transactions/edit.ctp:47 -#: Template/Users/add.ctp:26 -#: Template/Users/edit.ctp:32 -msgid "Submit" -msgstr "" - -#: Template/AddressTypes/edit.ctp:11 -#: Template/AddressTypes/index.ctp:37 -#: Template/AddressTypes/view.ctp:56 -#: Template/AddressTypes/view.ctp:85 -#: Template/AdminErrors/edit.ctp:11 -#: Template/AdminErrors/index.ctp:43 -#: Template/BlockchainTypes/edit.ctp:11 -#: Template/BlockchainTypes/index.ctp:35 -#: Template/CommunityProfiles/edit.ctp:11 -#: Template/CommunityProfiles/index.ctp:33 -#: Template/ElopageBuys/edit.ctp:11 -#: Template/ElopageBuys/index.ctp:51 -#: Template/OperatorTypes/edit.ctp:11 -#: Template/OperatorTypes/index.ctp:35 -#: Template/OperatorTypes/view.ctp:54 -#: Template/Operators/edit.ctp:11 -#: Template/Operators/index.ctp:40 -#: Template/Roles/edit.ctp:11 -#: Template/Roles/index.ctp:31 -#: Template/ServerUsers/edit.ctp:11 -#: Template/ServerUsers/index.ctp:43 -#: Template/StateBalances/edit.ctp:11 -#: Template/StateBalances/index.ctp:38 -#: Template/StateCreated/edit.ctp:11 -#: Template/StateCreated/index.ctp:45 -#: Template/StateErrors/edit.ctp:11 -#: Template/StateErrors/index.ctp:39 -#: Template/StateErrors/show_for_user.ctp:44 -#: Template/StateGroupAddresses/edit.ctp:11 -#: Template/StateGroupAddresses/index.ctp:39 -#: Template/StateGroupRelationships/edit.ctp:11 -#: Template/StateGroupRelationships/index.ctp:35 -#: Template/StateGroups/edit.ctp:11 -#: Template/StateGroups/index.ctp:41 -#: Template/StateGroups/view.ctp:60 -#: Template/StateGroups/view.ctp:87 -#: Template/StateGroups/view.ctp:116 -#: Template/StateGroups/view.ctp:145 -#: Template/StateRelationshipTypes/edit.ctp:11 -#: Template/StateRelationshipTypes/index.ctp:33 -#: Template/StateUserRoles/index.ctp:53 -#: Template/StateUserTransactions/edit.ctp:11 -#: Template/StateUserTransactions/index.ctp:41 -#: Template/StateUsers/edit.ctp:11 -#: Template/StateUsers/index.ctp:53 -#: Template/TransactionCreations/edit.ctp:11 -#: Template/TransactionGroupAddaddress/edit.ctp:11 -#: Template/TransactionGroupAddaddress/index.ctp:39 -#: Template/TransactionGroupAllowtrades/edit.ctp:11 -#: Template/TransactionGroupAllowtrades/index.ctp:37 -#: Template/TransactionGroupCreates/edit.ctp:11 -#: Template/TransactionGroupCreates/index.ctp:39 -#: Template/TransactionSendCoins/edit.ctp:11 -#: Template/TransactionSignatures/edit.ctp:11 -#: Template/TransactionSignatures/index.ctp:33 -#: Template/TransactionTypes/edit.ctp:11 -#: Template/TransactionTypes/index.ctp:35 -#: Template/TransactionTypes/view.ctp:56 -#: Template/Transactions/edit.ctp:11 -#: Template/Transactions/view.ctp:80 -#: Template/Transactions/view.ctp:109 -#: Template/Transactions/view.ctp:136 -#: Template/Transactions/view.ctp:163 -#: Template/Transactions/view.ctp:192 -#: Template/Transactions/view.ctp:225 -#: Template/Transactions/view.ctp:252 -#: Template/Users/edit.ctp:11 -#: Template/Users/index.ctp:43 -msgid "Delete" -msgstr "" - -#: Template/AddressTypes/edit.ctp:13 -#: Template/AddressTypes/index.ctp:37 -#: Template/AddressTypes/view.ctp:11 -#: Template/AddressTypes/view.ctp:56 -#: Template/AddressTypes/view.ctp:85 -#: Template/AdminErrors/edit.ctp:13 -#: Template/AdminErrors/index.ctp:43 -#: Template/AdminErrors/view.ctp:11 -#: Template/BlockchainTypes/edit.ctp:13 -#: Template/BlockchainTypes/index.ctp:35 -#: Template/BlockchainTypes/view.ctp:11 -#: Template/CommunityProfiles/edit.ctp:13 -#: Template/CommunityProfiles/index.ctp:33 -#: Template/CommunityProfiles/view.ctp:11 -#: Template/ElopageBuys/edit.ctp:13 -#: Template/ElopageBuys/index.ctp:51 -#: Template/ElopageBuys/view.ctp:11 -#: Template/OperatorTypes/edit.ctp:13 -#: Template/OperatorTypes/index.ctp:35 -#: Template/OperatorTypes/view.ctp:11 -#: Template/OperatorTypes/view.ctp:54 -#: Template/Operators/edit.ctp:13 -#: Template/Operators/index.ctp:40 -#: Template/Operators/view.ctp:11 -#: Template/Roles/edit.ctp:13 -#: Template/Roles/index.ctp:31 -#: Template/Roles/view.ctp:11 -#: Template/ServerUsers/edit.ctp:13 -#: Template/ServerUsers/index.ctp:43 -#: Template/ServerUsers/view.ctp:11 -#: Template/StateBalances/edit.ctp:13 -#: Template/StateBalances/index.ctp:38 -#: Template/StateBalances/view.ctp:11 -#: Template/StateCreated/edit.ctp:13 -#: Template/StateCreated/index.ctp:45 -#: Template/StateCreated/view.ctp:11 -#: Template/StateErrors/edit.ctp:13 -#: Template/StateErrors/index.ctp:39 -#: Template/StateErrors/view.ctp:11 -#: Template/StateGroupAddresses/edit.ctp:13 -#: Template/StateGroupAddresses/index.ctp:39 -#: Template/StateGroupAddresses/view.ctp:11 -#: Template/StateGroupRelationships/edit.ctp:13 -#: Template/StateGroupRelationships/index.ctp:35 -#: Template/StateGroupRelationships/view.ctp:11 -#: Template/StateGroups/edit.ctp:13 -#: Template/StateGroups/index.ctp:41 -#: Template/StateGroups/view.ctp:11 -#: Template/StateGroups/view.ctp:60 -#: Template/StateGroups/view.ctp:87 -#: Template/StateGroups/view.ctp:116 -#: Template/StateGroups/view.ctp:145 -#: Template/StateRelationshipTypes/edit.ctp:13 -#: Template/StateRelationshipTypes/index.ctp:33 -#: Template/StateRelationshipTypes/view.ctp:11 -#: Template/StateUserRoles/index.ctp:53 -#: Template/StateUserTransactions/edit.ctp:13 -#: Template/StateUserTransactions/index.ctp:41 -#: Template/StateUserTransactions/view.ctp:11 -#: Template/StateUsers/edit.ctp:13 -#: Template/StateUsers/index.ctp:53 -#: Template/StateUsers/view.ctp:11 -#: Template/TransactionCreations/edit.ctp:13 -#: Template/TransactionCreations/view.ctp:11 -#: Template/TransactionGroupAddaddress/edit.ctp:13 -#: Template/TransactionGroupAddaddress/index.ctp:39 -#: Template/TransactionGroupAddaddress/view.ctp:11 -#: Template/TransactionGroupAllowtrades/edit.ctp:13 -#: Template/TransactionGroupAllowtrades/index.ctp:37 -#: Template/TransactionGroupAllowtrades/view.ctp:11 -#: Template/TransactionGroupCreates/edit.ctp:13 -#: Template/TransactionGroupCreates/index.ctp:39 -#: Template/TransactionGroupCreates/view.ctp:11 -#: Template/TransactionSendCoins/edit.ctp:13 -#: Template/TransactionSendCoins/view.ctp:11 -#: Template/TransactionSignatures/edit.ctp:13 -#: Template/TransactionSignatures/index.ctp:33 -#: Template/TransactionSignatures/view.ctp:11 -#: Template/TransactionTypes/edit.ctp:13 -#: Template/TransactionTypes/index.ctp:35 -#: Template/TransactionTypes/view.ctp:11 -#: Template/TransactionTypes/view.ctp:56 -#: Template/Transactions/edit.ctp:13 -#: Template/Transactions/view.ctp:11 -#: Template/Transactions/view.ctp:80 -#: Template/Transactions/view.ctp:109 -#: Template/Transactions/view.ctp:136 -#: Template/Transactions/view.ctp:163 -#: Template/Transactions/view.ctp:192 -#: Template/Transactions/view.ctp:225 -#: Template/Transactions/view.ctp:252 -#: Template/Users/edit.ctp:13 -#: Template/Users/index.ctp:43 -#: Template/Users/view.ctp:11 -msgid "Are you sure you want to delete # {0}?" -msgstr "" - -#: Template/AddressTypes/edit.ctp:26 -#: Template/AddressTypes/view.ctp:10 -msgid "Edit Address Type" -msgstr "" - -#: Template/AddressTypes/index.ctp:10 -#: Template/AddressTypes/view.ctp:13 -#: Template/StateGroupAddresses/add.ctp:14 -#: Template/StateGroupAddresses/edit.ctp:20 -#: Template/StateGroupAddresses/index.ctp:14 -#: Template/StateGroupAddresses/view.ctp:17 -#: Template/TransactionGroupAddaddress/add.ctp:14 -#: Template/TransactionGroupAddaddress/edit.ctp:20 -#: Template/TransactionGroupAddaddress/index.ctp:14 -#: Template/TransactionGroupAddaddress/view.ctp:17 -msgid "New Address Type" -msgstr "" - -#: Template/AddressTypes/index.ctp:18 -msgid "Address Types" -msgstr "" - -#: Template/AddressTypes/index.ctp:35 -#: Template/AddressTypes/view.ctp:54 -#: Template/AddressTypes/view.ctp:83 -#: Template/AdminErrors/index.ctp:39 -#: Template/BlockchainTypes/index.ctp:33 -#: Template/CommunityProfiles/index.ctp:31 -#: Template/ElopageBuys/index.ctp:49 -#: Template/OperatorTypes/index.ctp:33 -#: Template/OperatorTypes/view.ctp:52 -#: Template/Operators/index.ctp:38 -#: Template/Roles/index.ctp:29 -#: Template/ServerUsers/index.ctp:41 -#: Template/StateBalances/index.ctp:36 -#: Template/StateCreated/index.ctp:43 -#: Template/StateErrors/index.ctp:37 -#: Template/StateGroupAddresses/index.ctp:37 -#: Template/StateGroupRelationships/index.ctp:33 -#: Template/StateGroups/index.ctp:39 -#: Template/StateGroups/view.ctp:58 -#: Template/StateGroups/view.ctp:85 -#: Template/StateGroups/view.ctp:114 -#: Template/StateGroups/view.ctp:143 -#: Template/StateRelationshipTypes/index.ctp:31 -#: Template/StateUserRoles/index.ctp:51 -#: Template/StateUserTransactions/index.ctp:39 -#: Template/StateUsers/index.ctp:51 -#: Template/StateUsers/view.ctp:41 -#: Template/StateUsers/view.ctp:71 -#: Template/StateUsers/view.ctp:104 -#: Template/StateUsers/view.ctp:136 -#: Template/TransactionCreations/index.ctp:42 -#: Template/TransactionGroupAddaddress/index.ctp:37 -#: Template/TransactionGroupAllowtrades/index.ctp:35 -#: Template/TransactionGroupCreates/index.ctp:37 -#: Template/TransactionSendCoins/index.ctp:41 -#: Template/TransactionSignatures/index.ctp:31 -#: Template/TransactionTypes/index.ctp:33 -#: Template/TransactionTypes/view.ctp:54 -#: Template/Transactions/view.ctp:78 -#: Template/Transactions/view.ctp:107 -#: Template/Transactions/view.ctp:134 -#: Template/Transactions/view.ctp:161 -#: Template/Transactions/view.ctp:190 -#: Template/Transactions/view.ctp:223 -#: Template/Transactions/view.ctp:250 -#: Template/Users/index.ctp:41 -msgid "View" -msgstr "" - -#: Template/AddressTypes/index.ctp:36 -#: Template/AddressTypes/view.ctp:55 -#: Template/AddressTypes/view.ctp:84 -#: Template/AdminErrors/index.ctp:41 -#: Template/BlockchainTypes/index.ctp:34 -#: Template/CommunityProfiles/index.ctp:32 -#: Template/ElopageBuys/index.ctp:50 -#: Template/OperatorTypes/index.ctp:34 -#: Template/OperatorTypes/view.ctp:53 -#: Template/Operators/index.ctp:39 -#: Template/Roles/index.ctp:30 -#: Template/ServerUsers/index.ctp:42 -#: Template/StateBalances/index.ctp:37 -#: Template/StateCreated/index.ctp:44 -#: Template/StateErrors/index.ctp:38 -#: Template/StateGroupAddresses/index.ctp:38 -#: Template/StateGroupRelationships/index.ctp:34 -#: Template/StateGroups/index.ctp:40 -#: Template/StateGroups/view.ctp:59 -#: Template/StateGroups/view.ctp:86 -#: Template/StateGroups/view.ctp:115 -#: Template/StateGroups/view.ctp:144 -#: Template/StateRelationshipTypes/index.ctp:32 -#: Template/StateUserRoles/index.ctp:52 -#: Template/StateUserTransactions/index.ctp:40 -#: Template/StateUsers/index.ctp:52 -#: Template/TransactionGroupAddaddress/index.ctp:38 -#: Template/TransactionGroupAllowtrades/index.ctp:36 -#: Template/TransactionGroupCreates/index.ctp:38 -#: Template/TransactionSignatures/index.ctp:32 -#: Template/TransactionTypes/index.ctp:34 -#: Template/TransactionTypes/view.ctp:55 -#: Template/Transactions/view.ctp:79 -#: Template/Transactions/view.ctp:108 -#: Template/Transactions/view.ctp:135 -#: Template/Transactions/view.ctp:162 -#: Template/Transactions/view.ctp:191 -#: Template/Transactions/view.ctp:224 -#: Template/Transactions/view.ctp:251 -#: Template/Users/index.ctp:42 -msgid "Edit" -msgstr "" - -#: Template/AddressTypes/index.ctp:45 -#: Template/AdminErrors/index.ctp:50 -#: Template/BlockchainTypes/index.ctp:43 -#: Template/CommunityProfiles/index.ctp:41 -#: Template/ElopageBuys/index.ctp:59 -#: Template/OperatorTypes/index.ctp:43 -#: Template/Operators/index.ctp:48 -#: Template/Roles/index.ctp:39 -#: Template/ServerUsers/index.ctp:51 -#: Template/StateBalances/index.ctp:46 -#: Template/StateCreated/index.ctp:53 -#: Template/StateErrors/index.ctp:47 -#: Template/StateGroupAddresses/index.ctp:47 -#: Template/StateGroupRelationships/index.ctp:43 -#: Template/StateGroups/index.ctp:49 -#: Template/StateRelationshipTypes/index.ctp:41 -#: Template/StateUserRoles/index.ctp:61 -#: Template/StateUserTransactions/index.ctp:49 -#: Template/StateUsers/index.ctp:61 -#: Template/TransactionCreations/index.ctp:50 -#: Template/TransactionGroupAddaddress/index.ctp:47 -#: Template/TransactionGroupAllowtrades/index.ctp:45 -#: Template/TransactionGroupCreates/index.ctp:47 -#: Template/TransactionSendCoins/index.ctp:49 -#: Template/TransactionSignatures/index.ctp:41 -#: Template/TransactionTypes/index.ctp:43 -#: Template/Transactions/index.ctp:50 -#: Template/Users/index.ctp:51 -msgid "first" -msgstr "" - -#: Template/AddressTypes/index.ctp:46 -#: Template/AdminErrors/index.ctp:51 -#: Template/BlockchainTypes/index.ctp:44 -#: Template/CommunityProfiles/index.ctp:42 -#: Template/ElopageBuys/index.ctp:60 -#: Template/OperatorTypes/index.ctp:44 -#: Template/Operators/index.ctp:49 -#: Template/Roles/index.ctp:40 -#: Template/ServerUsers/index.ctp:52 -#: Template/StateBalances/index.ctp:47 -#: Template/StateCreated/index.ctp:54 -#: Template/StateErrors/index.ctp:48 -#: Template/StateGroupAddresses/index.ctp:48 -#: Template/StateGroupRelationships/index.ctp:44 -#: Template/StateGroups/index.ctp:50 -#: Template/StateRelationshipTypes/index.ctp:42 -#: Template/StateUserRoles/index.ctp:62 -#: Template/StateUserTransactions/index.ctp:50 -#: Template/StateUsers/index.ctp:62 -#: Template/TransactionCreations/index.ctp:51 -#: Template/TransactionGroupAddaddress/index.ctp:48 -#: Template/TransactionGroupAllowtrades/index.ctp:46 -#: Template/TransactionGroupCreates/index.ctp:48 -#: Template/TransactionSendCoins/index.ctp:50 -#: Template/TransactionSignatures/index.ctp:42 -#: Template/TransactionTypes/index.ctp:44 -#: Template/Transactions/index.ctp:51 -#: Template/Users/index.ctp:52 -msgid "previous" -msgstr "" - -#: Template/AddressTypes/index.ctp:48 -#: Template/AdminErrors/index.ctp:53 -#: Template/BlockchainTypes/index.ctp:46 -#: Template/CommunityProfiles/index.ctp:44 -#: Template/ElopageBuys/index.ctp:62 -#: Template/OperatorTypes/index.ctp:46 -#: Template/Operators/index.ctp:51 -#: Template/Roles/index.ctp:42 -#: Template/ServerUsers/index.ctp:54 -#: Template/StateBalances/index.ctp:49 -#: Template/StateCreated/index.ctp:56 -#: Template/StateErrors/index.ctp:50 -#: Template/StateGroupAddresses/index.ctp:50 -#: Template/StateGroupRelationships/index.ctp:46 -#: Template/StateGroups/index.ctp:52 -#: Template/StateRelationshipTypes/index.ctp:44 -#: Template/StateUserRoles/index.ctp:64 -#: Template/StateUserTransactions/index.ctp:52 -#: Template/StateUsers/index.ctp:64 -#: Template/TransactionCreations/index.ctp:53 -#: Template/TransactionGroupAddaddress/index.ctp:50 -#: Template/TransactionGroupAllowtrades/index.ctp:48 -#: Template/TransactionGroupCreates/index.ctp:50 -#: Template/TransactionSendCoins/index.ctp:52 -#: Template/TransactionSignatures/index.ctp:44 -#: Template/TransactionTypes/index.ctp:46 -#: Template/Transactions/index.ctp:53 -#: Template/Users/index.ctp:54 -msgid "next" -msgstr "" - -#: Template/AddressTypes/index.ctp:49 -#: Template/AdminErrors/index.ctp:54 -#: Template/BlockchainTypes/index.ctp:47 -#: Template/CommunityProfiles/index.ctp:45 -#: Template/ElopageBuys/index.ctp:63 -#: Template/OperatorTypes/index.ctp:47 -#: Template/Operators/index.ctp:52 -#: Template/Roles/index.ctp:43 -#: Template/ServerUsers/index.ctp:55 -#: Template/StateBalances/index.ctp:50 -#: Template/StateCreated/index.ctp:57 -#: Template/StateErrors/index.ctp:51 -#: Template/StateGroupAddresses/index.ctp:51 -#: Template/StateGroupRelationships/index.ctp:47 -#: Template/StateGroups/index.ctp:53 -#: Template/StateRelationshipTypes/index.ctp:45 -#: Template/StateUserRoles/index.ctp:65 -#: Template/StateUserTransactions/index.ctp:53 -#: Template/StateUsers/index.ctp:65 -#: Template/TransactionCreations/index.ctp:54 -#: Template/TransactionGroupAddaddress/index.ctp:51 -#: Template/TransactionGroupAllowtrades/index.ctp:49 -#: Template/TransactionGroupCreates/index.ctp:51 -#: Template/TransactionSendCoins/index.ctp:53 -#: Template/TransactionSignatures/index.ctp:45 -#: Template/TransactionTypes/index.ctp:47 -#: Template/Transactions/index.ctp:54 -#: Template/Users/index.ctp:55 -msgid "last" -msgstr "" - -#: Template/AddressTypes/index.ctp:51 -#: Template/AdminErrors/index.ctp:56 -#: Template/BlockchainTypes/index.ctp:49 -#: Template/CommunityProfiles/index.ctp:47 -#: Template/ElopageBuys/index.ctp:65 -#: Template/OperatorTypes/index.ctp:49 -#: Template/Operators/index.ctp:54 -#: Template/Roles/index.ctp:45 -#: Template/ServerUsers/index.ctp:57 -#: Template/StateBalances/index.ctp:52 -#: Template/StateCreated/index.ctp:59 -#: Template/StateErrors/index.ctp:53 -#: Template/StateGroupAddresses/index.ctp:53 -#: Template/StateGroupRelationships/index.ctp:49 -#: Template/StateGroups/index.ctp:55 -#: Template/StateRelationshipTypes/index.ctp:47 -#: Template/StateUserRoles/index.ctp:67 -#: Template/StateUserTransactions/index.ctp:55 -#: Template/StateUsers/index.ctp:67 -#: Template/TransactionCreations/index.ctp:56 -#: Template/TransactionGroupAddaddress/index.ctp:53 -#: Template/TransactionGroupAllowtrades/index.ctp:51 -#: Template/TransactionGroupCreates/index.ctp:53 -#: Template/TransactionSendCoins/index.ctp:55 -#: Template/TransactionSignatures/index.ctp:47 -#: Template/TransactionTypes/index.ctp:49 -#: Template/Transactions/index.ctp:56 -#: Template/Users/index.ctp:57 -msgid "Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total" -msgstr "" - -#: Template/AddressTypes/view.ctp:11 -msgid "Delete Address Type" -msgstr "" - -#: Template/AddressTypes/view.ctp:24 -#: Template/BlockchainTypes/view.ctp:20 -#: Template/OperatorTypes/view.ctp:22 -#: Template/StateGroups/view.ctp:28 -#: Template/StateGroups/view.ctp:103 -#: Template/StateRelationshipTypes/view.ctp:20 -#: Template/TransactionGroupCreates/view.ctp:32 -#: Template/TransactionTypes/view.ctp:22 -#: Template/Transactions/view.ctp:179 -#: Template/Users/statistics.ctp:64 -msgid "Name" -msgstr "" - -#: Template/AddressTypes/view.ctp:28 -#: Template/BlockchainTypes/view.ctp:24 -#: Template/OperatorTypes/view.ctp:26 -#: Template/StateRelationshipTypes/view.ctp:24 -#: Template/TransactionTypes/view.ctp:26 -msgid "Text" -msgstr "" - -#: Template/AddressTypes/view.ctp:32 -#: Template/AddressTypes/view.ctp:41 -#: Template/AddressTypes/view.ctp:68 -#: Template/AdminErrors/view.ctp:46 -#: Template/BlockchainTypes/view.ctp:32 -#: Template/CommunityProfiles/view.ctp:24 -#: Template/ElopageBuys/view.ctp:32 -#: Template/OperatorTypes/view.ctp:30 -#: Template/OperatorTypes/view.ctp:39 -#: Template/Operators/view.ctp:32 -#: Template/Roles/view.ctp:24 -#: Template/ServerUsers/view.ctp:36 -#: Template/StateBalances/view.ctp:27 -#: Template/StateCreated/view.ctp:32 -#: Template/StateErrors/view.ctp:32 -#: Template/StateGroupAddresses/view.ctp:28 -#: Template/StateGroupRelationships/view.ctp:20 -#: Template/StateGroups/view.ctp:32 -#: Template/StateGroups/view.ctp:45 -#: Template/StateGroups/view.ctp:72 -#: Template/StateGroups/view.ctp:99 -#: Template/StateGroups/view.ctp:128 -#: Template/StateRelationshipTypes/view.ctp:28 -#: Template/StateUserTransactions/view.ctp:38 -#: Template/TransactionCreations/view.ctp:32 -#: Template/TransactionGroupAddaddress/view.ctp:32 -#: Template/TransactionGroupAllowtrades/view.ctp:26 -#: Template/TransactionGroupCreates/view.ctp:36 -#: Template/TransactionSendCoins/view.ctp:32 -#: Template/TransactionSignatures/view.ctp:26 -#: Template/TransactionTypes/view.ctp:30 -#: Template/TransactionTypes/view.ctp:39 -#: Template/Transactions/view.ctp:46 -#: Template/Transactions/view.ctp:59 -#: Template/Transactions/view.ctp:92 -#: Template/Transactions/view.ctp:121 -#: Template/Transactions/view.ctp:148 -#: Template/Transactions/view.ctp:175 -#: Template/Transactions/view.ctp:204 -#: Template/Transactions/view.ctp:237 -#: Template/Users/view.ctp:36 -msgid "Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:37 -#: Template/StateGroups/view.ctp:41 -msgid "Related State Group Addresses" -msgstr "" - -#: Template/AddressTypes/view.ctp:42 -#: Template/StateGroupAddresses/view.ctp:32 -#: Template/TransactionGroupAllowtrades/view.ctp:30 -#: Template/Transactions/view.ctp:150 -msgid "Group Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:43 -#: Template/AddressTypes/view.ctp:72 -#: Template/StateGroups/view.ctp:47 -#: Template/StateGroups/view.ctp:75 -#: Template/Transactions/view.ctp:124 -msgid "Public Key" -msgstr "" - -#: Template/AddressTypes/view.ctp:44 -#: Template/AddressTypes/view.ctp:70 -#: Template/StateGroups/view.ctp:48 -#: Template/Transactions/view.ctp:123 -msgid "Address Type Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:64 -#: Template/Transactions/view.ctp:117 -msgid "Related Transaction Group Addaddress" -msgstr "" - -#: Template/AddressTypes/view.ctp:69 -#: Template/StateGroups/view.ctp:100 -#: Template/Transactions/view.ctp:60 -#: Template/Transactions/view.ctp:93 -#: Template/Transactions/view.ctp:122 -#: Template/Transactions/view.ctp:149 -#: Template/Transactions/view.ctp:176 -#: Template/Transactions/view.ctp:205 -#: Template/Transactions/view.ctp:238 -msgid "Transaction Id" -msgstr "" - -#: Template/AddressTypes/view.ctp:71 -msgid "Remove From Group" -msgstr "" - -#: Template/AdminErrors/add.ctp:10 -#: Template/AdminErrors/edit.ctp:16 -#: Template/AdminErrors/view.ctp:12 -msgid "List Admin Errors" -msgstr "" - -#: Template/AdminErrors/add.ctp:11 -#: Template/AdminErrors/edit.ctp:17 -#: Template/AdminErrors/index.ctp:11 -#: Template/AdminErrors/view.ctp:14 -#: Template/StateBalances/add.ctp:11 -#: Template/StateBalances/edit.ctp:17 -#: Template/StateBalances/index.ctp:11 -#: Template/StateBalances/view.ctp:14 -#: Template/StateCreated/add.ctp:13 -#: Template/StateCreated/edit.ctp:19 -#: Template/StateCreated/index.ctp:13 -#: Template/StateCreated/view.ctp:16 -#: Template/StateErrors/add.ctp:11 -#: Template/StateErrors/edit.ctp:17 -#: Template/StateErrors/index.ctp:11 -#: Template/StateErrors/view.ctp:14 -#: Template/StateGroups/add.ctp:13 -#: Template/StateGroups/edit.ctp:19 -#: Template/StateGroups/index.ctp:13 -#: Template/StateGroups/view.ctp:16 -#: Template/StateUserTransactions/add.ctp:11 -#: Template/StateUserTransactions/edit.ctp:17 -#: Template/StateUserTransactions/index.ctp:11 -#: Template/StateUserTransactions/view.ctp:14 -#: Template/StateUsers/add.ctp:10 -#: Template/StateUsers/edit.ctp:16 -#: Template/StateUsers/view.ctp:12 -#: Template/TransactionCreations/add.ctp:13 -#: Template/TransactionCreations/edit.ctp:19 -#: Template/TransactionCreations/index.ctp:13 -#: Template/TransactionCreations/view.ctp:16 -#: Template/TransactionSendCoins/add.ctp:13 -#: Template/TransactionSendCoins/edit.ctp:19 -#: Template/TransactionSendCoins/index.ctp:13 -#: Template/TransactionSendCoins/view.ctp:16 -msgid "List State Users" -msgstr "" - -#: Template/AdminErrors/add.ctp:12 -#: Template/AdminErrors/edit.ctp:18 -#: Template/AdminErrors/index.ctp:12 -#: Template/AdminErrors/view.ctp:15 -#: Template/StateBalances/add.ctp:12 -#: Template/StateBalances/edit.ctp:18 -#: Template/StateBalances/index.ctp:12 -#: Template/StateBalances/view.ctp:15 -#: Template/StateCreated/add.ctp:14 -#: Template/StateCreated/edit.ctp:20 -#: Template/StateCreated/index.ctp:14 -#: Template/StateCreated/view.ctp:17 -#: Template/StateErrors/add.ctp:12 -#: Template/StateErrors/edit.ctp:18 -#: Template/StateErrors/index.ctp:12 -#: Template/StateErrors/view.ctp:15 -#: Template/StateGroups/add.ctp:14 -#: Template/StateGroups/edit.ctp:20 -#: Template/StateGroups/index.ctp:14 -#: Template/StateGroups/view.ctp:17 -#: Template/StateUserRoles/index.ctp:10 -#: Template/StateUserTransactions/add.ctp:12 -#: Template/StateUserTransactions/edit.ctp:18 -#: Template/StateUserTransactions/index.ctp:12 -#: Template/StateUserTransactions/view.ctp:15 -#: Template/StateUsers/index.ctp:10 -#: Template/StateUsers/view.ctp:13 -#: Template/TransactionCreations/add.ctp:14 -#: Template/TransactionCreations/edit.ctp:20 -#: Template/TransactionCreations/index.ctp:14 -#: Template/TransactionCreations/view.ctp:17 -#: Template/TransactionSendCoins/add.ctp:14 -#: Template/TransactionSendCoins/edit.ctp:20 -#: Template/TransactionSendCoins/index.ctp:14 -#: Template/TransactionSendCoins/view.ctp:17 -msgid "New State User" -msgstr "" - -#: Template/AdminErrors/add.ctp:18 -msgid "Add Admin Error" -msgstr "" - -#: Template/AdminErrors/edit.ctp:24 -#: Template/AdminErrors/view.ctp:10 -msgid "Edit Admin Error" -msgstr "" - -#: Template/AdminErrors/index.ctp:10 -#: Template/AdminErrors/view.ctp:13 -msgid "New Admin Error" -msgstr "" - -#: Template/AdminErrors/view.ctp:11 -msgid "Delete Admin Error" -msgstr "" - -#: Template/AdminErrors/view.ctp:22 -#: Template/StateBalances/view.ctp:23 -#: Template/StateCreated/view.ctp:28 -#: Template/StateErrors/view.ctp:24 -#: Template/StateUserTransactions/view.ctp:26 -#: Template/TransactionCreations/view.ctp:28 -#: Template/TransactionSendCoins/view.ctp:28 -msgid "State User" -msgstr "" - -#: Template/AdminErrors/view.ctp:26 -msgid "Controller" -msgstr "" - -#: Template/AdminErrors/view.ctp:30 -msgid "Action" -msgstr "" - -#: Template/AdminErrors/view.ctp:34 -msgid "State" -msgstr "" - -#: Template/AdminErrors/view.ctp:38 -msgid "Msg" -msgstr "" - -#: Template/AdminErrors/view.ctp:42 -msgid "Details" -msgstr "" - -#: Template/AdminErrors/view.ctp:50 -#: Template/ServerUsers/view.ctp:44 -#: Template/StateCreated/view.ctp:48 -#: Template/StateErrors/view.ctp:36 -#: Template/Transactions/view.ctp:64 -#: Template/Users/view.ctp:44 -msgid "Created" -msgstr "" - -#: Template/BlockchainTypes/add.ctp:10 -#: Template/BlockchainTypes/edit.ctp:16 -#: Template/BlockchainTypes/view.ctp:12 -msgid "List Blockchain Types" -msgstr "" - -#: Template/BlockchainTypes/add.ctp:16 -msgid "Add Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/edit.ctp:22 -#: Template/BlockchainTypes/view.ctp:10 -msgid "Edit Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/index.ctp:10 -#: Template/BlockchainTypes/view.ctp:13 -msgid "New Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/index.ctp:14 -msgid "Blockchain Types" -msgstr "" - -#: Template/BlockchainTypes/view.ctp:11 -msgid "Delete Blockchain Type" -msgstr "" - -#: Template/BlockchainTypes/view.ctp:28 -msgid "Symbol" -msgstr "" - -#: Template/CommunityProfiles/add.ctp:10 -#: Template/CommunityProfiles/edit.ctp:16 -#: Template/CommunityProfiles/view.ctp:12 -msgid "List Community Profiles" -msgstr "" - -#: Template/CommunityProfiles/add.ctp:16 -msgid "Add Community Profile" -msgstr "" - -#: Template/CommunityProfiles/edit.ctp:22 -#: Template/CommunityProfiles/view.ctp:10 -msgid "Edit Community Profile" -msgstr "" - -#: Template/CommunityProfiles/index.ctp:10 -#: Template/CommunityProfiles/view.ctp:13 -msgid "New Community Profile" -msgstr "" - -#: Template/CommunityProfiles/index.ctp:14 -msgid "Community Profiles" -msgstr "" - -#: Template/CommunityProfiles/view.ctp:11 -msgid "Delete Community Profile" -msgstr "" - -#: Template/CommunityProfiles/view.ctp:20 -msgid "Profile Desc" -msgstr "" - -#: Template/CommunityProfiles/view.ctp:28 -#: Template/Transactions/view.ctp:63 -#: Template/Transactions/view.ctp:94 -#: Template/Transactions/view.ctp:206 -msgid "State User Id" -msgstr "" - -#: Template/Dashboard/error_http_request.ctp:9 -msgid "Error, Please try again" -msgstr "" - -#: Template/Dashboard/error_http_request.ctp:13 -#: Template/Layout/error.ctp:43 -msgid "Back" -msgstr "" - -#: Template/Dashboard/index.ctp:14 -#: Template/Dashboard/index.ctp:18 -#: Template/Dashboard/server_index.ctp:9 -msgid "Willkommen" -msgstr "" - -#: Template/Dashboard/index.ctp:47 -msgid "löschen" -msgstr "" - -#: Template/Dashboard/index.ctp:51 -msgid "Adminbereich" -msgstr "" - -#: Template/Dashboard/index.ctp:57 -#: Template/Dashboard/server_index.ctp:21 -msgid "viele schöpfen" -msgstr "" - -#: Template/Dashboard/index.ctp:70 -msgid "Anmeldungen" -msgstr "" - -#: Template/Dashboard/index.ctp:94 -msgid "suchen" -msgstr "" - -#: Template/Dashboard/index.ctp:102 -msgid "hinzufügen" -msgstr "" - -#: Template/Dashboard/index.ctp:108 -msgid "hat sein Passwort und Passphrase vergessen" -msgstr "" - -#: Template/Dashboard/index.ctp:119 -msgid "Gruppen" -msgstr "" - -#: Template/Dashboard/index.ctp:125 -msgid "Server" -msgstr "" - -#: Template/Dashboard/index.ctp:131 -msgid "Topics" -msgstr "" - -#: Template/Dashboard/index.ctp:139 -msgid "Hedera Accounts" -msgstr "" - -#: Template/Element/navi.ctp:35 -msgid "Mitgliederbereich" -msgstr "" - -#: Template/Element/navi_header.ctp:38 -#: Template/Element/navi_notify.ctp:35 -msgid "Transaktionen sind noch zu unterzeichnen" -msgstr "" - -#: Template/Element/user_menu.ctp:22 -msgid "Abmelden" -msgstr "" - -#: Template/Element/Flash/success.ctp:9 -msgid "Info:" -msgstr "" - -#: Template/ElopageBuys/add.ctp:10 -#: Template/ElopageBuys/edit.ctp:16 -#: Template/ElopageBuys/view.ctp:12 -msgid "List Elopage Buys" -msgstr "" - -#: Template/ElopageBuys/add.ctp:16 -msgid "Add Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/edit.ctp:22 -#: Template/ElopageBuys/view.ctp:10 -msgid "Edit Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/index.ctp:10 -#: Template/ElopageBuys/view.ctp:13 -msgid "New Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/index.ctp:14 -msgid "Elopage Buys" -msgstr "" - -#: Template/ElopageBuys/statistics.ctp:28 -#: Template/Users/statistics.ctp:49 -msgid "Anmeldungen diesen Monat" -msgstr "" - -#: Template/ElopageBuys/view.ctp:11 -msgid "Delete Elopage Buy" -msgstr "" - -#: Template/ElopageBuys/view.ctp:20 -msgid "Payer Email" -msgstr "" - -#: Template/ElopageBuys/view.ctp:24 -msgid "Publisher Email" -msgstr "" - -#: Template/ElopageBuys/view.ctp:28 -msgid "Event" -msgstr "" - -#: Template/ElopageBuys/view.ctp:36 -msgid "Elopage User Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:40 -msgid "Affiliate Program Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:44 -msgid "Publisher Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:48 -msgid "Order Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:52 -msgid "Product Id" -msgstr "" - -#: Template/ElopageBuys/view.ctp:56 -msgid "Product Price" -msgstr "" - -#: Template/ElopageBuys/view.ctp:60 -msgid "Success Date" -msgstr "" - -#: Template/ElopageBuys/view.ctp:64 -msgid "Payed" -msgstr "" - -#: Template/ElopageBuys/view.ctp:65 -#: Template/ServerUsers/view.ctp:53 -#: Template/TransactionGroupAllowtrades/view.ctp:35 -#: Template/Users/view.ctp:49 -msgid "Yes" -msgstr "" - -#: Template/ElopageBuys/view.ctp:65 -#: Template/ServerUsers/view.ctp:53 -#: Template/TransactionGroupAllowtrades/view.ctp:35 -#: Template/Users/view.ctp:49 -msgid "No" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:8 -msgid "Gradido Schöpfung" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:9 -#: Template/Email/text/notification_transaction_failed.ctp:14 -#: Template/Email/text/notification_transfer.ctp:12 -msgid "Hallo" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:11 -msgid "für dich wurden soeben {0} geschöpft." -msgstr "" - -#: Template/Email/text/notification_creation.ctp:16 -#: Template/Email/text/notification_transaction_failed.ctp:46 -#: Template/Email/text/notification_transfer.ctp:19 -msgid "Bitte antworte nicht auf diese E-Mail!" -msgstr "" - -#: Template/Email/text/notification_creation.ctp:18 -#: Template/Email/text/notification_transaction_failed.ctp:49 -#: Template/Email/text/notification_transfer.ctp:25 -msgid "Mit freundlichen Grüßen" -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:8 -msgid "Gradido Transaktion fehlgeschlagen" -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:16 -msgid "Deine letzte Transaktion ist leider fehlgeschlagen." -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:20 -msgid "Du wolltest {0} für {1} schöpfen." -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:24 -msgid "Das Zieldatum war: " -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:26 -msgid "Du wolltest {0} an {1} senden." -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:32 -msgid "Das ist schief gelaufen: " -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:35 -msgid "Fehler beim speichern in der Datenbank. Bitte versuche es später erneut" -msgstr "" - -#: Template/Email/text/notification_transaction_failed.ctp:36 -msgid "Fehler beim parsen der Transaktion. Bitte versuche es später erneut" -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:8 -msgid "Gradido Überweisung" -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:14 -msgid "Du hast soeben {0} von {1} erhalten." -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:15 -msgid "{0} schreibt:" -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:20 -msgid "Wenn Du " -msgstr "" - -#: Template/Email/text/notification_transfer.ctp:20 -msgid " per E-Mail antworten willst, schreibe stattdessen an die Adresse: " -msgstr "" - -#: Template/Layout/default.ctp:38 -msgid "Logout" -msgstr "" - -#: Template/Layout/error.ctp:35 -msgid "Error" -msgstr "" - -#: Template/Layout/frontend.ctp:95 -msgid "Datenschutzerklärung" -msgstr "" - -#: Template/Layout/frontend.ctp:96 -msgid "Impressum" -msgstr "" - -#: Template/Layout/frontend.ctp:108 -msgid "Community Server in Entwicklung" -msgstr "" - -#: Template/OperatorTypes/add.ctp:10 -#: Template/OperatorTypes/edit.ctp:16 -#: Template/OperatorTypes/view.ctp:12 -msgid "List Operator Types" -msgstr "" - -#: Template/OperatorTypes/add.ctp:11 -#: Template/OperatorTypes/edit.ctp:17 -#: Template/OperatorTypes/index.ctp:11 -#: Template/OperatorTypes/view.ctp:14 -#: Template/Operators/add.ctp:10 -#: Template/Operators/edit.ctp:16 -#: Template/Operators/view.ctp:12 -msgid "List Operators" -msgstr "" - -#: Template/OperatorTypes/add.ctp:12 -#: Template/OperatorTypes/edit.ctp:18 -#: Template/OperatorTypes/index.ctp:12 -#: Template/OperatorTypes/view.ctp:15 -#: Template/Operators/index.ctp:10 -#: Template/Operators/view.ctp:13 -msgid "New Operator" -msgstr "" - -#: Template/OperatorTypes/add.ctp:18 -msgid "Add Operator Type" -msgstr "" - -#: Template/OperatorTypes/edit.ctp:24 -#: Template/OperatorTypes/view.ctp:10 -msgid "Edit Operator Type" -msgstr "" - -#: Template/OperatorTypes/index.ctp:10 -#: Template/OperatorTypes/view.ctp:13 -msgid "New Operator Type" -msgstr "" - -#: Template/OperatorTypes/index.ctp:16 -msgid "Operator Types" -msgstr "" - -#: Template/OperatorTypes/view.ctp:11 -msgid "Delete Operator Type" -msgstr "" - -#: Template/OperatorTypes/view.ctp:35 -msgid "Related Operators" -msgstr "" - -#: Template/OperatorTypes/view.ctp:40 -#: Template/Operators/view.ctp:20 -#: Template/ServerUsers/view.ctp:20 -msgid "Username" -msgstr "" - -#: Template/OperatorTypes/view.ctp:41 -#: Template/Operators/view.ctp:36 -msgid "Operator Type Id" -msgstr "" - -#: Template/OperatorTypes/view.ctp:42 -#: Template/Operators/view.ctp:28 -msgid "Data Base64" -msgstr "" - -#: Template/Operators/add.ctp:16 -msgid "Add Operator" -msgstr "" - -#: Template/Operators/edit.ctp:22 -#: Template/Operators/view.ctp:10 -msgid "Edit Operator" -msgstr "" - -#: Template/Operators/index.ctp:14 -msgid "Operators" -msgstr "" - -#: Template/Operators/view.ctp:11 -msgid "Delete Operator" -msgstr "" - -#: Template/Operators/view.ctp:24 -msgid "User Pubkey" -msgstr "" - -#: Template/Profile/edit.ctp:9 -msgid "Profil ändern" -msgstr "" - -#: Template/Profile/edit.ctp:18 -msgid "Vorname" -msgstr "" - -#: Template/Profile/edit.ctp:19 -msgid "Nachname" -msgstr "" - -#: Template/Profile/edit.ctp:20 -msgid "Profilbild" -msgstr "" - -#: Template/Profile/edit.ctp:25 -msgid "Beschreibung" -msgstr "" - -#: Template/Profile/edit.ctp:26 -msgid "Daten speichern" -msgstr "" - -#: Template/Roles/add.ctp:10 -#: Template/Roles/edit.ctp:16 -#: Template/Roles/view.ctp:12 -msgid "List Roles" -msgstr "" - -#: Template/Roles/add.ctp:16 -msgid "Add Role" -msgstr "" - -#: Template/Roles/edit.ctp:22 -#: Template/Roles/view.ctp:10 -msgid "Edit Role" -msgstr "" - -#: Template/Roles/index.ctp:10 -#: Template/Roles/view.ctp:13 -msgid "New Role" -msgstr "" - -#: Template/Roles/index.ctp:14 -msgid "Roles" -msgstr "" - -#: Template/Roles/view.ctp:11 -msgid "Delete Role" -msgstr "" - -#: Template/Roles/view.ctp:20 -msgid "Title" -msgstr "" - -#: Template/ServerUsers/add.ctp:10 -#: Template/ServerUsers/edit.ctp:16 -#: Template/ServerUsers/view.ctp:12 -msgid "List Server Users" -msgstr "" - -#: Template/ServerUsers/add.ctp:16 -msgid "Add Server User" -msgstr "" - -#: Template/ServerUsers/edit.ctp:22 -#: Template/ServerUsers/view.ctp:10 -msgid "Edit Server User" -msgstr "" - -#: Template/ServerUsers/index.ctp:10 -#: Template/ServerUsers/view.ctp:13 -msgid "New Server User" -msgstr "" - -#: Template/ServerUsers/index.ctp:14 -msgid "Server Users" -msgstr "" - -#: Template/ServerUsers/login.ctp:16 -msgid "Please enter your username and password" -msgstr "" - -#: Template/ServerUsers/login.ctp:20 -msgid "Login" -msgstr "" - -#: Template/ServerUsers/view.ctp:11 -msgid "Delete Server User" -msgstr "" - -#: Template/ServerUsers/view.ctp:24 -#: Template/Users/view.ctp:40 -msgid "Password" -msgstr "" - -#: Template/ServerUsers/view.ctp:28 -#: Template/Users/view.ctp:20 -msgid "Email" -msgstr "" - -#: Template/ServerUsers/view.ctp:32 -#: Template/StateUserRoles/assign_role.ctp:45 -#: Template/StateUserRoles/search.ctp:32 -msgid "Role" -msgstr "" - -#: Template/ServerUsers/view.ctp:40 -msgid "Last Login" -msgstr "" - -#: Template/ServerUsers/view.ctp:48 -#: Template/StateBalances/view.ctp:35 -msgid "Modified" -msgstr "" - -#: Template/ServerUsers/view.ctp:52 -msgid "Activated" -msgstr "" - -#: Template/StateBalances/add.ctp:10 -#: Template/StateBalances/edit.ctp:16 -#: Template/StateBalances/view.ctp:12 -#: Template/StateUserRoles/index.ctp:13 -#: Template/StateUsers/add.ctp:13 -#: Template/StateUsers/edit.ctp:19 -#: Template/StateUsers/index.ctp:13 -#: Template/StateUsers/view.ctp:16 -msgid "List State Balances" -msgstr "" - -#: Template/StateBalances/add.ctp:19 -msgid "Add State Balance" -msgstr "" - -#: Template/StateBalances/edit.ctp:25 -#: Template/StateBalances/view.ctp:10 -msgid "Edit State Balance" -msgstr "" - -#: Template/StateBalances/index.ctp:10 -#: Template/StateBalances/view.ctp:13 -#: Template/StateUserRoles/index.ctp:14 -#: Template/StateUsers/add.ctp:14 -#: Template/StateUsers/edit.ctp:20 -#: Template/StateUsers/index.ctp:14 -#: Template/StateUsers/view.ctp:17 -msgid "New State Balance" -msgstr "" - -#: Template/StateBalances/index.ctp:16 -msgid "State Balances" -msgstr "" - -#: Template/StateBalances/overview.ctp:10 -msgid "Aktueller Kontostand: " -msgstr "" - -#: Template/StateBalances/overview.ctp:34 -msgid "Absender" -msgstr "" - -#: Template/StateBalances/overview.ctp:35 -#: Template/StateUsers/view.ctp:57 -#: Template/StateUsers/view.ctp:87 -#: Template/StateUsers/view.ctp:121 -#: Template/TransactionSendCoins/create.ctp:21 -#: Template/TransactionSendCoins/create_raw.ctp:32 -msgid "Verwendungszweck" -msgstr "" - -#: Template/StateBalances/overview.ctp:36 -#: Template/StateBalances/overview_gdt.ctp:42 -#: Template/StateBalances/overview_gdt.ctp:75 -msgid "Datum" -msgstr "" - -#: Template/StateBalances/overview.ctp:37 -#: Template/StateUsers/view.ctp:56 -#: Template/StateUsers/view.ctp:86 -#: Template/StateUsers/view.ctp:120 -msgid "Betrag" -msgstr "" - -#: Template/StateBalances/overview.ctp:38 -msgid "Transaktions Nr." -msgstr "" - -#: Template/StateBalances/overview.ctp:38 -msgid "Nr" -msgstr "" - -#: Template/StateBalances/overview.ctp:75 -msgid "Geschöpft" -msgstr "" - -#: Template/StateBalances/overview.ctp:78 -msgid "Gesendet" -msgstr "" - -#: Template/StateBalances/overview.ctp:81 -msgid "Empfangen" -msgstr "" - -#: Template/StateBalances/overview.ctp:84 -msgid "Vergänglichkeit" -msgstr "" - -#: Template/StateBalances/overview.ctp:124 -#: Template/TransactionCreations/create_multi.ctp:184 -msgid "Laufende Transaktion" -msgstr "" - -#: Template/StateBalances/overview.ctp:126 -#: Template/TransactionCreations/create_multi.ctp:186 -msgid "Laufende Transaktionen" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:21 -msgid "Zur Verfügung: " -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:31 -msgid "Nur die letzten 100 Einträge werden angezeigt!" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:38 -msgid "Eigene Einzahlungen" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:41 -#: Template/Users/statistics.ctp:65 -msgid "E-Mail" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:43 -msgid "Kommentar" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:44 -#: Template/StateBalances/overview_gdt.ctp:76 -msgid "Euro" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:45 -#: Template/StateBalances/overview_gdt.ctp:77 -msgid "Factor" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:46 -#: Template/StateBalances/overview_gdt.ctp:78 -msgid "GDT" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:71 -msgid "Einzahlungen anderer (Publisherprogramm)" -msgstr "" - -#: Template/StateBalances/overview_gdt.ctp:74 -msgid "Einzahlender" -msgstr "" - -#: Template/StateBalances/view.ctp:11 -msgid "Delete State Balance" -msgstr "" - -#: Template/StateBalances/view.ctp:31 -#: Template/StateUsers/view.ctp:33 -#: Template/TransactionCreations/view.ctp:36 -#: Template/TransactionSendCoins/view.ctp:36 -#: Template/Transactions/view.ctp:95 -#: Template/Transactions/view.ctp:209 -msgid "Amount" -msgstr "" - -#: Template/StateCreated/add.ctp:10 -#: Template/StateCreated/edit.ctp:16 -#: Template/StateCreated/view.ctp:12 -#: Template/StateUserRoles/index.ctp:15 -#: Template/StateUsers/add.ctp:15 -#: Template/StateUsers/edit.ctp:21 -#: Template/StateUsers/index.ctp:15 -#: Template/Transactions/add.ctp:15 -#: Template/Transactions/edit.ctp:21 -#: Template/Transactions/index.ctp:15 -#: Template/Transactions/view.ctp:18 -msgid "List State Created" -msgstr "" - -#: Template/StateCreated/add.ctp:11 -#: Template/StateCreated/edit.ctp:17 -#: Template/StateCreated/index.ctp:11 -#: Template/StateCreated/view.ctp:14 -#: Template/StateGroups/add.ctp:17 -#: Template/StateGroups/edit.ctp:23 -#: Template/StateGroups/index.ctp:17 -#: Template/StateGroups/view.ctp:20 -#: Template/StateUserTransactions/add.ctp:13 -#: Template/StateUserTransactions/edit.ctp:19 -#: Template/StateUserTransactions/index.ctp:13 -#: Template/StateUserTransactions/view.ctp:16 -#: Template/TransactionCreations/add.ctp:11 -#: Template/TransactionCreations/edit.ctp:17 -#: Template/TransactionCreations/index.ctp:11 -#: Template/TransactionCreations/view.ctp:14 -#: Template/TransactionGroupAddaddress/add.ctp:11 -#: Template/TransactionGroupAddaddress/edit.ctp:17 -#: Template/TransactionGroupAddaddress/index.ctp:11 -#: Template/TransactionGroupAddaddress/view.ctp:14 -#: Template/TransactionGroupAllowtrades/add.ctp:11 -#: Template/TransactionGroupAllowtrades/edit.ctp:17 -#: Template/TransactionGroupAllowtrades/index.ctp:11 -#: Template/TransactionGroupAllowtrades/view.ctp:14 -#: Template/TransactionGroupCreates/add.ctp:11 -#: Template/TransactionGroupCreates/edit.ctp:17 -#: Template/TransactionGroupCreates/index.ctp:11 -#: Template/TransactionGroupCreates/view.ctp:14 -#: Template/TransactionSendCoins/add.ctp:11 -#: Template/TransactionSendCoins/edit.ctp:17 -#: Template/TransactionSendCoins/index.ctp:11 -#: Template/TransactionSendCoins/view.ctp:14 -#: Template/TransactionSignatures/add.ctp:11 -#: Template/TransactionSignatures/edit.ctp:17 -#: Template/TransactionSignatures/index.ctp:11 -#: Template/TransactionSignatures/view.ctp:14 -#: Template/TransactionTypes/add.ctp:11 -#: Template/TransactionTypes/edit.ctp:17 -#: Template/TransactionTypes/index.ctp:11 -#: Template/TransactionTypes/view.ctp:14 -#: Template/Transactions/add.ctp:10 -#: Template/Transactions/edit.ctp:16 -#: Template/Transactions/view.ctp:12 -msgid "List Transactions" -msgstr "" - -#: Template/StateCreated/add.ctp:12 -#: Template/StateCreated/edit.ctp:18 -#: Template/StateCreated/index.ctp:12 -#: Template/StateCreated/view.ctp:15 -#: Template/StateGroups/add.ctp:18 -#: Template/StateGroups/edit.ctp:24 -#: Template/StateGroups/index.ctp:18 -#: Template/StateGroups/view.ctp:21 -#: Template/StateUserTransactions/add.ctp:14 -#: Template/StateUserTransactions/edit.ctp:20 -#: Template/StateUserTransactions/index.ctp:14 -#: Template/StateUserTransactions/view.ctp:17 -#: Template/TransactionCreations/add.ctp:12 -#: Template/TransactionCreations/edit.ctp:18 -#: Template/TransactionCreations/index.ctp:12 -#: Template/TransactionCreations/view.ctp:15 -#: Template/TransactionGroupAddaddress/add.ctp:12 -#: Template/TransactionGroupAddaddress/edit.ctp:18 -#: Template/TransactionGroupAddaddress/index.ctp:12 -#: Template/TransactionGroupAddaddress/view.ctp:15 -#: Template/TransactionGroupAllowtrades/add.ctp:12 -#: Template/TransactionGroupAllowtrades/edit.ctp:18 -#: Template/TransactionGroupAllowtrades/index.ctp:12 -#: Template/TransactionGroupAllowtrades/view.ctp:15 -#: Template/TransactionGroupCreates/add.ctp:12 -#: Template/TransactionGroupCreates/edit.ctp:18 -#: Template/TransactionGroupCreates/index.ctp:12 -#: Template/TransactionGroupCreates/view.ctp:15 -#: Template/TransactionSendCoins/add.ctp:12 -#: Template/TransactionSendCoins/edit.ctp:18 -#: Template/TransactionSendCoins/index.ctp:12 -#: Template/TransactionSendCoins/view.ctp:15 -#: Template/TransactionSignatures/add.ctp:12 -#: Template/TransactionSignatures/edit.ctp:18 -#: Template/TransactionSignatures/index.ctp:12 -#: Template/TransactionSignatures/view.ctp:15 -#: Template/TransactionTypes/add.ctp:12 -#: Template/TransactionTypes/edit.ctp:18 -#: Template/TransactionTypes/index.ctp:12 -#: Template/TransactionTypes/view.ctp:15 -#: Template/Transactions/index.ctp:10 -#: Template/Transactions/view.ctp:13 -msgid "New Transaction" -msgstr "" - -#: Template/StateCreated/add.ctp:20 -msgid "Add State Created" -msgstr "" - -#: Template/StateCreated/edit.ctp:26 -#: Template/StateCreated/view.ctp:10 -msgid "Edit State Created" -msgstr "" - -#: Template/StateCreated/index.ctp:10 -#: Template/StateCreated/view.ctp:13 -#: Template/StateUserRoles/index.ctp:16 -#: Template/StateUsers/add.ctp:16 -#: Template/StateUsers/edit.ctp:22 -#: Template/StateUsers/index.ctp:16 -#: Template/Transactions/add.ctp:16 -#: Template/Transactions/edit.ctp:22 -#: Template/Transactions/index.ctp:16 -#: Template/Transactions/view.ctp:19 -msgid "New State Created" -msgstr "" - -#: Template/StateCreated/index.ctp:18 -msgid "State Created" -msgstr "" - -#: Template/StateCreated/view.ctp:11 -msgid "Delete State Created" -msgstr "" - -#: Template/StateCreated/view.ctp:24 -#: Template/StateUserTransactions/view.ctp:30 -#: Template/StateUsers/view.ctp:53 -#: Template/TransactionCreations/view.ctp:24 -#: Template/TransactionGroupAddaddress/view.ctp:24 -#: Template/TransactionGroupAllowtrades/view.ctp:22 -#: Template/TransactionGroupCreates/view.ctp:24 -#: Template/TransactionSendCoins/view.ctp:24 -#: Template/TransactionSignatures/view.ctp:22 -msgid "Transaction" -msgstr "" - -#: Template/StateCreated/view.ctp:36 -#: Template/Transactions/view.ctp:61 -msgid "Month" -msgstr "" - -#: Template/StateCreated/view.ctp:40 -#: Template/Transactions/view.ctp:62 -msgid "Year" -msgstr "" - -#: Template/StateCreated/view.ctp:44 -#: Template/Transactions/view.ctp:65 -msgid "Short Ident Hash" -msgstr "" - -#: Template/StateErrors/add.ctp:10 -#: Template/StateErrors/edit.ctp:16 -#: Template/StateErrors/view.ctp:12 -msgid "List State Errors" -msgstr "" - -#: Template/StateErrors/add.ctp:13 -#: Template/StateErrors/edit.ctp:19 -#: Template/StateErrors/index.ctp:13 -#: Template/StateErrors/view.ctp:16 -#: Template/StateUserTransactions/add.ctp:15 -#: Template/StateUserTransactions/edit.ctp:21 -#: Template/StateUserTransactions/index.ctp:15 -#: Template/StateUserTransactions/view.ctp:18 -#: Template/TransactionTypes/add.ctp:10 -#: Template/TransactionTypes/edit.ctp:16 -#: Template/TransactionTypes/view.ctp:12 -#: Template/Transactions/add.ctp:13 -#: Template/Transactions/edit.ctp:19 -#: Template/Transactions/index.ctp:13 -#: Template/Transactions/view.ctp:16 -msgid "List Transaction Types" -msgstr "" - -#: Template/StateErrors/add.ctp:14 -#: Template/StateErrors/edit.ctp:20 -#: Template/StateErrors/index.ctp:14 -#: Template/StateErrors/view.ctp:17 -#: Template/StateUserTransactions/add.ctp:16 -#: Template/StateUserTransactions/edit.ctp:22 -#: Template/StateUserTransactions/index.ctp:16 -#: Template/StateUserTransactions/view.ctp:19 -#: Template/TransactionTypes/index.ctp:10 -#: Template/TransactionTypes/view.ctp:13 -#: Template/Transactions/add.ctp:14 -#: Template/Transactions/edit.ctp:20 -#: Template/Transactions/index.ctp:14 -#: Template/Transactions/view.ctp:17 -msgid "New Transaction Type" -msgstr "" - -#: Template/StateErrors/add.ctp:20 -msgid "Add State Error" -msgstr "" - -#: Template/StateErrors/edit.ctp:26 -#: Template/StateErrors/view.ctp:10 -msgid "Edit State Error" -msgstr "" - -#: Template/StateErrors/index.ctp:10 -#: Template/StateErrors/view.ctp:13 -msgid "New State Error" -msgstr "" - -#: Template/StateErrors/index.ctp:18 -msgid "State Errors" -msgstr "" - -#: Template/StateErrors/show_for_user.ctp:9 -msgid "Fehlermeldungen" -msgstr "" - -#: Template/StateErrors/view.ctp:11 -msgid "Delete State Error" -msgstr "" - -#: Template/StateErrors/view.ctp:28 -#: Template/StateUserTransactions/view.ctp:34 -#: Template/Transactions/view.ctp:42 -msgid "Transaction Type" -msgstr "" - -#: Template/StateErrors/view.ctp:41 -msgid "Message Json" -msgstr "" - -#: Template/StateGroupAddresses/add.ctp:11 -#: Template/StateGroupAddresses/edit.ctp:17 -#: Template/StateGroupAddresses/index.ctp:11 -#: Template/StateGroupAddresses/view.ctp:14 -#: Template/StateGroups/add.ctp:10 -#: Template/StateGroups/edit.ctp:16 -#: Template/StateGroups/view.ctp:12 -#: Template/StateUserRoles/index.ctp:11 -#: Template/StateUsers/add.ctp:11 -#: Template/StateUsers/edit.ctp:17 -#: Template/StateUsers/index.ctp:11 -#: Template/StateUsers/view.ctp:14 -#: Template/TransactionGroupCreates/add.ctp:13 -#: Template/TransactionGroupCreates/edit.ctp:19 -#: Template/TransactionGroupCreates/index.ctp:13 -#: Template/TransactionGroupCreates/view.ctp:16 -#: Template/Transactions/add.ctp:11 -#: Template/Transactions/edit.ctp:17 -#: Template/Transactions/index.ctp:11 -#: Template/Transactions/view.ctp:14 -msgid "List State Groups" -msgstr "" - -#: Template/StateGroupAddresses/add.ctp:12 -#: Template/StateGroupAddresses/edit.ctp:18 -#: Template/StateGroupAddresses/index.ctp:12 -#: Template/StateGroupAddresses/view.ctp:15 -#: Template/StateGroups/index.ctp:10 -#: Template/StateGroups/view.ctp:13 -#: Template/StateUserRoles/index.ctp:12 -#: Template/StateUsers/add.ctp:12 -#: Template/StateUsers/edit.ctp:18 -#: Template/StateUsers/index.ctp:12 -#: Template/StateUsers/view.ctp:15 -#: Template/TransactionGroupCreates/add.ctp:14 -#: Template/TransactionGroupCreates/edit.ctp:20 -#: Template/TransactionGroupCreates/index.ctp:14 -#: Template/TransactionGroupCreates/view.ctp:17 -#: Template/Transactions/add.ctp:12 -#: Template/Transactions/edit.ctp:18 -#: Template/Transactions/index.ctp:12 -#: Template/Transactions/view.ctp:15 -msgid "New State Group" -msgstr "" - -#: Template/StateGroupAddresses/add.ctp:20 -msgid "Add State Group Address" -msgstr "" - -#: Template/StateGroupAddresses/edit.ctp:26 -#: Template/StateGroupAddresses/view.ctp:10 -msgid "Edit State Group Address" -msgstr "" - -#: Template/StateGroupAddresses/index.ctp:18 -msgid "State Group Addresses" -msgstr "" - -#: Template/StateGroupAddresses/index.ctp:25 -#: Template/TransactionGroupAddaddress/index.ctp:25 -msgid "user public key" -msgstr "" - -#: Template/StateGroupAddresses/view.ctp:11 -msgid "Delete State Group Address" -msgstr "" - -#: Template/StateGroupAddresses/view.ctp:24 -#: Template/TransactionGroupAddaddress/view.ctp:28 -msgid "Address Type" -msgstr "" - -#: Template/StateGroupRelationships/add.ctp:10 -#: Template/StateGroupRelationships/edit.ctp:16 -#: Template/StateGroupRelationships/view.ctp:12 -msgid "List State Group Relationships" -msgstr "" - -#: Template/StateGroupRelationships/add.ctp:16 -msgid "Add State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/edit.ctp:22 -#: Template/StateGroupRelationships/view.ctp:10 -msgid "Edit State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/index.ctp:10 -#: Template/StateGroupRelationships/view.ctp:13 -msgid "New State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/index.ctp:14 -msgid "State Group Relationships" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:11 -msgid "Delete State Group Relationship" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:24 -msgid "State Group1 Id" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:28 -msgid "State Group2 Id" -msgstr "" - -#: Template/StateGroupRelationships/view.ctp:32 -msgid "State Relationship Id" -msgstr "" - -#: Template/StateGroups/add.ctp:15 -#: Template/StateGroups/edit.ctp:21 -#: Template/StateGroups/index.ctp:15 -#: Template/StateGroups/view.ctp:18 -#: Template/TransactionGroupCreates/add.ctp:10 -#: Template/TransactionGroupCreates/edit.ctp:16 -#: Template/TransactionGroupCreates/view.ctp:12 -#: Template/Transactions/add.ctp:23 -#: Template/Transactions/edit.ctp:29 -#: Template/Transactions/index.ctp:23 -#: Template/Transactions/view.ctp:26 -msgid "List Transaction Group Creates" -msgstr "" - -#: Template/StateGroups/add.ctp:16 -#: Template/StateGroups/edit.ctp:22 -#: Template/StateGroups/index.ctp:16 -#: Template/StateGroups/view.ctp:19 -#: Template/TransactionGroupCreates/index.ctp:10 -#: Template/TransactionGroupCreates/view.ctp:13 -#: Template/Transactions/add.ctp:24 -#: Template/Transactions/edit.ctp:30 -#: Template/Transactions/index.ctp:24 -#: Template/Transactions/view.ctp:27 -msgid "New Transaction Group Create" -msgstr "" - -#: Template/StateGroups/add.ctp:24 -msgid "Add State Group" -msgstr "" - -#: Template/StateGroups/edit.ctp:30 -#: Template/StateGroups/view.ctp:10 -msgid "Edit State Group" -msgstr "" - -#: Template/StateGroups/index.ctp:22 -msgid "State Groups" -msgstr "" - -#: Template/StateGroups/view.ctp:11 -msgid "Delete State Group" -msgstr "" - -#: Template/StateGroups/view.ctp:36 -msgid "User Count" -msgstr "" - -#: Template/StateGroups/view.ctp:46 -#: Template/StateGroups/view.ctp:74 -#: Template/StateGroups/view.ctp:102 -#: Template/StateGroups/view.ctp:129 -#: Template/TransactionTypes/view.ctp:40 -#: Template/Transactions/view.ctp:178 -msgid "State Group Id" -msgstr "" - -#: Template/StateGroups/view.ctp:68 -msgid "Related State Users" -msgstr "" - -#: Template/StateGroups/view.ctp:73 -msgid "Index Id" -msgstr "" - -#: Template/StateGroups/view.ctp:95 -#: Template/Transactions/view.ctp:171 -msgid "Related Transaction Group Creates" -msgstr "" - -#: Template/StateGroups/view.ctp:101 -#: Template/Transactions/view.ctp:177 -msgid "Group Public Key" -msgstr "" - -#: Template/StateGroups/view.ctp:124 -#: Template/TransactionTypes/view.ctp:35 -msgid "Related Transactions" -msgstr "" - -#: Template/StateGroups/view.ctp:130 -#: Template/TransactionTypes/view.ctp:41 -msgid "Transaction Type Id" -msgstr "" - -#: Template/StateGroups/view.ctp:131 -#: Template/TransactionTypes/view.ctp:42 -msgid "Tx Hash" -msgstr "" - -#: Template/StateGroups/view.ctp:132 -#: Template/TransactionTypes/view.ctp:43 -#: Template/Transactions/view.ctp:50 -msgid "Received" -msgstr "" - -#: Template/StateRelationshipTypes/add.ctp:10 -#: Template/StateRelationshipTypes/edit.ctp:16 -#: Template/StateRelationshipTypes/view.ctp:12 -msgid "List State Relationship Types" -msgstr "" - -#: Template/StateRelationshipTypes/add.ctp:16 -msgid "Add State Relationship Type" -msgstr "" - -#: Template/StateRelationshipTypes/edit.ctp:22 -#: Template/StateRelationshipTypes/view.ctp:10 -msgid "Edit State Relationship Type" -msgstr "" - -#: Template/StateRelationshipTypes/index.ctp:10 -#: Template/StateRelationshipTypes/view.ctp:13 -msgid "New State Relationship Type" -msgstr "" - -#: Template/StateRelationshipTypes/index.ctp:14 -msgid "State Relationship Types" -msgstr "" - -#: Template/StateRelationshipTypes/view.ctp:11 -msgid "Delete State Relationship Type" -msgstr "" - -#: Template/StateUserRoles/assign_role.ctp:9 -#: Template/StateUserRoles/assign_role.ctp:46 -#: Template/StateUserRoles/search.ctp:47 -msgid "Assign Role" -msgstr "" - -#: Template/StateUserRoles/index.ctp:17 -#: Template/StateUsers/add.ctp:17 -#: Template/StateUsers/edit.ctp:23 -#: Template/StateUsers/index.ctp:17 -#: Template/StateUsers/view.ctp:18 -#: Template/TransactionCreations/add.ctp:10 -#: Template/TransactionCreations/edit.ctp:16 -#: Template/TransactionCreations/view.ctp:12 -#: Template/Transactions/add.ctp:17 -#: Template/Transactions/edit.ctp:23 -#: Template/Transactions/index.ctp:17 -#: Template/Transactions/view.ctp:20 -msgid "List Transaction Creations" -msgstr "" - -#: Template/StateUserRoles/index.ctp:18 -#: Template/StateUsers/add.ctp:18 -#: Template/StateUsers/edit.ctp:24 -#: Template/StateUsers/index.ctp:18 -#: Template/StateUsers/view.ctp:19 -#: Template/TransactionCreations/index.ctp:10 -#: Template/TransactionCreations/view.ctp:13 -#: Template/Transactions/add.ctp:18 -#: Template/Transactions/edit.ctp:24 -#: Template/Transactions/index.ctp:18 -#: Template/Transactions/view.ctp:21 -msgid "New Transaction Creation" -msgstr "" - -#: Template/StateUserRoles/index.ctp:19 -#: Template/StateUsers/add.ctp:19 -#: Template/StateUsers/edit.ctp:25 -#: Template/StateUsers/index.ctp:19 -#: Template/StateUsers/view.ctp:20 -#: Template/TransactionSendCoins/add.ctp:10 -#: Template/TransactionSendCoins/edit.ctp:16 -#: Template/TransactionSendCoins/view.ctp:12 -#: Template/Transactions/add.ctp:25 -#: Template/Transactions/edit.ctp:31 -#: Template/Transactions/index.ctp:25 -#: Template/Transactions/view.ctp:28 -msgid "List Transaction Send Coins" -msgstr "" - -#: Template/StateUserRoles/index.ctp:20 -#: Template/StateUsers/add.ctp:20 -#: Template/StateUsers/edit.ctp:26 -#: Template/StateUsers/index.ctp:20 -#: Template/StateUsers/view.ctp:21 -#: Template/TransactionSendCoins/index.ctp:10 -#: Template/TransactionSendCoins/view.ctp:13 -#: Template/Transactions/add.ctp:26 -#: Template/Transactions/edit.ctp:32 -#: Template/Transactions/index.ctp:26 -#: Template/Transactions/view.ctp:29 -msgid "New Transaction Send Coin" -msgstr "" - -#: Template/StateUserRoles/index.ctp:24 -#: Template/StateUserRoles/search.ctp:25 -#: Template/StateUsers/index.ctp:24 -msgid "State Users" -msgstr "" - -#: Template/StateUserRoles/search.ctp:19 -#: Template/StateUsers/search.ctp:57 -msgid "Suchbegriff" -msgstr "" - -#: Template/StateUserRoles/search.ctp:19 -#: Template/StateUsers/search.ctp:57 -msgid "Vorname/Nachname/E-Mail" -msgstr "" - -#: Template/StateUserRoles/search.ctp:20 -#: Template/StateUsers/search.ctp:59 -#: Template/TransactionCreations/create_multi.ctp:35 -msgid "Suchen" -msgstr "" - -#: Template/StateUserTransactions/add.ctp:10 -#: Template/StateUserTransactions/edit.ctp:16 -#: Template/StateUserTransactions/view.ctp:12 -msgid "List State User Transactions" -msgstr "" - -#: Template/StateUserTransactions/add.ctp:22 -msgid "Add State User Transaction" -msgstr "" - -#: Template/StateUserTransactions/edit.ctp:28 -#: Template/StateUserTransactions/view.ctp:10 -msgid "Edit State User Transaction" -msgstr "" - -#: Template/StateUserTransactions/index.ctp:10 -#: Template/StateUserTransactions/view.ctp:13 -msgid "New State User Transaction" -msgstr "" - -#: Template/StateUserTransactions/index.ctp:20 -msgid "State User Transactions" -msgstr "" - -#: Template/StateUserTransactions/view.ctp:11 -msgid "Delete State User Transaction" -msgstr "" - -#: Template/StateUsers/add.ctp:26 -msgid "Add State User" -msgstr "" - -#: Template/StateUsers/edit.ctp:32 -#: Template/StateUsers/view.ctp:10 -msgid "Edit State User" -msgstr "" - -#: Template/StateUsers/search.ctp:16 -msgid "Alle" -msgstr "" - -#: Template/StateUsers/search.ctp:21 -msgid "Konto nicht aktiviert" -msgstr "" - -#: Template/StateUsers/search.ctp:58 -msgid "Konto Status" -msgstr "" - -#: Template/StateUsers/view.ctp:11 -msgid "Delete State User" -msgstr "" - -#: Template/StateUsers/view.ctp:28 -msgid "State Balance" -msgstr "" - -#: Template/StateUsers/view.ctp:32 -msgid "Letztes Update" -msgstr "" - -#: Template/StateUsers/view.ctp:49 -msgid "Schöpfungen" -msgstr "" - -#: Template/StateUsers/view.ctp:54 -#: Template/StateUsers/view.ctp:84 -#: Template/StateUsers/view.ctp:118 -msgid "Erhalten" -msgstr "" - -#: Template/StateUsers/view.ctp:55 -msgid "Verrechnungs-Datum" -msgstr "" - -#: Template/StateUsers/view.ctp:79 -msgid "Versendete Überweisungen" -msgstr "" - -#: Template/StateUsers/view.ctp:85 -msgid "Empfänger " -msgstr "" - -#: Template/StateUsers/view.ctp:88 -msgid "Betrag nach Senden" -msgstr "" - -#: Template/StateUsers/view.ctp:113 -msgid "Empfangende Überweisungen" -msgstr "" - -#: Template/StateUsers/view.ctp:119 -msgid "Sender" -msgstr "" - -#: Template/TransactionCreations/add.ctp:20 -msgid "Add Transaction Creation" -msgstr "" - -#: Template/TransactionCreations/create.ctp:17 -#: Template/TransactionCreations/create_multi.ctp:17 -msgid "Schöpfungstransaktion" -msgstr "" - -#: Template/TransactionCreations/create.ctp:28 -#: Template/TransactionCreations/create_multi.ctp:125 -msgid "Transaktion(en) abschließen" -msgstr "" - -#: Template/TransactionCreations/create.ctp:29 -#: Template/TransactionCreations/create_multi.ctp:126 -#: Template/TransactionSendCoins/create.ctp:24 -msgid "Weitere Transaktion erstellen" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:34 -msgid "Suche" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:38 -msgid "Memo" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:39 -#: Template/TransactionSendCoins/create.ctp:22 -#: Template/TransactionSendCoins/create_raw.ctp:33 -msgid "Betrag in GDD" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:46 -msgid "Zieldatum" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:81 -msgid "Für benutzerdefinierten Betrag" -msgstr "" - -#: Template/TransactionCreations/create_multi.ctp:189 -msgid "Alle Transaktionen abgeschlossen!" -msgstr "" - -#: Template/TransactionCreations/edit.ctp:26 -#: Template/TransactionCreations/view.ctp:10 -msgid "Edit Transaction Creation" -msgstr "" - -#: Template/TransactionCreations/index.ctp:18 -msgid "Transaction Creations" -msgstr "" - -#: Template/TransactionCreations/view.ctp:11 -msgid "Delete Transaction Creation" -msgstr "" - -#: Template/TransactionGroupAddaddress/add.ctp:20 -msgid "Add Transaction Group Addaddres" -msgstr "" - -#: Template/TransactionGroupAddaddress/edit.ctp:26 -#: Template/TransactionGroupAddaddress/view.ctp:10 -msgid "Edit Transaction Group Addaddres" -msgstr "" - -#: Template/TransactionGroupAddaddress/index.ctp:18 -msgid "Transaction Group Addaddress" -msgstr "" - -#: Template/TransactionGroupAddaddress/view.ctp:11 -msgid "Delete Transaction Group Addaddres" -msgstr "" - -#: Template/TransactionGroupAllowtrades/add.ctp:10 -#: Template/TransactionGroupAllowtrades/edit.ctp:16 -#: Template/TransactionGroupAllowtrades/view.ctp:12 -#: Template/Transactions/add.ctp:21 -#: Template/Transactions/edit.ctp:27 -#: Template/Transactions/index.ctp:21 -#: Template/Transactions/view.ctp:24 -msgid "List Transaction Group Allowtrades" -msgstr "" - -#: Template/TransactionGroupAllowtrades/add.ctp:18 -msgid "Add Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/edit.ctp:24 -#: Template/TransactionGroupAllowtrades/view.ctp:10 -msgid "Edit Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/index.ctp:10 -#: Template/TransactionGroupAllowtrades/view.ctp:13 -#: Template/Transactions/add.ctp:22 -#: Template/Transactions/edit.ctp:28 -#: Template/Transactions/index.ctp:22 -#: Template/Transactions/view.ctp:25 -msgid "New Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/index.ctp:16 -msgid "Transaction Group Allowtrades" -msgstr "" - -#: Template/TransactionGroupAllowtrades/view.ctp:11 -msgid "Delete Transaction Group Allowtrade" -msgstr "" - -#: Template/TransactionGroupAllowtrades/view.ctp:34 -#: Template/Transactions/view.ctp:151 -msgid "Allow" -msgstr "" - -#: Template/TransactionGroupCreates/add.ctp:20 -msgid "Add Transaction Group Create" -msgstr "" - -#: Template/TransactionGroupCreates/edit.ctp:26 -#: Template/TransactionGroupCreates/view.ctp:10 -msgid "Edit Transaction Group Create" -msgstr "" - -#: Template/TransactionGroupCreates/index.ctp:18 -msgid "Transaction Group Creates" -msgstr "" - -#: Template/TransactionGroupCreates/view.ctp:11 -msgid "Delete Transaction Group Create" -msgstr "" - -#: Template/TransactionGroupCreates/view.ctp:28 -#: Template/Transactions/view.ctp:38 -msgid "State Group" -msgstr "" - -#: Template/TransactionSendCoins/add.ctp:20 -msgid "Add Transaction Send Coin" -msgstr "" - -#: Template/TransactionSendCoins/create.ctp:19 -msgid "Empfänger" -msgstr "" - -#: Template/TransactionSendCoins/create.ctp:20 -msgid "Community Alias" -msgstr "" - -#: Template/TransactionSendCoins/create.ctp:23 -#: Template/TransactionSendCoins/create_raw.ctp:34 -msgid "Transaktion abschließen" -msgstr "" - -#: Template/TransactionSendCoins/create_raw.ctp:29 -msgid "Sender Private Key" -msgstr "" - -#: Template/TransactionSendCoins/create_raw.ctp:30 -msgid "Sender Public Key" -msgstr "" - -#: Template/TransactionSendCoins/create_raw.ctp:31 -msgid "Empfänger Public Key" -msgstr "" - -#: Template/TransactionSendCoins/edit.ctp:26 -#: Template/TransactionSendCoins/view.ctp:10 -msgid "Edit Transaction Send Coin" -msgstr "" - -#: Template/TransactionSendCoins/index.ctp:18 -msgid "Transaction Send Coins" -msgstr "" - -#: Template/TransactionSendCoins/view.ctp:11 -msgid "Delete Transaction Send Coin" -msgstr "" - -#: Template/TransactionSendCoins/view.ctp:40 -#: Template/Transactions/view.ctp:210 -msgid "Sender Final Balance" -msgstr "" - -#: Template/TransactionSignatures/add.ctp:10 -#: Template/TransactionSignatures/edit.ctp:16 -#: Template/TransactionSignatures/view.ctp:12 -#: Template/Transactions/add.ctp:27 -#: Template/Transactions/edit.ctp:33 -#: Template/Transactions/index.ctp:27 -#: Template/Transactions/view.ctp:30 -msgid "List Transaction Signatures" -msgstr "" - -#: Template/TransactionSignatures/add.ctp:18 -msgid "Add Transaction Signature" -msgstr "" - -#: Template/TransactionSignatures/edit.ctp:24 -#: Template/TransactionSignatures/view.ctp:10 -msgid "Edit Transaction Signature" -msgstr "" - -#: Template/TransactionSignatures/index.ctp:10 -#: Template/TransactionSignatures/view.ctp:13 -#: Template/Transactions/add.ctp:28 -#: Template/Transactions/edit.ctp:34 -#: Template/Transactions/index.ctp:28 -#: Template/Transactions/view.ctp:31 -msgid "New Transaction Signature" -msgstr "" - -#: Template/TransactionSignatures/index.ctp:16 -msgid "Transaction Signatures" -msgstr "" - -#: Template/TransactionSignatures/view.ctp:11 -msgid "Delete Transaction Signature" -msgstr "" - -#: Template/TransactionTypes/add.ctp:18 -msgid "Add Transaction Type" -msgstr "" - -#: Template/TransactionTypes/edit.ctp:24 -#: Template/TransactionTypes/view.ctp:10 -msgid "Edit Transaction Type" -msgstr "" - -#: Template/TransactionTypes/index.ctp:16 -msgid "Transaction Types" -msgstr "" - -#: Template/TransactionTypes/view.ctp:11 -msgid "Delete Transaction Type" -msgstr "" - -#: Template/Transactions/add.ctp:34 -msgid "Add Transaction" -msgstr "" - -#: Template/Transactions/edit.ctp:40 -#: Template/Transactions/view.ctp:10 -msgid "Edit Transaction" -msgstr "" - -#: Template/Transactions/manual_transaction.ctp:26 -msgid "Creation Transaction" -msgstr "" - -#: Template/Transactions/manual_transaction.ctp:41 -msgid "Transfer Transaction" -msgstr "" - -#: Template/Transactions/send_to_node.ctp:8 -msgid "Transaktionen an Gradido-Node senden" -msgstr "" - -#: Template/Transactions/synchronize_with_state_user_transactions.ctp:44 -msgid "Synchronize" -msgstr "" - -#: Template/Transactions/view.ctp:11 -msgid "Delete Transaction" -msgstr "" - -#: Template/Transactions/view.ctp:55 -msgid "Related State Created" -msgstr "" - -#: Template/Transactions/view.ctp:88 -msgid "Related Transaction Creations" -msgstr "" - -#: Template/Transactions/view.ctp:96 -msgid "Ident Hash" -msgstr "" - -#: Template/Transactions/view.ctp:144 -msgid "Related Transaction Group Allowtrades" -msgstr "" - -#: Template/Transactions/view.ctp:200 -msgid "Related Transaction Send Coins" -msgstr "" - -#: Template/Transactions/view.ctp:207 -msgid "Receiver Public Key" -msgstr "" - -#: Template/Transactions/view.ctp:208 -msgid "Receiver User Id" -msgstr "" - -#: Template/Transactions/view.ctp:233 -msgid "Related Transaction Signatures" -msgstr "" - -#: Template/Transactions/view.ctp:239 -msgid "Signature" -msgstr "" - -#: Template/Transactions/view.ctp:240 -msgid "Pubkey" -msgstr "" - -#: Template/Users/add.ctp:10 -#: Template/Users/edit.ctp:16 -#: Template/Users/view.ctp:12 -msgid "List Users" -msgstr "" - -#: Template/Users/add.ctp:16 -msgid "Add User" -msgstr "" - -#: Template/Users/edit.ctp:22 -#: Template/Users/view.ctp:10 -msgid "Edit User" -msgstr "" - -#: Template/Users/index.ctp:10 -#: Template/Users/view.ctp:13 -msgid "New User" -msgstr "" - -#: Template/Users/index.ctp:14 -msgid "Users" -msgstr "" - -#: Template/Users/statistics.ctp:9 -msgid "Benutzer Statistiken" -msgstr "" - -#: Template/Users/statistics.ctp:39 -msgid "Alle Anmeldungen" -msgstr "" - -#: Template/Users/statistics.ctp:56 -msgid "Anmeldungen im Vergleich zum letzten Monat, 0% = gleiche Anzahl" -msgstr "" - -#: Template/Users/statistics.ctp:61 -msgid "Letzte Anmeldungen" -msgstr "" - -#: Template/Users/statistics.ctp:66 -msgid "Erstellt" -msgstr "" - -#: Template/Users/statistics.ctp:79 -msgid "Anmeldungen detailliert" -msgstr "" - -#: Template/Users/statistics.ctp:82 -msgid "Jahr" -msgstr "" - -#: Template/Users/statistics.ctp:83 -msgid "Monat" -msgstr "" - -#: Template/Users/statistics.ctp:84 -msgid "Anzahl Anmeldungen" -msgstr "" - -#: Template/Users/view.ctp:11 -msgid "Delete User" -msgstr "" - -#: Template/Users/view.ctp:24 -msgid "First Name" -msgstr "" - -#: Template/Users/view.ctp:28 -msgid "Last Name" -msgstr "" - -#: Template/Users/view.ctp:32 -msgid "Language" -msgstr "" - -#: Template/Users/view.ctp:48 -msgid "Email Checked" -msgstr "" - diff --git a/community_server/src/Model/Behavior/empty b/community_server/src/Model/Behavior/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/community_server/src/Model/Entity/AddressType.php b/community_server/src/Model/Entity/AddressType.php deleted file mode 100644 index 87d64d61a..000000000 --- a/community_server/src/Model/Entity/AddressType.php +++ /dev/null @@ -1,33 +0,0 @@ - true, - 'text' => true, - 'state_group_addresses' => true, - 'transaction_group_addaddress' => true, - ]; -} diff --git a/community_server/src/Model/Entity/AdminError.php b/community_server/src/Model/Entity/AdminError.php deleted file mode 100644 index 23c60fd4a..000000000 --- a/community_server/src/Model/Entity/AdminError.php +++ /dev/null @@ -1,41 +0,0 @@ - true, - 'controller' => true, - 'action' => true, - 'state' => true, - 'msg' => true, - 'details' => true, - 'created' => true, - 'state_user' => true - ]; -} diff --git a/community_server/src/Model/Entity/BlockchainType.php b/community_server/src/Model/Entity/BlockchainType.php deleted file mode 100644 index c2e21402c..000000000 --- a/community_server/src/Model/Entity/BlockchainType.php +++ /dev/null @@ -1,30 +0,0 @@ - true, - 'text' => true, - 'symbol' => true, - ]; -} diff --git a/community_server/src/Model/Entity/CommunityProfile.php b/community_server/src/Model/Entity/CommunityProfile.php deleted file mode 100644 index 367fe713c..000000000 --- a/community_server/src/Model/Entity/CommunityProfile.php +++ /dev/null @@ -1,30 +0,0 @@ - true, - 'profile_img' => true, - 'profile_desc' => true, - ]; -} diff --git a/community_server/src/Model/Entity/ElopageBuy.php b/community_server/src/Model/Entity/ElopageBuy.php deleted file mode 100644 index eca2f760b..000000000 --- a/community_server/src/Model/Entity/ElopageBuy.php +++ /dev/null @@ -1,57 +0,0 @@ - true, - 'affiliate_program_id' => true, - 'publisher_id' => true, - 'order_id' => true, - 'product_id' => true, - 'product_price' => true, - 'payer_email' => true, - 'publisher_email' => true, - 'payed' => true, - 'success_date' => true, - 'event' => true, - 'elopage_user' => true, - 'affiliate_program' => true, - 'publisher' => true, - 'order' => true, - 'product' => true, - ]; -} diff --git a/community_server/src/Model/Entity/Operator.php b/community_server/src/Model/Entity/Operator.php deleted file mode 100644 index 9d5ddd3ca..000000000 --- a/community_server/src/Model/Entity/Operator.php +++ /dev/null @@ -1,32 +0,0 @@ - true, - 'user_pubkey' => true, - 'operator_type_id' => true, - 'data_base64' => true, - 'modified' => true - ]; -} diff --git a/community_server/src/Model/Entity/OperatorType.php b/community_server/src/Model/Entity/OperatorType.php deleted file mode 100644 index 0ca968f47..000000000 --- a/community_server/src/Model/Entity/OperatorType.php +++ /dev/null @@ -1,31 +0,0 @@ - true, - 'text' => true, - 'operators' => true - ]; -} diff --git a/community_server/src/Model/Entity/Role.php b/community_server/src/Model/Entity/Role.php deleted file mode 100644 index ae0ddd0ba..000000000 --- a/community_server/src/Model/Entity/Role.php +++ /dev/null @@ -1,26 +0,0 @@ - true, - ]; -} diff --git a/community_server/src/Model/Entity/ServerUser.php b/community_server/src/Model/Entity/ServerUser.php deleted file mode 100644 index f1d47fd34..000000000 --- a/community_server/src/Model/Entity/ServerUser.php +++ /dev/null @@ -1,57 +0,0 @@ - true, - 'password' => true, - 'email' => true, - 'role' => true, - 'activated' => true, - 'last_login' => true, - 'created' => true, - 'modified' => true - ]; - - /** - * Fields that are excluded from JSON versions of the entity. - * - * @var array - */ - protected $_hidden = [ - 'password' - ]; - - protected function _setPassword($password) - { - if (strlen($password) > 0) { - return (new DefaultPasswordHasher)->hash($password); - } - } -} diff --git a/community_server/src/Model/Entity/StateBalance.php b/community_server/src/Model/Entity/StateBalance.php deleted file mode 100644 index 334db222f..000000000 --- a/community_server/src/Model/Entity/StateBalance.php +++ /dev/null @@ -1,89 +0,0 @@ - true, - 'modified' => true, - 'record_date' => true, - 'amount' => true, - 'record_date' => true, - 'state_user' => true - ]; - - protected $_virtual = ['decay','amount_float']; - - private function convertToTimestamp($dateOrTime) - { - if(method_exists($dateOrTime, 'getTimestamp')) { - return $dateOrTime->getTimestamp(); - } else if(method_exists($dateOrTime, 'i18nFormat')) { - return $dateOrTime->i18nFormat(Time::UNIX_TIMESTAMP_FORMAT); - } else { - return 0; - } - } - - protected function _getDecay() - { - // decay factor in seconds per year - // q = e^((lg Kn - lg K0) / n) - // 0.999999978 - // - // SELECT TIMESTAMPDIFF(SECOND, modified, CURDATE()) AS age_in_seconds from state_balances - // decay_for_duration = decay_factor^seconds - // decay = gradido_cent * decay_for_duration - $startDate = $this->convertToTimestamp($this->record_date); - if($startDate == 0) { - return $this->amount; - } - - $decay_duration = intval(Time::now()->getTimestamp() - $startDate); - if($decay_duration === 0) { - return $this->amount; - } - //return $this->amount; - return intval($this->amount * pow(0.99999997802044727, $decay_duration)); - - } - - public function partDecay($target_date) - { - $decay_duration = intval($this->convertToTimestamp($target_date) - $this->convertToTimestamp($this->record_date)); - if($decay_duration <= 0) { - return $this->amount; - } - //return 0; - return intval($this->amount * pow(0.99999997802044727, $decay_duration)); - } - - public function decayDuration($target_date) - { - return intval($this->convertToTimestamp($target_date) - $this->convertToTimestamp($this->record_date)); - } -} - diff --git a/community_server/src/Model/Entity/StateCreated.php b/community_server/src/Model/Entity/StateCreated.php deleted file mode 100644 index 99c783e6c..000000000 --- a/community_server/src/Model/Entity/StateCreated.php +++ /dev/null @@ -1,41 +0,0 @@ - true, - 'month' => true, - 'year' => true, - 'state_user_id' => true, - 'created' => true, - 'short_ident_hash' => true, - 'transaction' => true, - 'state_user' => true - ]; -} diff --git a/community_server/src/Model/Entity/StateError.php b/community_server/src/Model/Entity/StateError.php deleted file mode 100644 index 448e9ccb3..000000000 --- a/community_server/src/Model/Entity/StateError.php +++ /dev/null @@ -1,37 +0,0 @@ - true, - 'transaction_type_id' => true, - 'created' => true, - 'message_json' => true, - 'state_user' => true, - 'transaction_type' => true - ]; -} diff --git a/community_server/src/Model/Entity/StateGroup.php b/community_server/src/Model/Entity/StateGroup.php deleted file mode 100644 index c2bdc75fc..000000000 --- a/community_server/src/Model/Entity/StateGroup.php +++ /dev/null @@ -1,43 +0,0 @@ - true, - 'name' => true, - 'root_public_key' => true, - 'user_count' => true, - 'index' => true, - 'state_group_addresses' => true, - 'state_users' => true, - 'transaction_group_creates' => true, - 'transactions' => true - ]; -} diff --git a/community_server/src/Model/Entity/StateGroupAddress.php b/community_server/src/Model/Entity/StateGroupAddress.php deleted file mode 100644 index e2d669d09..000000000 --- a/community_server/src/Model/Entity/StateGroupAddress.php +++ /dev/null @@ -1,35 +0,0 @@ - true, - 'public_key' => true, - 'address_type_id' => true, - 'state_group' => true, - 'address_type' => true, - ]; -} diff --git a/community_server/src/Model/Entity/StateGroupRelationship.php b/community_server/src/Model/Entity/StateGroupRelationship.php deleted file mode 100644 index 974b1375d..000000000 --- a/community_server/src/Model/Entity/StateGroupRelationship.php +++ /dev/null @@ -1,37 +0,0 @@ - true, - 'state_group2_id' => true, - 'state_relationship_id' => true, - 'state_group1' => true, - 'state_group2' => true, - 'state_relationship' => true - ]; -} diff --git a/community_server/src/Model/Entity/StateRelationshipType.php b/community_server/src/Model/Entity/StateRelationshipType.php deleted file mode 100644 index f3c70d31e..000000000 --- a/community_server/src/Model/Entity/StateRelationshipType.php +++ /dev/null @@ -1,28 +0,0 @@ - true, - 'text' => true - ]; -} diff --git a/community_server/src/Model/Entity/StateUser.php b/community_server/src/Model/Entity/StateUser.php deleted file mode 100644 index 5fac7cda7..000000000 --- a/community_server/src/Model/Entity/StateUser.php +++ /dev/null @@ -1,58 +0,0 @@ - true, - 'state_group_id' => true, - 'public_key' => true, - 'email' => true, - 'first_name' => true, - 'last_name' => true, - 'disabled' => true, - 'username' => true, - 'index' => true, - 'state_group' => true, - 'state_balances' => true, - 'state_created' => true, - 'transaction_creations' => true, - 'transaction_send_coins' => true - ]; - - public function getEmailWithName() - { - return $this->first_name . ' ' . $this->last_name . ' <' . $this->email . '>'; - } - - public function getNames() - { - return $this->first_name . ' ' . $this->last_name; - } -} diff --git a/community_server/src/Model/Entity/StateUserRole.php b/community_server/src/Model/Entity/StateUserRole.php deleted file mode 100644 index d510bb025..000000000 --- a/community_server/src/Model/Entity/StateUserRole.php +++ /dev/null @@ -1,30 +0,0 @@ - true, - 'role_id' => true - ]; -} diff --git a/community_server/src/Model/Entity/StateUserTransaction.php b/community_server/src/Model/Entity/StateUserTransaction.php deleted file mode 100644 index 9fed345a5..000000000 --- a/community_server/src/Model/Entity/StateUserTransaction.php +++ /dev/null @@ -1,37 +0,0 @@ - true, - 'transaction_id' => true, - 'transaction_type_id' => true, - 'state_user' => true, - 'transaction' => true, - 'transaction_type' => true, - ]; -} diff --git a/community_server/src/Model/Entity/Transaction.php b/community_server/src/Model/Entity/Transaction.php deleted file mode 100644 index 209b8997e..000000000 --- a/community_server/src/Model/Entity/Transaction.php +++ /dev/null @@ -1,53 +0,0 @@ - true, - 'transaction_type_id' => true, - 'tx_hash' => true, - 'memo' => true, - 'received' => true, - 'blockchain_type_id' => true, - 'state_group' => true, - 'transaction_type' => true, - 'state_created' => true, - 'transaction_creations' => true, - 'transaction_group_addaddress' => true, - 'transaction_group_allowtrades' => true, - 'transaction_group_creates' => true, - 'transaction_send_coins' => true, - 'transaction_signatures' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionCreation.php b/community_server/src/Model/Entity/TransactionCreation.php deleted file mode 100644 index 36aa7ac2d..000000000 --- a/community_server/src/Model/Entity/TransactionCreation.php +++ /dev/null @@ -1,39 +0,0 @@ - true, - 'state_user_id' => true, - 'amount' => true, - 'ident_hash' => true, - 'transaction' => true, - 'state_user' => true, - 'target_date' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionGroupAddaddres.php b/community_server/src/Model/Entity/TransactionGroupAddaddres.php deleted file mode 100644 index 30819209f..000000000 --- a/community_server/src/Model/Entity/TransactionGroupAddaddres.php +++ /dev/null @@ -1,37 +0,0 @@ - true, - 'address_type_id' => true, - 'remove_from_group' => true, - 'public_key' => true, - 'transaction' => true, - 'address_type' => true, - 'state_user_id' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionGroupAllowtrade.php b/community_server/src/Model/Entity/TransactionGroupAllowtrade.php deleted file mode 100644 index d097c643f..000000000 --- a/community_server/src/Model/Entity/TransactionGroupAllowtrade.php +++ /dev/null @@ -1,35 +0,0 @@ - true, - 'group_id' => true, - 'allow' => true, - 'transaction' => true, - 'group' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionGroupCreate.php b/community_server/src/Model/Entity/TransactionGroupCreate.php deleted file mode 100644 index 26fab510b..000000000 --- a/community_server/src/Model/Entity/TransactionGroupCreate.php +++ /dev/null @@ -1,37 +0,0 @@ - true, - 'group_public_key' => true, - 'state_group_id' => true, - 'name' => true, - 'transaction' => true, - 'state_group' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionSendCoin.php b/community_server/src/Model/Entity/TransactionSendCoin.php deleted file mode 100644 index 4d774501e..000000000 --- a/community_server/src/Model/Entity/TransactionSendCoin.php +++ /dev/null @@ -1,43 +0,0 @@ - true, - 'state_user_id' => true, - 'receiver_public_key' => true, - 'receiver_user_id' => true, - 'amount' => true, - 'sender_final_balance' => true, - 'transaction' => true, - 'state_user' => true, - 'receiver_user' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionSignature.php b/community_server/src/Model/Entity/TransactionSignature.php deleted file mode 100644 index 16bce8b00..000000000 --- a/community_server/src/Model/Entity/TransactionSignature.php +++ /dev/null @@ -1,33 +0,0 @@ - true, - 'signature' => true, - 'pubkey' => true, - 'transaction' => true - ]; -} diff --git a/community_server/src/Model/Entity/TransactionType.php b/community_server/src/Model/Entity/TransactionType.php deleted file mode 100644 index b8f13e474..000000000 --- a/community_server/src/Model/Entity/TransactionType.php +++ /dev/null @@ -1,31 +0,0 @@ - true, - 'text' => true, - 'transactions' => true - ]; -} diff --git a/community_server/src/Model/Entity/User.php b/community_server/src/Model/Entity/User.php deleted file mode 100644 index 352371471..000000000 --- a/community_server/src/Model/Entity/User.php +++ /dev/null @@ -1,58 +0,0 @@ - true, - 'first_name' => true, - 'last_name' => true, - 'password' => true, - 'pubkey' => true, - 'privkey' => true, - 'created' => true, - 'email_checked' => true, - 'language' => true, - 'email_opt_in' => true, - 'user_backups' => true, - 'user_roles' => true, - ]; - - /** - * Fields that are excluded from JSON versions of the entity. - * - * @var array - */ - protected $_hidden = [ - 'password', - ]; -} diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/BasicTypes.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/BasicTypes.php deleted file mode 100644 index 60fa5f22b..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/BasicTypes.php +++ /dev/null @@ -1,39 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0aca030a186772616469646f2f426173696354797065732e70726f746f12" . - "0d70726f746f2e6772616469646f22380a034b657912110a076564323535" . - "313918022001280c480012170a0d656432353531395f7265663130180320" . - "01280c480042050a036b657922580a0d5369676e61747572655061697212" . - "0e0a067075624b657918012001280c12110a076564323535313918022001" . - "280c480012170a0d656432353531395f726566313018032001280c480042" . - "0b0a097369676e6174757265223d0a0c5369676e61747572654d6170122d" . - "0a077369675061697218012003280b321c2e70726f746f2e677261646964" . - "6f2e5369676e617475726550616972222b0a0954696d657374616d70120f" . - "0a077365636f6e6473180120012803120d0a056e616e6f73180220012805" . - "22230a1054696d657374616d705365636f6e6473120f0a077365636f6e64" . - "7318012001280322300a0e5472616e73666572416d6f756e74120e0a0670" . - "75626b657918012001280c120e0a06616d6f756e7418022001281222400a" . - "08486564657261494412100a0873686172644e756d18012001280312100a" . - "087265616c6d4e756d18022001280312100a08746f7069634e756d180320" . - "012803620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoCreation.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoCreation.php deleted file mode 100644 index ebe7409db..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoCreation.php +++ /dev/null @@ -1,30 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0ab0010a1d6772616469646f2f4772616469646f4372656174696f6e2e70" . - "726f746f120d70726f746f2e6772616469646f22780a0f4772616469646f" . - "4372656174696f6e122f0a08726563656976657218012001280b321d2e70" . - "726f746f2e6772616469646f2e5472616e73666572416d6f756e7412340a" . - "0b7461726765745f6461746518032001280b321f2e70726f746f2e677261" . - "6469646f2e54696d657374616d705365636f6e6473620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoTransaction.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoTransaction.php deleted file mode 100644 index 78460bd9f..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoTransaction.php +++ /dev/null @@ -1,29 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0a91010a206772616469646f2f4772616469646f5472616e73616374696f" . - "6e2e70726f746f120d70726f746f2e6772616469646f22560a1247726164" . - "69646f5472616e73616374696f6e122c0a077369675f6d61701801200128" . - "0b321b2e70726f746f2e6772616469646f2e5369676e61747572654d6170" . - "12120a0a626f64795f627974657318022001280c620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoTransfer.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoTransfer.php deleted file mode 100644 index 6d7e6e375..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/GradidoTransfer.php +++ /dev/null @@ -1,41 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0ae6030a1d6772616469646f2f4772616469646f5472616e736665722e70" . - "726f746f120d70726f746f2e6772616469646f22500a0d4c6f63616c5472" . - "616e73666572122d0a0673656e64657218012001280b321d2e70726f746f" . - "2e6772616469646f2e5472616e73666572416d6f756e7412100a08726563" . - "656976657218022001280c22a3010a1243726f737347726f75705472616e" . - "73666572122d0a0673656e64657218012001280b321d2e70726f746f2e67" . - "72616469646f2e5472616e73666572416d6f756e7412100a087265636569" . - "76657218022001280c12130a0b6f746865725f67726f7570180320012809" . - "12370a157061697265645f7472616e73616374696f6e5f69641804200128" . - "0b32182e70726f746f2e6772616469646f2e54696d657374616d7022b501" . - "0a0f4772616469646f5472616e73666572122d0a056c6f63616c18012001" . - "280b321c2e70726f746f2e6772616469646f2e4c6f63616c5472616e7366" . - "6572480012340a07696e626f756e6418022001280b32212e70726f746f2e" . - "6772616469646f2e43726f737347726f75705472616e7366657248001235" . - "0a086f7574626f756e6418032001280b32212e70726f746f2e6772616469" . - "646f2e43726f737347726f75705472616e73666572480042060a04646174" . - "61620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/GroupFriendsUpdate.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/GroupFriendsUpdate.php deleted file mode 100644 index 929e33b9d..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/GroupFriendsUpdate.php +++ /dev/null @@ -1,30 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0ac6010a206772616469646f2f47726f7570467269656e64735570646174" . - "652e70726f746f120d70726f746f2e6772616469646f228a010a1247726f" . - "7570467269656e6473557064617465120d0a0567726f7570180120012809" . - "12380a06616374696f6e18022001280e32282e70726f746f2e6772616469" . - "646f2e47726f7570467269656e64735570646174652e416374696f6e222b" . - "0a06416374696f6e120e0a0a4144445f465249454e44100012110a0d5245" . - "4d4f56455f465249454e441001620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/GroupMemberUpdate.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/GroupMemberUpdate.php deleted file mode 100644 index c2a308292..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/GroupMemberUpdate.php +++ /dev/null @@ -1,36 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0ad2020a1f6772616469646f2f47726f75704d656d626572557064617465" . - "2e70726f746f120d70726f746f2e6772616469646f2297020a1147726f75" . - "704d656d62657255706461746512130a0b757365725f7075626b65791801" . - "2001280c124d0a126d656d6265725f7570646174655f7479706518022001" . - "280e32312e70726f746f2e6772616469646f2e47726f75704d656d626572" . - "5570646174652e4d656d6265725570646174655479706512370a15706169" . - "7265645f7472616e73616374696f6e5f696418032001280b32182e70726f" . - "746f2e6772616469646f2e54696d657374616d7012140a0c746172676574" . - "5f67726f7570180420012809224f0a104d656d6265725570646174655479" . - "7065120c0a084144445f55534552100012150a114d4f56455f555345525f" . - "494e424f554e44100112160a124d4f56455f555345525f4f5554424f554e" . - "441002620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeBody.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeBody.php deleted file mode 100644 index aec11c28b..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeBody.php +++ /dev/null @@ -1,32 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0ab9010a1c6772616469646f2f4d616e6167654e6f6465426f64792e7072" . - "6f746f120d70726f746f2e6772616469646f1a186772616469646f2f4261" . - "73696354797065732e70726f746f22680a0e4d616e6167654e6f6465426f" . - "647912160a0e76657273696f6e5f6e756d62657218012001280412360a09" . - "67726f75705f61646418032001280b32212e70726f746f2e677261646964" . - "6f2e4d616e6167654e6f646547726f7570416464480042060a0464617461" . - "620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeGroupAdd.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeGroupAdd.php deleted file mode 100644 index ffb25984d..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeGroupAdd.php +++ /dev/null @@ -1,30 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0aaa010a206772616469646f2f4d616e6167654e6f646547726f75704164" . - "642e70726f746f120d70726f746f2e6772616469646f226f0a124d616e61" . - "67654e6f646547726f757041646412120a0a67726f75705f6e616d651801" . - "2001280912130a0b67726f75705f616c69617318022001280912300a0f68" . - "65646572615f746f7069635f696418032001280b32172e70726f746f2e67" . - "72616469646f2e4865646572614944620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeRequest.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeRequest.php deleted file mode 100644 index ef7dca297..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/ManageNodeRequest.php +++ /dev/null @@ -1,36 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0ade020a1f6772616469646f2f4d616e6167654e6f646552657175657374" . - "2e70726f746f120d70726f746f2e6772616469646f22550a114d616e6167" . - "654e6f646552657175657374122c0a077369675f6d617018012001280b32" . - "1b2e70726f746f2e6772616469646f2e5369676e61747572654d61701212" . - "0a0a626f64795f627974657318022001280c22cc010a124d616e6167654e" . - "6f6465526573706f6e7365120f0a0773756363657373180120012808123a" . - "0a056572726f7218022001280e322b2e70726f746f2e6772616469646f2e" . - "4d616e6167654e6f6465526573706f6e73652e4572726f72436f64652269" . - "0a094572726f72436f646512100a0c494e56414c49445f424f4459100012" . - "150a11494e56414c49445f5349474e4154555245100112140a105349474e" . - "45525f4e4f545f4b4e4f574e1002121d0a1947524f55505f414c4941535f" . - "414c52454144595f45584953541003620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/GPBMetadata/Gradido/TransactionBody.php b/community_server/src/Model/Messages/GPBMetadata/Gradido/TransactionBody.php deleted file mode 100644 index f55b61f4d..000000000 --- a/community_server/src/Model/Messages/GPBMetadata/Gradido/TransactionBody.php +++ /dev/null @@ -1,46 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0a92040a1d6772616469646f2f5472616e73616374696f6e426f64792e70" . - "726f746f120d70726f746f2e6772616469646f1a1d6772616469646f2f47" . - "72616469646f4372656174696f6e2e70726f746f1a206772616469646f2f" . - "47726f7570467269656e64735570646174652e70726f746f1a1f67726164" . - "69646f2f47726f75704d656d6265725570646174652e70726f746f1a1867" . - "72616469646f2f426173696354797065732e70726f746f22dd020a0f5472" . - "616e73616374696f6e426f6479120c0a046d656d6f18012001280912300a" . - "076372656174656418022001280b321f2e70726f746f2e6772616469646f" . - "2e54696d657374616d705365636f6e647312160a0e76657273696f6e5f6e" . - "756d62657218032001280412320a087472616e7366657218062001280b32" . - "1e2e70726f746f2e6772616469646f2e4772616469646f5472616e736665" . - "72480012320a086372656174696f6e18072001280b321e2e70726f746f2e" . - "6772616469646f2e4772616469646f4372656174696f6e480012410a1467" . - "726f75705f667269656e64735f75706461746518082001280b32212e7072" . - "6f746f2e6772616469646f2e47726f7570467269656e6473557064617465" . - "4800123f0a1367726f75705f6d656d6265725f7570646174651809200128" . - "0b32202e70726f746f2e6772616469646f2e47726f75704d656d62657255" . - "7064617465480042060a0464617461620670726f746f33" - ), true); - - static::$is_initialized = true; - } -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/CrossGroupTransfer.php b/community_server/src/Model/Messages/Proto/Gradido/CrossGroupTransfer.php deleted file mode 100644 index 781ac8f25..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/CrossGroupTransfer.php +++ /dev/null @@ -1,146 +0,0 @@ -proto.gradido.CrossGroupTransfer - */ -class CrossGroupTransfer extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field .proto.gradido.TransferAmount sender = 1; - */ - private $sender = null; - /** - * Generated from protobuf field bytes receiver = 2; - */ - private $receiver = ''; - /** - * Generated from protobuf field string other_group = 3; - */ - private $other_group = ''; - /** - * this matches related OutboundTransfer.paired_transaction_id - * - * Generated from protobuf field .proto.gradido.Timestamp paired_transaction_id = 4; - */ - private $paired_transaction_id = null; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\TransferAmount $sender - * @type string $receiver - * @type string $other_group - * @type \Proto\Gradido\Timestamp $paired_transaction_id - * this matches related OutboundTransfer.paired_transaction_id - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GradidoTransfer::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field .proto.gradido.TransferAmount sender = 1; - * @return \Proto\Gradido\TransferAmount - */ - public function getSender() - { - return $this->sender; - } - - /** - * Generated from protobuf field .proto.gradido.TransferAmount sender = 1; - * @param \Proto\Gradido\TransferAmount $var - * @return $this - */ - public function setSender($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\TransferAmount::class); - $this->sender = $var; - - return $this; - } - - /** - * Generated from protobuf field bytes receiver = 2; - * @return string - */ - public function getReceiver() - { - return $this->receiver; - } - - /** - * Generated from protobuf field bytes receiver = 2; - * @param string $var - * @return $this - */ - public function setReceiver($var) - { - GPBUtil::checkString($var, False); - $this->receiver = $var; - - return $this; - } - - /** - * Generated from protobuf field string other_group = 3; - * @return string - */ - public function getOtherGroup() - { - return $this->other_group; - } - - /** - * Generated from protobuf field string other_group = 3; - * @param string $var - * @return $this - */ - public function setOtherGroup($var) - { - GPBUtil::checkString($var, True); - $this->other_group = $var; - - return $this; - } - - /** - * this matches related OutboundTransfer.paired_transaction_id - * - * Generated from protobuf field .proto.gradido.Timestamp paired_transaction_id = 4; - * @return \Proto\Gradido\Timestamp - */ - public function getPairedTransactionId() - { - return $this->paired_transaction_id; - } - - /** - * this matches related OutboundTransfer.paired_transaction_id - * - * Generated from protobuf field .proto.gradido.Timestamp paired_transaction_id = 4; - * @param \Proto\Gradido\Timestamp $var - * @return $this - */ - public function setPairedTransactionId($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\Timestamp::class); - $this->paired_transaction_id = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GradidoCreation.php b/community_server/src/Model/Messages/Proto/Gradido/GradidoCreation.php deleted file mode 100644 index 9b4c3208d..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GradidoCreation.php +++ /dev/null @@ -1,102 +0,0 @@ -proto.gradido.GradidoCreation - */ -class GradidoCreation extends \Google\Protobuf\Internal\Message -{ - /** - * 40 Byte - * - * Generated from protobuf field .proto.gradido.TransferAmount receiver = 1; - */ - private $receiver = null; - /** - * 8 Byte - * - * Generated from protobuf field .proto.gradido.TimestampSeconds target_date = 3; - */ - private $target_date = null; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\TransferAmount $receiver - * 40 Byte - * @type \Proto\Gradido\TimestampSeconds $target_date - * 8 Byte - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GradidoCreation::initOnce(); - parent::__construct($data); - } - - /** - * 40 Byte - * - * Generated from protobuf field .proto.gradido.TransferAmount receiver = 1; - * @return \Proto\Gradido\TransferAmount - */ - public function getReceiver() - { - return $this->receiver; - } - - /** - * 40 Byte - * - * Generated from protobuf field .proto.gradido.TransferAmount receiver = 1; - * @param \Proto\Gradido\TransferAmount $var - * @return $this - */ - public function setReceiver($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\TransferAmount::class); - $this->receiver = $var; - - return $this; - } - - /** - * 8 Byte - * - * Generated from protobuf field .proto.gradido.TimestampSeconds target_date = 3; - * @return \Proto\Gradido\TimestampSeconds - */ - public function getTargetDate() - { - return $this->target_date; - } - - /** - * 8 Byte - * - * Generated from protobuf field .proto.gradido.TimestampSeconds target_date = 3; - * @param \Proto\Gradido\TimestampSeconds $var - * @return $this - */ - public function setTargetDate($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\TimestampSeconds::class); - $this->target_date = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GradidoTransaction.php b/community_server/src/Model/Messages/Proto/Gradido/GradidoTransaction.php deleted file mode 100644 index b4b34c77e..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GradidoTransaction.php +++ /dev/null @@ -1,116 +0,0 @@ -proto.gradido.GradidoTransaction - */ -class GradidoTransaction extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field .proto.gradido.SignatureMap sig_map = 1; - */ - private $sig_map = null; - /** - * TODO: consider if having concrete type wouldn't be better; - * having bytes would better show what is signed, still for - * blockchain it doesn't matter, as it has to be serialized again - * when validating - * UNICORN ANSWER: - * Maybe but hedera has at first concrete type and has depracted that now, so is must - * be reason for that - * - * Generated from protobuf field bytes body_bytes = 2; - */ - private $body_bytes = ''; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\SignatureMap $sig_map - * @type string $body_bytes - * TODO: consider if having concrete type wouldn't be better; - * having bytes would better show what is signed, still for - * blockchain it doesn't matter, as it has to be serialized again - * when validating - * UNICORN ANSWER: - * Maybe but hedera has at first concrete type and has depracted that now, so is must - * be reason for that - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GradidoTransaction::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field .proto.gradido.SignatureMap sig_map = 1; - * @return \Proto\Gradido\SignatureMap - */ - public function getSigMap() - { - return $this->sig_map; - } - - /** - * Generated from protobuf field .proto.gradido.SignatureMap sig_map = 1; - * @param \Proto\Gradido\SignatureMap $var - * @return $this - */ - public function setSigMap($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\SignatureMap::class); - $this->sig_map = $var; - - return $this; - } - - /** - * TODO: consider if having concrete type wouldn't be better; - * having bytes would better show what is signed, still for - * blockchain it doesn't matter, as it has to be serialized again - * when validating - * UNICORN ANSWER: - * Maybe but hedera has at first concrete type and has depracted that now, so is must - * be reason for that - * - * Generated from protobuf field bytes body_bytes = 2; - * @return string - */ - public function getBodyBytes() - { - return $this->body_bytes; - } - - /** - * TODO: consider if having concrete type wouldn't be better; - * having bytes would better show what is signed, still for - * blockchain it doesn't matter, as it has to be serialized again - * when validating - * UNICORN ANSWER: - * Maybe but hedera has at first concrete type and has depracted that now, so is must - * be reason for that - * - * Generated from protobuf field bytes body_bytes = 2; - * @param string $var - * @return $this - */ - public function setBodyBytes($var) - { - GPBUtil::checkString($var, False); - $this->body_bytes = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GradidoTransfer.php b/community_server/src/Model/Messages/Proto/Gradido/GradidoTransfer.php deleted file mode 100644 index a76954c2e..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GradidoTransfer.php +++ /dev/null @@ -1,109 +0,0 @@ -proto.gradido.GradidoTransfer - */ -class GradidoTransfer extends \Google\Protobuf\Internal\Message -{ - protected $data; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\LocalTransfer $local - * @type \Proto\Gradido\CrossGroupTransfer $inbound - * @type \Proto\Gradido\CrossGroupTransfer $outbound - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GradidoTransfer::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field .proto.gradido.LocalTransfer local = 1; - * @return \Proto\Gradido\LocalTransfer - */ - public function getLocal() - { - return $this->readOneof(1); - } - - /** - * Generated from protobuf field .proto.gradido.LocalTransfer local = 1; - * @param \Proto\Gradido\LocalTransfer $var - * @return $this - */ - public function setLocal($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\LocalTransfer::class); - $this->writeOneof(1, $var); - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.CrossGroupTransfer inbound = 2; - * @return \Proto\Gradido\CrossGroupTransfer - */ - public function getInbound() - { - return $this->readOneof(2); - } - - /** - * Generated from protobuf field .proto.gradido.CrossGroupTransfer inbound = 2; - * @param \Proto\Gradido\CrossGroupTransfer $var - * @return $this - */ - public function setInbound($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\CrossGroupTransfer::class); - $this->writeOneof(2, $var); - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.CrossGroupTransfer outbound = 3; - * @return \Proto\Gradido\CrossGroupTransfer - */ - public function getOutbound() - { - return $this->readOneof(3); - } - - /** - * Generated from protobuf field .proto.gradido.CrossGroupTransfer outbound = 3; - * @param \Proto\Gradido\CrossGroupTransfer $var - * @return $this - */ - public function setOutbound($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\CrossGroupTransfer::class); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * @return string - */ - public function getData() - { - return $this->whichOneof("data"); - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate.php b/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate.php deleted file mode 100644 index 22e86d3e1..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate.php +++ /dev/null @@ -1,92 +0,0 @@ -proto.gradido.GroupFriendsUpdate - */ -class GroupFriendsUpdate extends \Google\Protobuf\Internal\Message -{ - /** - * char[16], alias - * - * Generated from protobuf field string group = 1; - */ - private $group = ''; - /** - * Generated from protobuf field .proto.gradido.GroupFriendsUpdate.Action action = 2; - */ - private $action = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $group - * char[16], alias - * @type int $action - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GroupFriendsUpdate::initOnce(); - parent::__construct($data); - } - - /** - * char[16], alias - * - * Generated from protobuf field string group = 1; - * @return string - */ - public function getGroup() - { - return $this->group; - } - - /** - * char[16], alias - * - * Generated from protobuf field string group = 1; - * @param string $var - * @return $this - */ - public function setGroup($var) - { - GPBUtil::checkString($var, True); - $this->group = $var; - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.GroupFriendsUpdate.Action action = 2; - * @return int - */ - public function getAction() - { - return $this->action; - } - - /** - * Generated from protobuf field .proto.gradido.GroupFriendsUpdate.Action action = 2; - * @param int $var - * @return $this - */ - public function setAction($var) - { - GPBUtil::checkEnum($var, \Proto\Gradido\GroupFriendsUpdate_Action::class); - $this->action = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate/Action.php b/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate/Action.php deleted file mode 100644 index 2a3396c55..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate/Action.php +++ /dev/null @@ -1,51 +0,0 @@ -proto.gradido.GroupFriendsUpdate.Action - */ -class Action -{ - /** - * Generated from protobuf enum ADD_FRIEND = 0; - */ - const ADD_FRIEND = 0; - /** - * Generated from protobuf enum REMOVE_FRIEND = 1; - */ - const REMOVE_FRIEND = 1; - - private static $valueToName = [ - self::ADD_FRIEND => 'ADD_FRIEND', - self::REMOVE_FRIEND => 'REMOVE_FRIEND', - ]; - - public static function name($value) - { - if (!isset(self::$valueToName[$value])) { - throw new UnexpectedValueException(sprintf( - 'Enum %s has no name defined for value %s', __CLASS__, $value)); - } - return self::$valueToName[$value]; - } - - - public static function value($name) - { - $const = __CLASS__ . '::' . strtoupper($name); - if (!defined($const)) { - throw new UnexpectedValueException(sprintf( - 'Enum %s has no value defined for name %s', __CLASS__, $name)); - } - return constant($const); - } -} - -// Adding a class alias for backwards compatibility with the previous class name. -class_alias(Action::class, \Proto\Gradido\GroupFriendsUpdate_Action::class); - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate_Action.php b/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate_Action.php deleted file mode 100644 index 24f8cef70..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GroupFriendsUpdate_Action.php +++ /dev/null @@ -1,16 +0,0 @@ -proto.gradido.GroupMemberUpdate - */ -class GroupMemberUpdate extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bytes user_pubkey = 1; - */ - private $user_pubkey = ''; - /** - * Generated from protobuf field .proto.gradido.GroupMemberUpdate.MemberUpdateType member_update_type = 2; - */ - private $member_update_type = 0; - /** - * this only makes sense for user move, TODO: probably restructure - * - * Generated from protobuf field .proto.gradido.Timestamp paired_transaction_id = 3; - */ - private $paired_transaction_id = null; - /** - * Generated from protobuf field string target_group = 4; - */ - private $target_group = ''; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $user_pubkey - * @type int $member_update_type - * @type \Proto\Gradido\Timestamp $paired_transaction_id - * this only makes sense for user move, TODO: probably restructure - * @type string $target_group - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GroupMemberUpdate::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bytes user_pubkey = 1; - * @return string - */ - public function getUserPubkey() - { - return $this->user_pubkey; - } - - /** - * Generated from protobuf field bytes user_pubkey = 1; - * @param string $var - * @return $this - */ - public function setUserPubkey($var) - { - GPBUtil::checkString($var, False); - $this->user_pubkey = $var; - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.GroupMemberUpdate.MemberUpdateType member_update_type = 2; - * @return int - */ - public function getMemberUpdateType() - { - return $this->member_update_type; - } - - /** - * Generated from protobuf field .proto.gradido.GroupMemberUpdate.MemberUpdateType member_update_type = 2; - * @param int $var - * @return $this - */ - public function setMemberUpdateType($var) - { - GPBUtil::checkEnum($var, \Proto\Gradido\GroupMemberUpdate_MemberUpdateType::class); - $this->member_update_type = $var; - - return $this; - } - - /** - * this only makes sense for user move, TODO: probably restructure - * - * Generated from protobuf field .proto.gradido.Timestamp paired_transaction_id = 3; - * @return \Proto\Gradido\Timestamp - */ - public function getPairedTransactionId() - { - return $this->paired_transaction_id; - } - - /** - * this only makes sense for user move, TODO: probably restructure - * - * Generated from protobuf field .proto.gradido.Timestamp paired_transaction_id = 3; - * @param \Proto\Gradido\Timestamp $var - * @return $this - */ - public function setPairedTransactionId($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\Timestamp::class); - $this->paired_transaction_id = $var; - - return $this; - } - - /** - * Generated from protobuf field string target_group = 4; - * @return string - */ - public function getTargetGroup() - { - return $this->target_group; - } - - /** - * Generated from protobuf field string target_group = 4; - * @param string $var - * @return $this - */ - public function setTargetGroup($var) - { - GPBUtil::checkString($var, True); - $this->target_group = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GroupMemberUpdate/MemberUpdateType.php b/community_server/src/Model/Messages/Proto/Gradido/GroupMemberUpdate/MemberUpdateType.php deleted file mode 100644 index 57580cd75..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GroupMemberUpdate/MemberUpdateType.php +++ /dev/null @@ -1,56 +0,0 @@ -proto.gradido.GroupMemberUpdate.MemberUpdateType - */ -class MemberUpdateType -{ - /** - * Generated from protobuf enum ADD_USER = 0; - */ - const ADD_USER = 0; - /** - * Generated from protobuf enum MOVE_USER_INBOUND = 1; - */ - const MOVE_USER_INBOUND = 1; - /** - * Generated from protobuf enum MOVE_USER_OUTBOUND = 2; - */ - const MOVE_USER_OUTBOUND = 2; - - private static $valueToName = [ - self::ADD_USER => 'ADD_USER', - self::MOVE_USER_INBOUND => 'MOVE_USER_INBOUND', - self::MOVE_USER_OUTBOUND => 'MOVE_USER_OUTBOUND', - ]; - - public static function name($value) - { - if (!isset(self::$valueToName[$value])) { - throw new UnexpectedValueException(sprintf( - 'Enum %s has no name defined for value %s', __CLASS__, $value)); - } - return self::$valueToName[$value]; - } - - - public static function value($name) - { - $const = __CLASS__ . '::' . strtoupper($name); - if (!defined($const)) { - throw new UnexpectedValueException(sprintf( - 'Enum %s has no value defined for name %s', __CLASS__, $name)); - } - return constant($const); - } -} - -// Adding a class alias for backwards compatibility with the previous class name. -class_alias(MemberUpdateType::class, \Proto\Gradido\GroupMemberUpdate_MemberUpdateType::class); - diff --git a/community_server/src/Model/Messages/Proto/Gradido/GroupMemberUpdate_MemberUpdateType.php b/community_server/src/Model/Messages/Proto/Gradido/GroupMemberUpdate_MemberUpdateType.php deleted file mode 100644 index b7080cf75..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/GroupMemberUpdate_MemberUpdateType.php +++ /dev/null @@ -1,16 +0,0 @@ -proto.gradido.HederaID - */ -class HederaID extends \Google\Protobuf\Internal\Message -{ - /** - * The shard number (nonnegative) - * - * Generated from protobuf field int64 shardNum = 1; - */ - private $shardNum = 0; - /** - * The realm number (nonnegative) - * - * Generated from protobuf field int64 realmNum = 2; - */ - private $realmNum = 0; - /** - * Unique topic identifier within a realm (nonnegative). - * - * Generated from protobuf field int64 topicNum = 3; - */ - private $topicNum = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $shardNum - * The shard number (nonnegative) - * @type int|string $realmNum - * The realm number (nonnegative) - * @type int|string $topicNum - * Unique topic identifier within a realm (nonnegative). - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * The shard number (nonnegative) - * - * Generated from protobuf field int64 shardNum = 1; - * @return int|string - */ - public function getShardNum() - { - return $this->shardNum; - } - - /** - * The shard number (nonnegative) - * - * Generated from protobuf field int64 shardNum = 1; - * @param int|string $var - * @return $this - */ - public function setShardNum($var) - { - GPBUtil::checkInt64($var); - $this->shardNum = $var; - - return $this; - } - - /** - * The realm number (nonnegative) - * - * Generated from protobuf field int64 realmNum = 2; - * @return int|string - */ - public function getRealmNum() - { - return $this->realmNum; - } - - /** - * The realm number (nonnegative) - * - * Generated from protobuf field int64 realmNum = 2; - * @param int|string $var - * @return $this - */ - public function setRealmNum($var) - { - GPBUtil::checkInt64($var); - $this->realmNum = $var; - - return $this; - } - - /** - * Unique topic identifier within a realm (nonnegative). - * - * Generated from protobuf field int64 topicNum = 3; - * @return int|string - */ - public function getTopicNum() - { - return $this->topicNum; - } - - /** - * Unique topic identifier within a realm (nonnegative). - * - * Generated from protobuf field int64 topicNum = 3; - * @param int|string $var - * @return $this - */ - public function setTopicNum($var) - { - GPBUtil::checkInt64($var); - $this->topicNum = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/Key.php b/community_server/src/Model/Messages/Proto/Gradido/Key.php deleted file mode 100644 index 4c32e0083..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/Key.php +++ /dev/null @@ -1,96 +0,0 @@ -proto.gradido.Key - */ -class Key extends \Google\Protobuf\Internal\Message -{ - protected $key; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $ed25519 - * ed25519 signature (libsodium default) - * @type string $ed25519_ref10 - * ed25519 ref10 signature - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @return string - */ - public function getEd25519() - { - return $this->readOneof(2); - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @param string $var - * @return $this - */ - public function setEd25519($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(2, $var); - - return $this; - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @return string - */ - public function getEd25519Ref10() - { - return $this->readOneof(3); - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @param string $var - * @return $this - */ - public function setEd25519Ref10($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * @return string - */ - public function getKey() - { - return $this->whichOneof("key"); - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/LocalTransfer.php b/community_server/src/Model/Messages/Proto/Gradido/LocalTransfer.php deleted file mode 100644 index 58f5e23ae..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/LocalTransfer.php +++ /dev/null @@ -1,85 +0,0 @@ -proto.gradido.LocalTransfer - */ -class LocalTransfer extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field .proto.gradido.TransferAmount sender = 1; - */ - private $sender = null; - /** - * Generated from protobuf field bytes receiver = 2; - */ - private $receiver = ''; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\TransferAmount $sender - * @type string $receiver - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\GradidoTransfer::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field .proto.gradido.TransferAmount sender = 1; - * @return \Proto\Gradido\TransferAmount - */ - public function getSender() - { - return $this->sender; - } - - /** - * Generated from protobuf field .proto.gradido.TransferAmount sender = 1; - * @param \Proto\Gradido\TransferAmount $var - * @return $this - */ - public function setSender($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\TransferAmount::class); - $this->sender = $var; - - return $this; - } - - /** - * Generated from protobuf field bytes receiver = 2; - * @return string - */ - public function getReceiver() - { - return $this->receiver; - } - - /** - * Generated from protobuf field bytes receiver = 2; - * @param string $var - * @return $this - */ - public function setReceiver($var) - { - GPBUtil::checkString($var, False); - $this->receiver = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeBody.php b/community_server/src/Model/Messages/Proto/Gradido/ManageNodeBody.php deleted file mode 100644 index eed599868..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeBody.php +++ /dev/null @@ -1,90 +0,0 @@ -proto.gradido.ManageNodeBody - */ -class ManageNodeBody extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field uint64 version_number = 1; - */ - private $version_number = 0; - protected $data; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $version_number - * @type \Proto\Gradido\ManageNodeGroupAdd $group_add - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\ManageNodeBody::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field uint64 version_number = 1; - * @return int|string - */ - public function getVersionNumber() - { - return $this->version_number; - } - - /** - * Generated from protobuf field uint64 version_number = 1; - * @param int|string $var - * @return $this - */ - public function setVersionNumber($var) - { - GPBUtil::checkUint64($var); - $this->version_number = $var; - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.ManageNodeGroupAdd group_add = 3; - * @return \Proto\Gradido\ManageNodeGroupAdd - */ - public function getGroupAdd() - { - return $this->readOneof(3); - } - - /** - * Generated from protobuf field .proto.gradido.ManageNodeGroupAdd group_add = 3; - * @param \Proto\Gradido\ManageNodeGroupAdd $var - * @return $this - */ - public function setGroupAdd($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\ManageNodeGroupAdd::class); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * @return string - */ - public function getData() - { - return $this->whichOneof("data"); - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeGroupAdd.php b/community_server/src/Model/Messages/Proto/Gradido/ManageNodeGroupAdd.php deleted file mode 100644 index 777075066..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeGroupAdd.php +++ /dev/null @@ -1,119 +0,0 @@ -proto.gradido.ManageNodeGroupAdd - */ -class ManageNodeGroupAdd extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field string group_name = 1; - */ - private $group_name = ''; - /** - * Generated from protobuf field string group_alias = 2; - */ - private $group_alias = ''; - /** - *string parent_group_alias = 4; - * - * Generated from protobuf field .proto.gradido.HederaID hedera_topic_id = 3; - */ - private $hedera_topic_id = null; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $group_name - * @type string $group_alias - * @type \Proto\Gradido\HederaID $hedera_topic_id - * string parent_group_alias = 4; - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\ManageNodeGroupAdd::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field string group_name = 1; - * @return string - */ - public function getGroupName() - { - return $this->group_name; - } - - /** - * Generated from protobuf field string group_name = 1; - * @param string $var - * @return $this - */ - public function setGroupName($var) - { - GPBUtil::checkString($var, True); - $this->group_name = $var; - - return $this; - } - - /** - * Generated from protobuf field string group_alias = 2; - * @return string - */ - public function getGroupAlias() - { - return $this->group_alias; - } - - /** - * Generated from protobuf field string group_alias = 2; - * @param string $var - * @return $this - */ - public function setGroupAlias($var) - { - GPBUtil::checkString($var, True); - $this->group_alias = $var; - - return $this; - } - - /** - *string parent_group_alias = 4; - * - * Generated from protobuf field .proto.gradido.HederaID hedera_topic_id = 3; - * @return \Proto\Gradido\HederaID - */ - public function getHederaTopicId() - { - return $this->hedera_topic_id; - } - - /** - *string parent_group_alias = 4; - * - * Generated from protobuf field .proto.gradido.HederaID hedera_topic_id = 3; - * @param \Proto\Gradido\HederaID $var - * @return $this - */ - public function setHederaTopicId($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\HederaID::class); - $this->hedera_topic_id = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeRequest.php b/community_server/src/Model/Messages/Proto/Gradido/ManageNodeRequest.php deleted file mode 100644 index 6699b98c5..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeRequest.php +++ /dev/null @@ -1,92 +0,0 @@ -proto.gradido.ManageNodeRequest - */ -class ManageNodeRequest extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field .proto.gradido.SignatureMap sig_map = 1; - */ - private $sig_map = null; - /** - * ManageNodeBody - * - * Generated from protobuf field bytes body_bytes = 2; - */ - private $body_bytes = ''; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\SignatureMap $sig_map - * @type string $body_bytes - * ManageNodeBody - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\ManageNodeRequest::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field .proto.gradido.SignatureMap sig_map = 1; - * @return \Proto\Gradido\SignatureMap - */ - public function getSigMap() - { - return $this->sig_map; - } - - /** - * Generated from protobuf field .proto.gradido.SignatureMap sig_map = 1; - * @param \Proto\Gradido\SignatureMap $var - * @return $this - */ - public function setSigMap($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\SignatureMap::class); - $this->sig_map = $var; - - return $this; - } - - /** - * ManageNodeBody - * - * Generated from protobuf field bytes body_bytes = 2; - * @return string - */ - public function getBodyBytes() - { - return $this->body_bytes; - } - - /** - * ManageNodeBody - * - * Generated from protobuf field bytes body_bytes = 2; - * @param string $var - * @return $this - */ - public function setBodyBytes($var) - { - GPBUtil::checkString($var, False); - $this->body_bytes = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse.php b/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse.php deleted file mode 100644 index c7a4f80a5..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse.php +++ /dev/null @@ -1,85 +0,0 @@ -proto.gradido.ManageNodeResponse - */ -class ManageNodeResponse extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bool success = 1; - */ - private $success = false; - /** - * Generated from protobuf field .proto.gradido.ManageNodeResponse.ErrorCode error = 2; - */ - private $error = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type bool $success - * @type int $error - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\ManageNodeRequest::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bool success = 1; - * @return bool - */ - public function getSuccess() - { - return $this->success; - } - - /** - * Generated from protobuf field bool success = 1; - * @param bool $var - * @return $this - */ - public function setSuccess($var) - { - GPBUtil::checkBool($var); - $this->success = $var; - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.ManageNodeResponse.ErrorCode error = 2; - * @return int - */ - public function getError() - { - return $this->error; - } - - /** - * Generated from protobuf field .proto.gradido.ManageNodeResponse.ErrorCode error = 2; - * @param int $var - * @return $this - */ - public function setError($var) - { - GPBUtil::checkEnum($var, \Proto\Gradido\ManageNodeResponse_ErrorCode::class); - $this->error = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse/ErrorCode.php b/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse/ErrorCode.php deleted file mode 100644 index ab352829e..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse/ErrorCode.php +++ /dev/null @@ -1,61 +0,0 @@ -proto.gradido.ManageNodeResponse.ErrorCode - */ -class ErrorCode -{ - /** - * Generated from protobuf enum INVALID_BODY = 0; - */ - const INVALID_BODY = 0; - /** - * Generated from protobuf enum INVALID_SIGNATURE = 1; - */ - const INVALID_SIGNATURE = 1; - /** - * Generated from protobuf enum SIGNER_NOT_KNOWN = 2; - */ - const SIGNER_NOT_KNOWN = 2; - /** - * Generated from protobuf enum GROUP_ALIAS_ALREADY_EXIST = 3; - */ - const GROUP_ALIAS_ALREADY_EXIST = 3; - - private static $valueToName = [ - self::INVALID_BODY => 'INVALID_BODY', - self::INVALID_SIGNATURE => 'INVALID_SIGNATURE', - self::SIGNER_NOT_KNOWN => 'SIGNER_NOT_KNOWN', - self::GROUP_ALIAS_ALREADY_EXIST => 'GROUP_ALIAS_ALREADY_EXIST', - ]; - - public static function name($value) - { - if (!isset(self::$valueToName[$value])) { - throw new UnexpectedValueException(sprintf( - 'Enum %s has no name defined for value %s', __CLASS__, $value)); - } - return self::$valueToName[$value]; - } - - - public static function value($name) - { - $const = __CLASS__ . '::' . strtoupper($name); - if (!defined($const)) { - throw new UnexpectedValueException(sprintf( - 'Enum %s has no value defined for name %s', __CLASS__, $name)); - } - return constant($const); - } -} - -// Adding a class alias for backwards compatibility with the previous class name. -class_alias(ErrorCode::class, \Proto\Gradido\ManageNodeResponse_ErrorCode::class); - diff --git a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse_ErrorCode.php b/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse_ErrorCode.php deleted file mode 100644 index 8a7db7515..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/ManageNodeResponse_ErrorCode.php +++ /dev/null @@ -1,16 +0,0 @@ -proto.gradido.SignatureMap - */ -class SignatureMap extends \Google\Protobuf\Internal\Message -{ - /** - * Each signature pair corresponds to a unique Key required to sign the transaction. - * - * Generated from protobuf field repeated .proto.gradido.SignaturePair sigPair = 1; - */ - private $sigPair; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Proto\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $sigPair - * Each signature pair corresponds to a unique Key required to sign the transaction. - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Each signature pair corresponds to a unique Key required to sign the transaction. - * - * Generated from protobuf field repeated .proto.gradido.SignaturePair sigPair = 1; - * @return \Google\Protobuf\Internal\RepeatedField - */ - public function getSigPair() - { - return $this->sigPair; - } - - /** - * Each signature pair corresponds to a unique Key required to sign the transaction. - * - * Generated from protobuf field repeated .proto.gradido.SignaturePair sigPair = 1; - * @param \Proto\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $var - * @return $this - */ - public function setSigPair($var) - { - $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Proto\Gradido\SignaturePair::class); - $this->sigPair = $arr; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/SignaturePair.php b/community_server/src/Model/Messages/Proto/Gradido/SignaturePair.php deleted file mode 100644 index 2ef0e81c5..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/SignaturePair.php +++ /dev/null @@ -1,123 +0,0 @@ -proto.gradido.SignaturePair - */ -class SignaturePair extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bytes pubKey = 1; - */ - private $pubKey = ''; - protected $signature; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $pubKey - * @type string $ed25519 - * ed25519 signature (libsodium default) - * @type string $ed25519_ref10 - * ed25519 ref10 signature - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bytes pubKey = 1; - * @return string - */ - public function getPubKey() - { - return $this->pubKey; - } - - /** - * Generated from protobuf field bytes pubKey = 1; - * @param string $var - * @return $this - */ - public function setPubKey($var) - { - GPBUtil::checkString($var, False); - $this->pubKey = $var; - - return $this; - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @return string - */ - public function getEd25519() - { - return $this->readOneof(2); - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @param string $var - * @return $this - */ - public function setEd25519($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(2, $var); - - return $this; - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @return string - */ - public function getEd25519Ref10() - { - return $this->readOneof(3); - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @param string $var - * @return $this - */ - public function setEd25519Ref10($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * @return string - */ - public function getSignature() - { - return $this->whichOneof("signature"); - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/Timestamp.php b/community_server/src/Model/Messages/Proto/Gradido/Timestamp.php deleted file mode 100644 index ae3ecea0e..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/Timestamp.php +++ /dev/null @@ -1,101 +0,0 @@ -proto.gradido.Timestamp - */ -class Timestamp extends \Google\Protobuf\Internal\Message -{ - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - */ - private $seconds = 0; - /** - * Number of nanoseconds since the start of the last second - * - * Generated from protobuf field int32 nanos = 2; - */ - private $nanos = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $seconds - * Number of complete seconds since the start of the epoch - * @type int $nanos - * Number of nanoseconds since the start of the last second - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @return int|string - */ - public function getSeconds() - { - return $this->seconds; - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @param int|string $var - * @return $this - */ - public function setSeconds($var) - { - GPBUtil::checkInt64($var); - $this->seconds = $var; - - return $this; - } - - /** - * Number of nanoseconds since the start of the last second - * - * Generated from protobuf field int32 nanos = 2; - * @return int - */ - public function getNanos() - { - return $this->nanos; - } - - /** - * Number of nanoseconds since the start of the last second - * - * Generated from protobuf field int32 nanos = 2; - * @param int $var - * @return $this - */ - public function setNanos($var) - { - GPBUtil::checkInt32($var); - $this->nanos = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/TimestampSeconds.php b/community_server/src/Model/Messages/Proto/Gradido/TimestampSeconds.php deleted file mode 100644 index d31aa40d2..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/TimestampSeconds.php +++ /dev/null @@ -1,67 +0,0 @@ -proto.gradido.TimestampSeconds - */ -class TimestampSeconds extends \Google\Protobuf\Internal\Message -{ - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - */ - private $seconds = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $seconds - * Number of complete seconds since the start of the epoch - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @return int|string - */ - public function getSeconds() - { - return $this->seconds; - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @param int|string $var - * @return $this - */ - public function setSeconds($var) - { - GPBUtil::checkInt64($var); - $this->seconds = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/TransactionBody.php b/community_server/src/Model/Messages/Proto/Gradido/TransactionBody.php deleted file mode 100644 index b1ad01ea4..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/TransactionBody.php +++ /dev/null @@ -1,220 +0,0 @@ -proto.gradido.TransactionBody - */ -class TransactionBody extends \Google\Protobuf\Internal\Message -{ - /** - * max 150 chars - * - * Generated from protobuf field string memo = 1; - */ - private $memo = ''; - /** - * Generated from protobuf field .proto.gradido.TimestampSeconds created = 2; - */ - private $created = null; - /** - * Generated from protobuf field uint64 version_number = 3; - */ - private $version_number = 0; - protected $data; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $memo - * max 150 chars - * @type \Proto\Gradido\TimestampSeconds $created - * @type int|string $version_number - * @type \Proto\Gradido\GradidoTransfer $transfer - * @type \Proto\Gradido\GradidoCreation $creation - * @type \Proto\Gradido\GroupFriendsUpdate $group_friends_update - * @type \Proto\Gradido\GroupMemberUpdate $group_member_update - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\TransactionBody::initOnce(); - parent::__construct($data); - } - - /** - * max 150 chars - * - * Generated from protobuf field string memo = 1; - * @return string - */ - public function getMemo() - { - return $this->memo; - } - - /** - * max 150 chars - * - * Generated from protobuf field string memo = 1; - * @param string $var - * @return $this - */ - public function setMemo($var) - { - GPBUtil::checkString($var, True); - $this->memo = $var; - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.TimestampSeconds created = 2; - * @return \Proto\Gradido\TimestampSeconds - */ - public function getCreated() - { - return $this->created; - } - - /** - * Generated from protobuf field .proto.gradido.TimestampSeconds created = 2; - * @param \Proto\Gradido\TimestampSeconds $var - * @return $this - */ - public function setCreated($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\TimestampSeconds::class); - $this->created = $var; - - return $this; - } - - /** - * Generated from protobuf field uint64 version_number = 3; - * @return int|string - */ - public function getVersionNumber() - { - return $this->version_number; - } - - /** - * Generated from protobuf field uint64 version_number = 3; - * @param int|string $var - * @return $this - */ - public function setVersionNumber($var) - { - GPBUtil::checkUint64($var); - $this->version_number = $var; - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.GradidoTransfer transfer = 6; - * @return \Proto\Gradido\GradidoTransfer - */ - public function getTransfer() - { - return $this->readOneof(6); - } - - /** - * Generated from protobuf field .proto.gradido.GradidoTransfer transfer = 6; - * @param \Proto\Gradido\GradidoTransfer $var - * @return $this - */ - public function setTransfer($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\GradidoTransfer::class); - $this->writeOneof(6, $var); - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.GradidoCreation creation = 7; - * @return \Proto\Gradido\GradidoCreation - */ - public function getCreation() - { - return $this->readOneof(7); - } - - /** - * Generated from protobuf field .proto.gradido.GradidoCreation creation = 7; - * @param \Proto\Gradido\GradidoCreation $var - * @return $this - */ - public function setCreation($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\GradidoCreation::class); - $this->writeOneof(7, $var); - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.GroupFriendsUpdate group_friends_update = 8; - * @return \Proto\Gradido\GroupFriendsUpdate - */ - public function getGroupFriendsUpdate() - { - return $this->readOneof(8); - } - - /** - * Generated from protobuf field .proto.gradido.GroupFriendsUpdate group_friends_update = 8; - * @param \Proto\Gradido\GroupFriendsUpdate $var - * @return $this - */ - public function setGroupFriendsUpdate($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\GroupFriendsUpdate::class); - $this->writeOneof(8, $var); - - return $this; - } - - /** - * Generated from protobuf field .proto.gradido.GroupMemberUpdate group_member_update = 9; - * @return \Proto\Gradido\GroupMemberUpdate - */ - public function getGroupMemberUpdate() - { - return $this->readOneof(9); - } - - /** - * Generated from protobuf field .proto.gradido.GroupMemberUpdate group_member_update = 9; - * @param \Proto\Gradido\GroupMemberUpdate $var - * @return $this - */ - public function setGroupMemberUpdate($var) - { - GPBUtil::checkMessage($var, \Proto\Gradido\GroupMemberUpdate::class); - $this->writeOneof(9, $var); - - return $this; - } - - /** - * @return string - */ - public function getData() - { - return $this->whichOneof("data"); - } - -} - diff --git a/community_server/src/Model/Messages/Proto/Gradido/TransferAmount.php b/community_server/src/Model/Messages/Proto/Gradido/TransferAmount.php deleted file mode 100644 index 7673582fa..000000000 --- a/community_server/src/Model/Messages/Proto/Gradido/TransferAmount.php +++ /dev/null @@ -1,85 +0,0 @@ -proto.gradido.TransferAmount - */ -class TransferAmount extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bytes pubkey = 1; - */ - private $pubkey = ''; - /** - * Generated from protobuf field sint64 amount = 2; - */ - private $amount = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $pubkey - * @type int|string $amount - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Gradido\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bytes pubkey = 1; - * @return string - */ - public function getPubkey() - { - return $this->pubkey; - } - - /** - * Generated from protobuf field bytes pubkey = 1; - * @param string $var - * @return $this - */ - public function setPubkey($var) - { - GPBUtil::checkString($var, False); - $this->pubkey = $var; - - return $this; - } - - /** - * Generated from protobuf field sint64 amount = 2; - * @return int|string - */ - public function getAmount() - { - return $this->amount; - } - - /** - * Generated from protobuf field sint64 amount = 2; - * @param int|string $var - * @return $this - */ - public function setAmount($var) - { - GPBUtil::checkInt64($var); - $this->amount = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Navigation/NaviBreakLine.php b/community_server/src/Model/Navigation/NaviBreakLine.php deleted file mode 100644 index 79917db8c..000000000 --- a/community_server/src/Model/Navigation/NaviBreakLine.php +++ /dev/null @@ -1,16 +0,0 @@ -
    "; - } -} \ No newline at end of file diff --git a/community_server/src/Model/Navigation/NaviEntry.php b/community_server/src/Model/Navigation/NaviEntry.php deleted file mode 100644 index 2b02db9a8..000000000 --- a/community_server/src/Model/Navigation/NaviEntry.php +++ /dev/null @@ -1,89 +0,0 @@ -controller = $controller; - $this->action = $action; - $this->param = $param; - $this->iconClass = $iconClass; - if($active != null) { - $this->active = $active; - } else { - $this->active = ($GLOBALS["side"] == $controller && - $GLOBALS["subside"] == $action && - $GLOBALS["passed"] == $param); - } - $this->title = $title; - return $this; - } - - public function setIconColor($iconColorClass) { - $this->iconColor = $iconColorClass; - return $this; - } - public function setBGColor($bgColorClass) { - $this->bgColorClass = $bgColorClass; - return $this; - } - private function isActive() { - return $this->active; - } - - - - private function link() { - $self = $GLOBALS["self"]; - if($this->hasChilds()) { - return $self->Html->link( - $this->title.'', - ['controller' => $this->controller, "action" => $this->action, $this->param], - ['escape' => false] - ); - } else { - return $self->Html->Link( - ''. $this->iconClass .'' - .'' . $this->title . '', - ['controller' => $this->controller, 'action' => $this->action, $this->param], - ['class' => $this->bgColorClass, 'escape' => false]); - } - } - - public function __toString() { - $str = ""; - $str .= "hasChilds()) { $class .= "dropdown";} - if($this->isActive()) { $class .= " selected"; } - if(strlen($class) > 0 ) $str .= " class='$class'"; - $str .= ">"; - - $str .= $this->link(); - if($this->hasChilds()) { - $str .= ""; - } - $str .= ""; - return $str; - } -} \ No newline at end of file diff --git a/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php b/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php deleted file mode 100644 index 7d467ed69..000000000 --- a/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php +++ /dev/null @@ -1,92 +0,0 @@ -link = $link; - $this->iconClass = $iconClass; - if ($active != null) { - $this->active = $active; - } - $this->title = $title; - return $this; - } - - public function setIconColor($iconColorClass) - { - $this->iconColor = $iconColorClass; - return $this; - } - - public function setBGColor($bgColorClass) - { - $this->bgColorClass = $bgColorClass; - return $this; - } - - private function isActive() - { - return $this->active; - } - - protected function link() - { - $self = $GLOBALS["self"]; - if ($this->hasChilds()) { - return $self->Html->link( - $this->title.'', - ['controller' => $this->controller, "action" => $this->action, $this->param], - ['escape' => false] - ); - } else { - return '' - .''. $this->iconClass .'' - . '' . $this->title . '' - . ''; - } - } - - public function __toString() - { - $str = ""; - $str .= "hasChilds()) { - $class .= "dropdown"; - } - if ($this->isActive()) { - $class .= " selected"; - } - if (strlen($class) > 0) { - $str .= " class='$class'"; - } - $str .= ">"; - - $str .= $this->link(); - if ($this->hasChilds()) { - $str .= ""; - } - $str .= ""; - return $str; - } -} diff --git a/community_server/src/Model/Navigation/NaviEntryBase.php b/community_server/src/Model/Navigation/NaviEntryBase.php deleted file mode 100644 index ebb4e122f..000000000 --- a/community_server/src/Model/Navigation/NaviEntryBase.php +++ /dev/null @@ -1,31 +0,0 @@ -title = $title; - return $this; - } - - public function add($child) { - $child->isChild = true; - array_push($this->childs, $child); - return $this; - } - - protected function hasChilds() { - return count($this->childs) > 0; - } - -} diff --git a/community_server/src/Model/Navigation/NaviEntryExternLink.php b/community_server/src/Model/Navigation/NaviEntryExternLink.php deleted file mode 100644 index 8ace7fb4c..000000000 --- a/community_server/src/Model/Navigation/NaviEntryExternLink.php +++ /dev/null @@ -1,26 +0,0 @@ -link.'" class="' .$this->bgColorClass .'" target="_blank">' - .''. $this->iconClass .'' - . '' . $this->title . '' - . ''; - } -} diff --git a/community_server/src/Model/Navigation/NaviEntrySub.php b/community_server/src/Model/Navigation/NaviEntrySub.php deleted file mode 100644 index ae79aa433..000000000 --- a/community_server/src/Model/Navigation/NaviEntrySub.php +++ /dev/null @@ -1,105 +0,0 @@ -controller = $controller; - $this->action = $action; - $this->param = $param; - $this->iconClass = $iconClass; - if ($active != null) { - $this->active = $active; - } else { - $this->active = ($GLOBALS["side"] == $controller && - $GLOBALS["subside"] == $action && - $GLOBALS["passed"] == $param); - } - $this->title = $title; - $this->subtitle = $subtitle; - return $this; - } - - public function setIconColor($iconColorClass) - { - $this->iconColor = $iconColorClass; - return $this; - } - public function setBGColor($bgColorClass) - { - $this->bgColorClass = $bgColorClass; - return $this; - } - private function isActive() - { - return $this->active; - } - - private function link() - { - $self = $GLOBALS["self"]; - if ($this->hasChilds()) { - return $self->Html->link( - $this->title.'', - ['controller' => $this->controller, "action" => $this->action, $this->param], - ['escape' => false] - ); - } else { - return $self->Html->Link( - '' - .'' . $this->title . '' - .''. $this->iconClass .'', - ['controller' => $this->controller, 'action' => $this->action, $this->param], - ['class' => $this->bgColorClass, 'escape' => false] - ); - } - } - - public function __toString() - { - $str = ""; - $str .= "hasChilds()) { - $class .= "dropdown"; - } - if ($this->isActive()) { - $class .= " selected"; - } - if (strlen($class) > 0) { - $str .= " class='$class'"; - } - $str .= ">"; - - $str .= ''. $this->subtitle .''; - $str .= $this->link(); - - if ($this->hasChilds()) { - $str .= ""; - } - $str .= ""; - return $str; - } -} diff --git a/community_server/src/Model/Navigation/NaviHierarchy.php b/community_server/src/Model/Navigation/NaviHierarchy.php deleted file mode 100644 index 5017f8678..000000000 --- a/community_server/src/Model/Navigation/NaviHierarchy.php +++ /dev/null @@ -1,49 +0,0 @@ - -*/ -class NaviHierarchy implements \Countable -{ - private $hierarchy = []; - - public function add($entry) - { - array_push($this->hierarchy, $entry); - return $this; - } - public function getHierarchy() - { - return $this->hierarchy; - } - public function count() - { - return count($this->hierarchy); - } - public function __toString() - { - $html = ""; - return $html; - } -} diff --git a/community_server/src/Model/Navigation/NaviHierarchyEntry.php b/community_server/src/Model/Navigation/NaviHierarchyEntry.php deleted file mode 100644 index 5256518df..000000000 --- a/community_server/src/Model/Navigation/NaviHierarchyEntry.php +++ /dev/null @@ -1,53 +0,0 @@ - -*/ -class NaviHierarchyEntry -{ - private $name; - private $controller; - private $action; - public function __construct($name, $controller, $action, $isLast) - { - $this->name = $name; - $this->controller = $controller; - $this->action = $action; - $this->isLast = $isLast; - return $this; - } - private function link() - { - $self = $GLOBALS["self"]; - return $self->Html->Link( - '' . $this->name . '', - ['controller' => $this->controller, 'action' => $this->action], - ['class' => "", 'escape' => false] - ); - } - - public function __toString() - { - $str = "isLast){ - $str .= " class='selected'"; - } - $str .= ">"; - $str .= $this->link(); - $str .= ""; - return $str; - } -} diff --git a/community_server/src/Model/Navigation/TitleOnly.php b/community_server/src/Model/Navigation/TitleOnly.php deleted file mode 100644 index 39d7ac616..000000000 --- a/community_server/src/Model/Navigation/TitleOnly.php +++ /dev/null @@ -1,37 +0,0 @@ -title = $title; - } - - public function __toString() { - $str = ""; - $str .= "hasChilds()) { $class .= " dropdown";} - if(strlen($class) > 0 ) $str .= " class='$class'"; - $str .= ">"; - $hNumber = 1; - if($this->isChild) $hNumber = 3; - $str .= "" . $this->title . ""; - if($this->hasChilds()) { - $str .= ""; - } - $str .= ""; - return $str; - } -} diff --git a/community_server/src/Model/Table/AddressTypesTable.php b/community_server/src/Model/Table/AddressTypesTable.php deleted file mode 100644 index ba94c99c7..000000000 --- a/community_server/src/Model/Table/AddressTypesTable.php +++ /dev/null @@ -1,74 +0,0 @@ -setTable('address_types'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - - $this->hasMany('StateGroupAddresses', [ - 'foreignKey' => 'address_type_id', - ]); - $this->hasMany('TransactionGroupAddaddress', [ - 'foreignKey' => 'address_type_id', - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->nonNegativeInteger('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('name') - ->maxLength('name', 45) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - $validator - ->scalar('text') - ->maxLength('text', 255) - ->requirePresence('text', 'create') - ->notEmptyString('text'); - - return $validator; - } -} diff --git a/community_server/src/Model/Table/AdminErrorsTable.php b/community_server/src/Model/Table/AdminErrorsTable.php deleted file mode 100644 index e6263d8ff..000000000 --- a/community_server/src/Model/Table/AdminErrorsTable.php +++ /dev/null @@ -1,107 +0,0 @@ -setTable('admin_errors'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->addBehavior('Timestamp'); - - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('controller') - ->maxLength('controller', 255) - ->requirePresence('controller', 'create') - ->notEmptyString('controller'); - - $validator - ->scalar('action') - ->maxLength('action', 255) - ->requirePresence('action', 'create') - ->notEmptyString('action'); - - $validator - ->scalar('state') - ->maxLength('state', 255) - ->requirePresence('state', 'create') - ->notEmptyString('state'); - - $validator - ->scalar('msg') - ->maxLength('msg', 255) - ->requirePresence('msg', 'create') - ->notEmptyString('msg'); - - $validator - ->scalar('details') - ->maxLength('details', 255) - ->requirePresence('details', 'create') - ->notEmptyString('details'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/AppTable.php b/community_server/src/Model/Table/AppTable.php deleted file mode 100644 index a0758c97a..000000000 --- a/community_server/src/Model/Table/AppTable.php +++ /dev/null @@ -1,41 +0,0 @@ -getSchema()->truncateSql($this->getConnection()); - foreach ($truncateCommands as $truncateCommand) { - $this->getConnection()->query($truncateCommand); - } - $this->getConnection()->query('ALTER TABLE ' . $this->getSchema()->name() . ' AUTO_INCREMENT=1'); - return ['success' => true]; - } - public function saveManyWithErrors($entities) - { - $save_results = $this->saveMany($entities); - // save all at once failed, no try one by one to get error message - if($save_results === false) { - foreach($entities as $entity) { - if(!$this->save($entity)) { - return ['success' => false, 'errors' => $entity->getErrors()]; - } - } - } else { - return ['success' => true]; - } - } -} diff --git a/community_server/src/Model/Table/BlockchainTypesTable.php b/community_server/src/Model/Table/BlockchainTypesTable.php deleted file mode 100644 index 3aa67a83d..000000000 --- a/community_server/src/Model/Table/BlockchainTypesTable.php +++ /dev/null @@ -1,94 +0,0 @@ -setTable('blockchain_types'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->nonNegativeInteger('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('name') - ->maxLength('name', 45) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - $validator - ->scalar('text') - ->maxLength('text', 255) - ->allowEmptyString('text'); - - $validator - ->scalar('symbol') - ->maxLength('symbol', 10) - ->allowEmptyString('symbol'); - - return $validator; - } - - public function fillWithDefault() - { - $entry_contents = [ - [ - 'id' => 1, - 'name' => 'mysql', - 'text' => 'use mysql db as blockchain, work only with single community-server', - 'symbol' => NULL - ], - [ - 'id' => 2, - 'name' => 'hedera', - 'text' => 'use hedera for transactions', - 'symbol' => 'HBAR' - ] - ]; - $entities = $this->newEntities($entry_contents); - $this->truncate(); - $save_results = $this->saveManyWithErrors($entities); - if(!$save_results['success']) { - $save_results['msg'] = 'error by saving default transaction types'; - } - return $save_results; - - } -} diff --git a/community_server/src/Model/Table/CommunityProfilesTable.php b/community_server/src/Model/Table/CommunityProfilesTable.php deleted file mode 100644 index bbe862092..000000000 --- a/community_server/src/Model/Table/CommunityProfilesTable.php +++ /dev/null @@ -1,81 +0,0 @@ -setTable('community_profiles'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER', - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->allowEmptyFile('profile_img'); - - $validator - ->scalar('profile_desc') - ->maxLength('profile_desc', 2000) - ->allowEmptyFile('profile_desc'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/ElopageBuysTable.php b/community_server/src/Model/Table/ElopageBuysTable.php deleted file mode 100644 index a5279d920..000000000 --- a/community_server/src/Model/Table/ElopageBuysTable.php +++ /dev/null @@ -1,116 +0,0 @@ -setTable('elopage_buys'); - $this->setDisplayField('payer_email'); - $this->setPrimaryKey('id'); - - } - - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->integer('product_price') - ->requirePresence('product_price', 'create') - ->notEmptyString('product_price'); - - $validator - ->scalar('payer_email') - ->maxLength('payer_email', 255) - ->requirePresence('payer_email', 'create') - ->notEmptyString('payer_email'); - - $validator - ->scalar('publisher_email') - ->maxLength('publisher_email', 255) - ->requirePresence('publisher_email', 'create') - ->notEmptyString('publisher_email'); - - $validator - ->boolean('payed') - ->requirePresence('payed', 'create') - ->notEmptyString('payed'); - - $validator - ->dateTime('success_date') - ->requirePresence('success_date', 'create') - ->notEmptyDateTime('success_date'); - - $validator - ->scalar('event') - ->maxLength('event', 255) - ->requirePresence('event', 'create') - ->notEmptyString('event'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - - return $rules; - } - - /** - * Returns the database connection name to use by default. - * - * @return string - */ - public static function defaultConnectionName() - { - return 'loginServer'; - } -} diff --git a/community_server/src/Model/Table/OperatorTypesTable.php b/community_server/src/Model/Table/OperatorTypesTable.php deleted file mode 100644 index 8a3ce608c..000000000 --- a/community_server/src/Model/Table/OperatorTypesTable.php +++ /dev/null @@ -1,70 +0,0 @@ -setTable('operator_types'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - - $this->hasMany('Operators', [ - 'foreignKey' => 'operator_type_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('name') - ->maxLength('name', 25) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - $validator - ->scalar('text') - ->maxLength('text', 255) - ->requirePresence('text', 'create') - ->notEmptyString('text'); - - return $validator; - } -} diff --git a/community_server/src/Model/Table/OperatorsTable.php b/community_server/src/Model/Table/OperatorsTable.php deleted file mode 100644 index 7ae272767..000000000 --- a/community_server/src/Model/Table/OperatorsTable.php +++ /dev/null @@ -1,93 +0,0 @@ -setTable('operators'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - - $this->belongsTo('OperatorTypes', [ - 'foreignKey' => 'operator_type_id', - 'joinType' => 'INNER' - ]); - - $this->addBehavior('Timestamp'); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('username') - ->maxLength('username', 50) - ->requirePresence('username', 'create') - ->notEmptyString('username'); - //->add('usernamePasswordHash', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); - - $validator - ->requirePresence('user_pubkey', 'create') - ->notEmptyString('user_pubkey'); - - $validator - ->scalar('data_base64') - ->maxLength('data_base64', 255) - ->requirePresence('data_base64', 'create') - ->notEmptyString('data_base64'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - //$rules->add($rules->isUnique(['usernamePasswordHash'])); - $rules->add($rules->existsIn(['operator_type_id'], 'OperatorTypes')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/RolesTable.php b/community_server/src/Model/Table/RolesTable.php deleted file mode 100644 index 940b7f246..000000000 --- a/community_server/src/Model/Table/RolesTable.php +++ /dev/null @@ -1,72 +0,0 @@ -setTable('roles'); - $this->setDisplayField('title'); - $this->setPrimaryKey('id'); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create') - ->add('id', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); - - $validator - ->scalar('title') - ->maxLength('title', 255) - ->allowEmptyString('title'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->isUnique(['id'])); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/ServerUsersTable.php b/community_server/src/Model/Table/ServerUsersTable.php deleted file mode 100644 index 0ad1fbacb..000000000 --- a/community_server/src/Model/Table/ServerUsersTable.php +++ /dev/null @@ -1,101 +0,0 @@ -setTable('server_users'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->addBehavior('Timestamp'); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('username') - ->maxLength('username', 50) - ->requirePresence('username', 'create') - ->notEmptyString('username', __('Please give a username')); - - $validator - ->scalar('password') - ->maxLength('password', 255) - ->requirePresence('password', 'create') - ->notEmptyString('password', __('Please give a password')); - - $validator - ->email('email') - ->requirePresence('email', 'create') - ->notEmptyString('email', __('Please give a email')); - - $validator - ->scalar('role') - ->maxLength('role', 20) - ->notEmptyString('role'); - - $validator - ->boolean('activated') - ->notEmptyString('activated'); - - $validator - ->dateTime('last_login') - ->allowEmptyDateTime('last_login'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->isUnique(['username'])); - $rules->add($rules->isUnique(['email'])); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateBalancesTable.php b/community_server/src/Model/Table/StateBalancesTable.php deleted file mode 100644 index ff7a0aca2..000000000 --- a/community_server/src/Model/Table/StateBalancesTable.php +++ /dev/null @@ -1,325 +0,0 @@ -setTable('state_balances'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->addBehavior('Timestamp'); - - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - } - - public static function getDecayStartDateCached() - { - if(self::$startDecayDate == null) { - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - self::$startDecayDate = $transactionsTable->getDecayStartDate(); - } - return self::$startDecayDate; - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('amount', 'create') - ->notEmptyString('amount'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - - return $rules; - } - - public function calculateDecay($startBalance, FrozenTime $startDate, FrozenTime $endDate, $withInterval = false) - { - $decayStartDate = self::getDecayStartDateCached(); - // if no start decay block exist, we just return input - // if start date for decay is after enddate, we also just return input - if($decayStartDate === null || $decayStartDate >= $endDate) { - if($withInterval) { - return [ - 'balance' => $startBalance, - 'interval' => new \DateInterval('PT0S'), - 'start_date' => $startDate->getTimestamp(), - 'end_date' => $startDate->getTimestamp() - ]; - } else { - return $startBalance; - } - } - $state_balance = $this->newEntity(); - $state_balance->amount = $startBalance; - $interval = null; - // if decay start date is before start date we calculate decay for full duration - if($decayStartDate < $startDate) { - $state_balance->record_date = $startDate; - $interval = $endDate->diff($startDate); - } - // if decay start in between start date and end date we caculcate decay from decay start time to end date - else { - $state_balance->record_date = $decayStartDate; - $interval = $endDate->diff($decayStartDate); - } - $decay = $state_balance->partDecay($endDate); - if($withInterval) { - return [ - 'balance' => $decay, - 'interval' => $interval, - 'start_date' => $state_balance->record_date->getTimestamp(), - 'end_date' => $endDate->getTimestamp() - ]; - } else { - return $decay; - } - - - } - - public function updateAllBalances() - { - $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $state_users = $stateUserTable->find()->select(['id'])->contain([]); - foreach($state_users as $state_user) { - $result = $this->updateBalances($state_user->id); - if($result['success'] === false) { - $result['state_user_id'] = $state_user->id; - return $result; - } - } - return ['success' => true]; - } - - public function updateBalances($stateUserId) - { - $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - $now = new FrozenTime; - // info: cakephp use lazy loading, query will be executed later only if needed - $state_balances = $this->find('all')->where(['state_user_id' => $stateUserId]); - $state_user_transactions = $stateUserTransactionsTable - ->find() - ->where(['state_user_id' => $stateUserId]) - ->order(['balance_date ASC']) - //->contain(false); - ; - - if(!$state_user_transactions || !$state_user_transactions->count()) { - return ['success' => true]; - } - - // first: decide what todo - $create_state_balance = false; - $recalculate_state_user_transactions_balance = false; - $clear_state_balance = false; - $update_state_balance = false; - if($state_balances->count() == 0) { - $create_state_balance = true; - $recalculate_state_user_transactions_balance = true; - } - if($state_balances->count() > 1) { - $clear_state_balance = true; - $create_state_balance = true; - $recalculate_state_user_transactions_balance = true; - } - if($state_balances->count() == 1) { - if($state_user_transactions->count() == 0){ - $clear_state_balance = true; - } else { - - $first_state_balance = $state_balances->first(); - $first_state_balance_decayed = self::calculateDecay( - $first_state_balance->amount, - $first_state_balance->record_date, - $now); - - $last_state_user_transaction = $state_user_transactions->last(); - $last_state_user_transaction_decayed = self::calculateDecay( - $last_state_user_transaction->balance, - $last_state_user_transaction->balance_date, - $now); - // if entrys are nearly the same, we don't need doing anything - if(floor($last_state_user_transaction_decayed/100) !== floor($first_state_balance_decayed/100)) { - $recalculate_state_user_transactions_balance = true; - $update_state_balance = true; - } - } - } - - if(!$recalculate_state_user_transactions_balance) { - $last_state_user_transaction = $state_user_transactions->last(); - if($last_state_user_transaction && $last_state_user_transaction->balance <= 0) { - $recalculate_state_user_transactions_balance = true; - if(!$create_state_balance) { - $update_state_balance = true; - } - } else if(!$last_state_user_transaction) { - - $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations'); - $creationTransactions = $creationsTable - ->find('all') - ->where(['state_user_id' => $stateUserId]) - ->contain(false); - - $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); - $transferTransactions = $transferTable - ->find('all') - ->where(['OR' => ['state_user_id' => $stateUserId, 'receiver_user_id' => $stateUserId]]) - ->contain(false); - if($creationTransactions->count() > 0 || $transferTransactions->count() > 0) { - return ['success' => false, 'error' => 'state_user_transactions is empty but it exist transactions for user']; - } - } - } - // second: do what is needed - if($clear_state_balance) { - $this->deleteAll(['state_user_id' => $stateUserId]); - } - - $transaction_ids = []; - if($recalculate_state_user_transactions_balance) { - - $state_user_transactions_array = $state_user_transactions->toArray(); - foreach($state_user_transactions_array as $i => $state_user_transaction) { - $transaction_ids[$state_user_transaction->transaction_id] = $i; - } - - $transactions = $transactionsTable - ->find('all') - ->where(['Transactions.id IN' => array_keys($transaction_ids)]) - ->contain(['TransactionCreations', 'TransactionSendCoins']); - - $transactions_indiced = []; - foreach($transactions as $transaction) { - $transactions_indiced[$transaction->id] = $transaction; - } - $balance_cursor = $this->newEntity(); - $i = 0; - foreach($state_user_transactions_array as $state_user_transaction) { - $transaction = $transactions_indiced[$state_user_transaction->transaction_id]; - if($transaction->transaction_type_id > 2) { - continue; - } - $amount = 0; - - if($transaction->transaction_type_id == 1) { // creation - $amount = intval($transaction->transaction_creation->amount); - } else if($transaction->transaction_type_id == 2) { // transfer - $temp = $transaction->transaction_send_coin; - $amount = intval($temp->amount); - // reverse if sender - if($stateUserId == $temp->state_user_id) { - $amount *= -1.0; - } - } - $amount_date = $transaction->received; - if($i == 0) { - $balance_cursor->amount = $amount; - } else { - - //$balance_cursor->amount = $balance_cursor->partDecay($amount_date) + $amount; - $balance_cursor->amount = - $this->calculateDecay($balance_cursor->amount, $balance_cursor->record_date, $amount_date) - + $amount; - } - //echo "new balance: " . $balance_cursor->amount . "
    "; - - $balance_cursor->record_date = $amount_date; - $state_user_transaction_index = $transaction_ids[$transaction->id]; - $state_user_transactions_array[$state_user_transaction_index]->balance = $balance_cursor->amount; - $state_user_transactions_array[$state_user_transaction_index]->balance_date = $balance_cursor->record_date; - $i++; - - } - - $results = $stateUserTransactionsTable->saveMany($state_user_transactions_array); - $errors = []; - foreach($results as $i => $result) { - if(!$result) { - $errors[$i] = $state_user_transactions_array[$i]->getErrors(); - } - } - if(count($errors)) { - return ['success' => false, 'error' => 'error saving one ore more state user transactions', 'details' => $errors]; - } - } - $state_balance = null; - if($update_state_balance) { - $state_balance = $state_balances->first(); - } - else if($create_state_balance) { - $state_balance = $this->newEntity(); - $state_balance->state_user_id = $stateUserId; - } - if($state_balance) { - $state_balance->amount = $state_user_transactions->last()->balance; - $state_balance->record_date = $state_user_transactions->last()->balance_date; - if(!$this->save($state_balance)) { - return ['success' => false, 'error' => 'error saving state balance', 'details' => $state_balance->getErrors()]; - } - } - return ['success' => true]; - - } - -} diff --git a/community_server/src/Model/Table/StateCreatedTable.php b/community_server/src/Model/Table/StateCreatedTable.php deleted file mode 100644 index c97851f28..000000000 --- a/community_server/src/Model/Table/StateCreatedTable.php +++ /dev/null @@ -1,96 +0,0 @@ -setTable('state_created'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->addBehavior('Timestamp'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('month', 'create') - ->notEmptyString('month'); - - $validator - ->requirePresence('year', 'create') - ->notEmptyString('year'); - - $validator - ->integer('short_ident_hash') - ->requirePresence('short_ident_hash', 'create') - ->notEmptyString('short_ident_hash'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateErrorsTable.php b/community_server/src/Model/Table/StateErrorsTable.php deleted file mode 100644 index 62893b7bf..000000000 --- a/community_server/src/Model/Table/StateErrorsTable.php +++ /dev/null @@ -1,88 +0,0 @@ -setTable('state_errors'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->addBehavior('Timestamp'); - - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('TransactionTypes', [ - 'foreignKey' => 'transaction_type_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('message_json') - ->requirePresence('message_json', 'create') - ->notEmptyString('message_json'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateGroupAddressesTable.php b/community_server/src/Model/Table/StateGroupAddressesTable.php deleted file mode 100644 index a63e2ae1c..000000000 --- a/community_server/src/Model/Table/StateGroupAddressesTable.php +++ /dev/null @@ -1,85 +0,0 @@ -setTable('state_group_addresses'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - /*$this->belongsTo('Groups', [ - 'foreignKey' => 'group_id', - 'joinType' => 'INNER', - ]);*/ - $this->belongsTo('AddressTypes', [ - 'foreignKey' => 'address_type_id', - 'joinType' => 'INNER', - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->nonNegativeInteger('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('public_key', 'create') - ->notEmptyString('public_key') - ->add('public_key', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->isUnique(['public_key'])); - //$rules->add($rules->existsIn(['group_id'], 'Groups')); - $rules->add($rules->existsIn(['address_type_id'], 'AddressTypes')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateGroupRelationshipsTable.php b/community_server/src/Model/Table/StateGroupRelationshipsTable.php deleted file mode 100644 index 449561583..000000000 --- a/community_server/src/Model/Table/StateGroupRelationshipsTable.php +++ /dev/null @@ -1,85 +0,0 @@ -setTable('state_group_relationships'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('StateGroup1s', [ - 'foreignKey' => 'state_group1_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateGroup2s', [ - 'foreignKey' => 'state_group2_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateRelationships', [ - 'foreignKey' => 'state_relationship_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_group1_id'], 'StateGroup1s')); - $rules->add($rules->existsIn(['state_group2_id'], 'StateGroup2s')); - $rules->add($rules->existsIn(['state_relationship_id'], 'StateRelationships')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateGroupsTable.php b/community_server/src/Model/Table/StateGroupsTable.php deleted file mode 100644 index 49911d495..000000000 --- a/community_server/src/Model/Table/StateGroupsTable.php +++ /dev/null @@ -1,102 +0,0 @@ -setTable('state_groups'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Indices', [ - 'foreignKey' => 'index_id', - 'joinType' => 'INNER' - ]); - $this->hasMany('StateGroupAddresses', [ - 'foreignKey' => 'state_group_id' - ]); - $this->hasMany('StateUsers', [ - 'foreignKey' => 'state_group_id' - ]); - $this->hasMany('TransactionGroupCreates', [ - 'foreignKey' => 'state_group_id' - ]); - $this->hasMany('Transactions', [ - 'foreignKey' => 'state_group_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('name') - ->maxLength('name', 50) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - $validator - ->requirePresence('root_public_key', 'create') - ->notEmptyString('root_public_key'); - - $validator - ->notEmptyString('user_count'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['index_id'], 'Indices')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateRelationshipTypesTable.php b/community_server/src/Model/Table/StateRelationshipTypesTable.php deleted file mode 100644 index a18e7ce51..000000000 --- a/community_server/src/Model/Table/StateRelationshipTypesTable.php +++ /dev/null @@ -1,63 +0,0 @@ -setTable('state_relationship_types'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('name') - ->maxLength('name', 25) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - $validator - ->scalar('text') - ->maxLength('text', 255) - ->allowEmptyString('text'); - - return $validator; - } -} diff --git a/community_server/src/Model/Table/StateUserRolesTable.php b/community_server/src/Model/Table/StateUserRolesTable.php deleted file mode 100644 index 895e788b2..000000000 --- a/community_server/src/Model/Table/StateUserRolesTable.php +++ /dev/null @@ -1,86 +0,0 @@ -setTable('state_user_roles'); - $this->setPrimaryKey('id'); - - - $this->belongsTo('StateUser', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - - $this->belongsTo('Role', [ - 'foreignKey' => 'role_id', - 'joinType' => 'INNER' - ]); - - - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - // $rules->add($rules->existsIn(['index_id'], 'Indices')); - //$rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); - - return $rules; - } - - -} diff --git a/community_server/src/Model/Table/StateUserTransactionsTable.php b/community_server/src/Model/Table/StateUserTransactionsTable.php deleted file mode 100644 index 2c984d964..000000000 --- a/community_server/src/Model/Table/StateUserTransactionsTable.php +++ /dev/null @@ -1,85 +0,0 @@ -setTable('state_user_transactions'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER', - ]); - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER', - ]); - $this->belongsTo('TransactionTypes', [ - 'foreignKey' => 'transaction_type_id', - 'joinType' => 'INNER', - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->nonNegativeInteger('id') - ->allowEmptyString('id', null, 'create'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/StateUsersTable.php b/community_server/src/Model/Table/StateUsersTable.php deleted file mode 100644 index 5b01609f3..000000000 --- a/community_server/src/Model/Table/StateUsersTable.php +++ /dev/null @@ -1,136 +0,0 @@ -setTable('state_users'); - $this->setDisplayField('email'); - $this->setPrimaryKey('id'); - - /*$this->belongsTo('Indices', [ - 'foreignKey' => 'index_id', - 'joinType' => 'INNER' - ]);*/ - $this->belongsTo('StateGroups', [ - 'foreignKey' => 'state_group_id', - 'joinType' => 'INNER' - ]); - $this->hasMany('StateBalances', [ - 'foreignKey' => 'state_user_id' - ]); - $this->hasMany('StateCreated', [ - 'foreignKey' => 'state_user_id' - ]); - $this->hasMany('TransactionCreations', [ - 'foreignKey' => 'state_user_id' - ]); - $this->hasMany('TransactionSendCoins', [ - 'foreignKey' => 'state_user_id' - ]); - $this->hasMany('TransactionReceivedCoins', [ - 'className' => 'TransactionSendCoins', - 'foreignKey' => 'receiver_user_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('public_key', 'create') - ->notEmptyString('public_key'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - // $rules->add($rules->existsIn(['index_id'], 'Indices')); - //$rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); - - return $rules; - } - - public function getReceiverProposal() { - $stateUsers = $this->find('all'); - $receiverProposal = []; - foreach($stateUsers as $stateUser) { - $name = $stateUser->email; - $keyHex = bin2hex(stream_get_contents($stateUser->public_key)); - if($name === NULL) { - $name = $stateUser->first_name . ' ' . $stateUser->last_name; - } - array_push($receiverProposal, ['name' => $name, 'key' => $keyHex]); - //$stateUser->public_key - } - return $receiverProposal; - } - - public function getUsersIndiced($user_ids) - { - $involvedUser_temp = array_flip($user_ids); - // exchange back - $involvedUserIds = array_flip($involvedUser_temp); - $involvedUser = $this->find('all', [ - 'contain' => [], - 'where' => ['id IN' => $involvedUserIds], - 'fields' => ['id', 'first_name', 'last_name', 'email'], - ]); - //var_dump($involvedUser->toArray()); - $involvedUserIndices = []; - foreach ($involvedUser as $involvedUser) { - $involvedUserIndices[$involvedUser->id] = $involvedUser; - } - return $involvedUserIndices; - } -} diff --git a/community_server/src/Model/Table/TransactionCreationsTable.php b/community_server/src/Model/Table/TransactionCreationsTable.php deleted file mode 100644 index bc9592ccf..000000000 --- a/community_server/src/Model/Table/TransactionCreationsTable.php +++ /dev/null @@ -1,89 +0,0 @@ -setTable('transaction_creations'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('amount', 'create') - ->notEmptyString('amount'); - - $validator - //->requirePresence('ident_hash', 'create') - //->notEmptyString('ident_hash'); - ->allowEmptyString('ident_hash', null, 'create'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - $rules->add($rules->existsIn(['receiver_user_id'], 'StateUsers')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/TransactionGroupAddaddressTable.php b/community_server/src/Model/Table/TransactionGroupAddaddressTable.php deleted file mode 100644 index cb9912083..000000000 --- a/community_server/src/Model/Table/TransactionGroupAddaddressTable.php +++ /dev/null @@ -1,88 +0,0 @@ -setTable('transaction_group_addaddress'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('AddressTypes', [ - 'foreignKey' => 'address_type_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('public_key', 'create') - ->notEmptyString('public_key'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['address_type_id'], 'AddressTypes')); - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php b/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php deleted file mode 100644 index 463d1af8e..000000000 --- a/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php +++ /dev/null @@ -1,83 +0,0 @@ -setTable('transaction_group_allowtrades'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('Groups', [ - 'foreignKey' => 'group_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->boolean('allow') - ->notEmptyString('allow'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['group_id'], 'Groups')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/TransactionGroupCreatesTable.php b/community_server/src/Model/Table/TransactionGroupCreatesTable.php deleted file mode 100644 index 263182b8e..000000000 --- a/community_server/src/Model/Table/TransactionGroupCreatesTable.php +++ /dev/null @@ -1,89 +0,0 @@ -setTable('transaction_group_creates'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateGroups', [ - 'foreignKey' => 'state_group_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('group_public_key', 'create') - ->notEmptyString('group_public_key'); - - $validator - ->scalar('name') - ->maxLength('name', 64) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/TransactionSendCoinsTable.php b/community_server/src/Model/Table/TransactionSendCoinsTable.php deleted file mode 100644 index c1530e908..000000000 --- a/community_server/src/Model/Table/TransactionSendCoinsTable.php +++ /dev/null @@ -1,102 +0,0 @@ -setTable('transaction_send_coins'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('StateUsers', [ - 'foreignKey' => 'state_user_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('ReceiverUsers', [ - 'className' => 'StateUsers', - 'foreignKey' => 'receiver_user_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('sender_public_key', 'create') - ->notEmptyString('sender_public_key'); - - $validator - ->requirePresence('receiver_public_key', 'create') - ->notEmptyString('receiver_public_key'); - - $validator - ->requirePresence('amount', 'create') - ->notEmptyString('amount'); - - $validator - ->requirePresence('sender_final_balance', 'create') - ->notEmptyString('sender_final_balance'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - $rules->add($rules->existsIn(['state_user_id'], 'StateUsers')); - $rules->add($rules->existsIn(['receiver_user_id'], 'ReceiverUsers')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/TransactionSignaturesTable.php b/community_server/src/Model/Table/TransactionSignaturesTable.php deleted file mode 100644 index 60c1ae99f..000000000 --- a/community_server/src/Model/Table/TransactionSignaturesTable.php +++ /dev/null @@ -1,81 +0,0 @@ -setTable('transaction_signatures'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('Transactions', [ - 'foreignKey' => 'transaction_id', - 'joinType' => 'INNER' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->requirePresence('signature', 'create') - ->notEmptyString('signature'); - - $validator - ->requirePresence('pubkey', 'create') - ->notEmptyString('pubkey'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['transaction_id'], 'Transactions')); - - return $rules; - } -} diff --git a/community_server/src/Model/Table/TransactionTypesTable.php b/community_server/src/Model/Table/TransactionTypesTable.php deleted file mode 100644 index 2ffd1e64c..000000000 --- a/community_server/src/Model/Table/TransactionTypesTable.php +++ /dev/null @@ -1,120 +0,0 @@ -setTable('transaction_types'); - $this->setDisplayField('name'); - $this->setPrimaryKey('id'); - - $this->hasMany('Transactions', [ - 'foreignKey' => 'transaction_type_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->scalar('name') - ->maxLength('name', 45) - ->requirePresence('name', 'create') - ->notEmptyString('name'); - - $validator - ->scalar('text') - ->maxLength('text', 255) - ->allowEmptyString('text'); - - return $validator; - } - - public function fillWithDefault() - { - - $entry_contents = [ - [ - 'id' => 1, - 'name' => 'creation', - 'text' => 'create new gradidos for member and also for group (in development)', - ], [ - 'id' => 2, - 'name' => 'transfer', - 'text' => 'send gradidos from one member to another, also cross group transfer', - ], [ - 'id' => 3, - 'name' => 'group create', - 'text' => 'create a new group, trigger creation of new hedera topic and new blockchain on node server' - ], [ - 'id' => 4, - 'name' => 'group add member', - 'text' => 'add user to a group or move if he was already in a group' - ], [ - 'id' => 5, - 'name' => 'group remove member', - 'text' => 'remove user from group, maybe he was moved elsewhere' - ],[ - 'id' => 6, - 'name' => 'hedera topic create', - 'text' => 'create new topic on hedera' - ],[ - 'id' => 7, - 'name' => 'hedera topic send message', - 'text' => 'send consensus message over hedera topic' - ],[ - 'id' => 8, - 'name' => 'hedera account create', - 'text' => 'create new account on hedera for holding some founds with unencrypted keys' - ],[ - 'id' => 9, - 'name' => 'decay start', - 'text' => 'signalize the starting point for decay calculation, allowed only once per chain' - ] - ]; - $entities = $this->newEntities($entry_contents); - $this->truncate(); - $save_results = $this->saveManyWithErrors($entities); - if(!$save_results['success']) { - $save_results['msg'] = 'error by saving default transaction types'; - } - return $save_results; - } -} diff --git a/community_server/src/Model/Table/TransactionsTable.php b/community_server/src/Model/Table/TransactionsTable.php deleted file mode 100644 index 1f8606a82..000000000 --- a/community_server/src/Model/Table/TransactionsTable.php +++ /dev/null @@ -1,469 +0,0 @@ -setTable('transactions'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->belongsTo('StateGroups', [ - 'foreignKey' => 'state_group_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('TransactionTypes', [ - 'foreignKey' => 'transaction_type_id', - 'joinType' => 'INNER' - ]); - $this->belongsTo('BlockchainTypes', [ - 'foreignKey' => 'blockchain_type_id', - 'joinType' => 'INNER' - ]); - $this->hasMany('StateCreated', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasOne('TransactionCreations', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasOne('TransactionGroupAddaddress', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasOne('TransactionGroupAllowtrades', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasOne('TransactionGroupCreates', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasOne('TransactionSendCoins', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasMany('TransactionSignatures', [ - 'foreignKey' => 'transaction_id' - ]); - $this->hasMany('StateUserTransactions', [ - 'foreignKey' => 'transaction_id' - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->allowEmptyString('id', null, 'create'); - - $validator - //->requirePresence('tx_hash', 'create') - ->allowEmptyString('tx_hash', null, 'create'); - - $validator - ->allowEmptyString('memo', null, 'create'); - - $validator - ->dateTime('received') - ->notEmptyDateTime('received'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->existsIn(['state_group_id'], 'StateGroups')); - $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes')); - $rules->add($rules->existsIn(['blockchain_type_id'], 'BlockchainTypes')); - - return $rules; - } - - public function sortTransactions($a, $b) - { - if ($a['date'] == $b['date']) { - return 0; - } - return ($a['date'] > $b['date']) ? -1 : 1; - } - - - public function listTransactionsHumanReadable($stateUserTransactions, array $user, $decay = true, $skip_first_transaction = false) - { - - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - $stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances'); - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - - $transaction_ids = []; - $involved_user_ids = []; - $stateUserTransactionsCount = 0; - foreach($stateUserTransactions as $su_transaction) { - $transaction_ids[] = $su_transaction->transaction_id; - $involved_user_ids[] = $su_transaction->state_user_id; - $stateUserTransactionsCount++; - } - - $involved_users = $stateUsersTable->getUsersIndiced($involved_user_ids); - - $transactions = $this - ->find() - ->where(['Transactions.id IN' => $transaction_ids]) - ->contain(['TransactionSendCoins', 'TransactionCreations']) - ; - $transaction_indiced = []; - foreach($transactions as $tr) { - $transaction_indiced[$tr->id] = $tr; - } - - $state_balance = $stateBalancesTable->newEntity(); - $final_transactions = []; - $decay_start_transaction = $transactionsTable->find()->where(['transaction_type_id' => 9]); - $decay_start_transaction_id = 0; - if($decay_start_transaction->count()) { - $decay_start_transaction_id = $decay_start_transaction->first()->id; - } - $decay_start_date = $stateBalancesTable->getDecayStartDateCached(); - $decay_start_time = 0; - if($decay_start_date) { - $decay_start_time = $decay_start_date->getTimestamp(); - } - - foreach($stateUserTransactions as $i => $su_transaction) - { - // sender or receiver when user has sended money - // group name if creation - // type: gesendet / empfangen / geschöpft - // transaktion nr / id - // date - // balance - $transaction = $transaction_indiced[$su_transaction->transaction_id]; - - $final_transaction = [ - 'transaction_id' => $transaction->id, - 'date' => $transaction->received, - 'memo' => $transaction->memo - ]; - - $prev = null; - if($i > 0 ) { - $prev = $stateUserTransactions[$i-1]; - } - if($prev) - { - if($prev->balance > 0) - { - $current = $su_transaction; - $calculated_decay = $stateBalancesTable->calculateDecay($prev->balance, $prev->balance_date, $current->balance_date, true); - $balance = floatval($prev->balance - $calculated_decay['balance']); - - if($balance) - { - $final_transaction['decay'] = [ - 'balance' => $balance, - 'decay_duration' => $calculated_decay['interval']->format('%a days, %H hours, %I minutes, %S seconds'), - 'decay_start' => $calculated_decay['start_date'], - 'decay_end' => $calculated_decay['end_date'] - ]; - if($decay_start_time && $prev->transaction_id < $decay_start_transaction_id && - $current->transaction_id > $decay_start_transaction_id) { - $final_transaction['decay']['decay_start_block'] = $decay_start_time; - } - // hint: use transaction id - /*if($calculated_decay['start_date'] < $decay_start_time && $calculated_decay['end_date'] > $decay_start_time) { - $final_transaction['decay']['decay_start_block'] = $decay_start_time; - } else { - echo "start block: " . $decay_start_time . "
    "; - echo "start date: " . $calculated_decay['start_date'] . "
    "; - echo "end date: " . $calculated_decay['end_date']. "
    "; - }*/ - } - } - } - - // sender or receiver when user has sended money - // group name if creation - // type: gesendet / empfangen / geschöpft - // transaktion nr / id - // date - // balance - $transaction = $transaction_indiced[$su_transaction->transaction_id]; - - if($su_transaction->transaction_type_id == 1) { // creation - $creation = $transaction->transaction_creation; - - $final_transaction['name'] = 'Gradido Akademie'; - $final_transaction['type'] = 'creation'; - $final_transaction['target_date'] = $creation->target_date; - //$final_transaction['creation_amount'] = $creation->amount; - $final_transaction['balance'] = $creation->amount; - - } else if($su_transaction->transaction_type_id == 2) { // transfer or send coins - $sendCoins = $transaction->transaction_send_coin; - $otherUser = null; - $final_transaction['balance'] = $sendCoins->amount; - $other_user_public = ''; - if ($sendCoins->state_user_id == $user['id']) { - $final_transaction['type'] = 'send'; - - if(isset($involved_users[$sendCoins->receiver_user_id])) { - $otherUser = $involved_users[$sendCoins->receiver_user_id]; - } - $final_transaction['pubkey'] = bin2hex(stream_get_contents($sendCoins->receiver_public_key)); - } else if ($sendCoins->receiver_user_id == $user['id']) { - $final_transaction['type'] = 'receive'; - if(isset($involved_users[$sendCoins->state_user_id])) { - $otherUser = $involved_users[$sendCoins->state_user_id]; - } - if($sendCoins->sender_public_key) { - $final_transaction['pubkey'] = bin2hex(stream_get_contents($sendCoins->sender_public_key)); - } - } - if(null == $otherUser) { - $otherUser = $stateUsersTable->newEntity(); - } - $final_transaction['name'] = $otherUser->first_name . ' ' . $otherUser->last_name; - $final_transaction['email'] = $otherUser->email; - } - if($i > 0 || !$skip_first_transaction) { - $final_transactions[] = $final_transaction; - } - - if($i == $stateUserTransactionsCount-1 && $decay) { - $now = new FrozenTime(); - $calculated_decay = $stateBalancesTable->calculateDecay( - $su_transaction->balance, - $su_transaction->balance_date, $now, true); - $decay_start_date = $stateBalancesTable->getDecayStartDateCached(); - $duration = $su_transaction->balance_date->timeAgoInWords(); - if($decay_start_date > $su_transaction->balance_date) { - $duration = $decay_start_date->timeAgoInWords(); - } - $balance = floatval($su_transaction->balance - $calculated_decay['balance']); - if($balance) { - $final_transactions[] = [ - 'type' => 'decay', - 'balance' => $balance, - 'decay_duration' => $duration, - 'decay_start' => $calculated_decay['start_date'], - 'decay_end' => $calculated_decay['end_date'], - 'memo' => '' - ]; - } - } - } - - return $final_transactions; - - } - - public function updateTxHash($transaction, $signatureMapString) - { - $transaction_id = $transaction->id; - $previousTxHash = null; - if($transaction_id > 1) { - try { - $previousTransaction = $this - ->find('all', ['contain' => false]) - ->select(['tx_hash']) - ->where(['id' => $transaction_id - 1]) - ->first(); - /*$previousTransaction = $transactionsTable->get($this->mTransactionID - 1, [ - 'contain' => false, - 'fields' => ['tx_hash'] - ]);*/ - } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) { - return ['state' => 'error', 'msg' => 'previous transaction not found', 'details' => $ex->getMessage()]; - } - if(!$previousTransaction) { - // shouldn't occur - return ['state' => 'error', 'msg' => 'previous transaction not found']; - } - $previousTxHash = $previousTransaction->tx_hash; - } - try { - //$transactionEntity->received = $transactionsTable->get($transactionEntity->id, ['contain' => false, 'fields' => ['received']])->received; - $transaction->received = $this - ->find('all', ['contain' => false]) - ->where(['id' => $transaction->id]) - ->select(['received'])->first()->received; - } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) { - return ['state' => 'error', 'msg' => 'current transaction not found in db', 'details' => $ex->getMessage()]; - } - - // calculate tx hash - // previous tx hash + id + received + sigMap as string - // Sodium use for the generichash function BLAKE2b today (11.11.2019), mabye change in the future - $state = \Sodium\crypto_generichash_init(); - //echo "prev hash: $previousTxHash\n"; - if($previousTxHash != null) { - \Sodium\crypto_generichash_update($state, stream_get_contents($previousTxHash)); - } - //echo "id: " . $transactionEntity->id . "\n"; - \Sodium\crypto_generichash_update($state, strval($transaction->id)); - //echo "received: " . $transactionEntity->received; - \Sodium\crypto_generichash_update($state, $transaction->received->i18nFormat('yyyy-MM-dd HH:mm:ss')); - \Sodium\crypto_generichash_update($state, $signatureMapString); - $transaction->tx_hash = \Sodium\crypto_generichash_final($state); - if ($this->save($transaction)) { - return true; - } - return ['state' => 'error', 'msg' => 'error by saving transaction', 'details' => $transaction->getErrors()]; - } - - /*! - * @return: false if no decay start block found - * @return: DateTime Object with start date if one start block found - * @return: ['state':'error'] if more than one found - */ - public function getDecayStartDate() - { - $transaction = $this->find()->where(['transaction_type_id' => 9])->select(['received'])->order(['received' => 'ASC']); - if($transaction->count() == 0) { - return null; - } - return $transaction->first()->received; - } - - public function fillStateUserTransactions() - { - $missing_transaction_ids = []; - $transaction_ids = $this - ->find('all') - ->select(['id', 'transaction_type_id']) - ->order(['id']) - ->where(['transaction_type_id <' => 6]) - ->all() - ; - $state_user_transaction_ids = $this->StateUserTransactions - ->find('all') - ->select(['transaction_id']) - ->group(['transaction_id']) - ->order(['transaction_id']) - ->toArray() - ; - $i2 = 0; - $count = count($state_user_transaction_ids); - foreach($transaction_ids as $tr_id) { - //echo "$i1: "; - if($i2 >= $count) { - $missing_transaction_ids[] = $tr_id; - //echo "adding to missing: $tr_id, continue
    "; - continue; - } - $stu_id = $state_user_transaction_ids[$i2]; - if($tr_id->id == $stu_id->transaction_id) { - $i2++; - //echo "after i2++: $i2
    "; - } else if($tr_id->id < $stu_id->transaction_id) { - $missing_transaction_ids[] = $tr_id; - //echo "adding to missing: $tr_id
    "; - } - } - - - $tablesForType = [ - 1 => $this->TransactionCreations, - 2 => $this->TransactionSendCoins, - 3 => $this->TransactionGroupCreates, - 4 => $this->TransactionGroupAddaddress, - 5 => $this->TransactionGroupAddaddress - ]; - $idsForType = []; - foreach($missing_transaction_ids as $i => $transaction) { - if(!isset($idsForType[$transaction->transaction_type_id])) { - $idsForType[$transaction->transaction_type_id] = []; - } - $idsForType[$transaction->transaction_type_id][] = $transaction->id; - } - $entities = []; - $state_user_ids = []; - foreach($idsForType as $type_id => $transaction_ids) { - $specific_transactions = $tablesForType[$type_id]->find('all')->where(['transaction_id IN' => $transaction_ids])->toArray(); - $keys = $tablesForType[$type_id]->getSchema()->columns(); - //var_dump($keys); - foreach($specific_transactions as $specific) { - - foreach($keys as $key) { - if(preg_match('/_user_id/', $key)) { - $entity = $this->StateUserTransactions->newEntity(); - $entity->transaction_id = $specific['transaction_id']; - $entity->transaction_type_id = $type_id; - $entity->state_user_id = $specific[$key]; - if(!in_array($entity->state_user_id, $state_user_ids)) { - array_push($state_user_ids, $entity->state_user_id); - } - $entities[] = $entity; - } - } - } - } - if(count($state_user_ids) < 1) { - return ['success' => true]; - } - //var_dump($entities); - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - $existingStateUsers = $stateUsersTable->find('all')->select(['id'])->where(['id IN' => $state_user_ids])->order(['id'])->all(); - $existing_state_user_ids = []; - $finalEntities = []; - foreach($existingStateUsers as $stateUser) { - $existing_state_user_ids[] = $stateUser->id; - } - foreach($entities as $entity) { - if(in_array($entity->state_user_id, $existing_state_user_ids)) { - array_push($finalEntities, $entity); - } - } - - $save_results = $this->StateUserTransactions->saveManyWithErrors($finalEntities); - if(!$save_results['success']) { - $save_results['msg'] = 'error by saving at least one state user transaction'; - } - return $save_results; - } -} diff --git a/community_server/src/Model/Table/UsersTable.php b/community_server/src/Model/Table/UsersTable.php deleted file mode 100644 index 0e99ba521..000000000 --- a/community_server/src/Model/Table/UsersTable.php +++ /dev/null @@ -1,130 +0,0 @@ -setTable('users'); - $this->setDisplayField('id'); - $this->setPrimaryKey('id'); - - $this->addBehavior('Timestamp'); - - $this->hasMany('EmailOptIn', [ - 'foreignKey' => 'user_id', - ]); - $this->hasMany('UserBackups', [ - 'foreignKey' => 'user_id', - ]); - $this->hasMany('UserRoles', [ - 'foreignKey' => 'user_id', - ]); - } - - /** - * Default validation rules. - * - * @param \Cake\Validation\Validator $validator Validator instance. - * @return \Cake\Validation\Validator - */ - public function validationDefault(Validator $validator) - { - $validator - ->integer('id') - ->allowEmptyString('id', null, 'create'); - - $validator - ->email('email') - ->requirePresence('email', 'create') - ->notEmptyString('email') - ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); - - $validator - ->scalar('first_name') - ->maxLength('first_name', 150) - ->requirePresence('first_name', 'create') - ->notEmptyString('first_name'); - - $validator - ->scalar('last_name') - ->maxLength('last_name', 255) - ->allowEmptyString('last_name'); - - $validator - ->requirePresence('password', 'create') - ->notEmptyString('password'); - - $validator - ->allowEmptyString('pubkey'); - - $validator - ->allowEmptyString('privkey'); - - $validator - ->boolean('email_checked') - ->notEmptyString('email_checked'); - - $validator - ->scalar('language') - ->maxLength('language', 4) - ->notEmptyString('language'); - - return $validator; - } - - /** - * Returns a rules checker object that will be used for validating - * application integrity. - * - * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. - * @return \Cake\ORM\RulesChecker - */ - public function buildRules(RulesChecker $rules) - { - $rules->add($rules->isUnique(['email'])); - - return $rules; - } - - /** - * Returns the database connection name to use by default. - * - * @return string - */ - public static function defaultConnectionName() - { - return 'loginServer'; - } -} diff --git a/community_server/src/Model/Transactions/Record.php b/community_server/src/Model/Transactions/Record.php deleted file mode 100644 index 5572730ef..000000000 --- a/community_server/src/Model/Transactions/Record.php +++ /dev/null @@ -1,575 +0,0 @@ -signature = $signature; - $this->publicKey = $pubkey; - } - - public function finalize($transactionId) - { - $signaturesTable = TableRegistry::getTableLocator()->get('TransactionSignatures'); - $entity = $signaturesTable->newEntity(); - $entity->transaction_id = $transactionId; - if(strlen($this->signature) != 128) { - return ['state' => 'error', 'msg' => 'invalid signature size', 'details' => strlen($this->signature)]; - } - if(strlen($this->publicKey) != 64) { - return ['state' => 'error', 'msg' => 'invalid pubkey size', 'details' => strlen($this->publicKey)]; - } - if(!preg_match('/^[0-9a-fA-F]*$/', $this->signature)) { - return ['state' => 'error', 'msg' => 'signature isn\'t in hex format']; - } - if(!preg_match('/^[0-9a-fA-F]*$/', $this->publicKey)) { - return ['state' => 'error', 'msg' => 'publicKey isn\'t in hex format']; - } - $entity->signature = hex2bin($this->signature); - $entity->pubkey = hex2bin($this->publicKey); - - if(!$signaturesTable->save($entity)) { - return ['state' => 'error', 'msg' => 'error saving signature', 'details' => $entity->getErrors()]; - } - return true; - } -} - - - -class GradidoModifieUserBalance -{ - private $state_users = []; - private $user_balances = []; - - public function getUserId($userPublicKey) - { - $stateUsersTable = TableRegistry::getTableLocator()->get('StateUsers'); - - $stateUser = $stateUsersTable->find('all')->where(['public_key' => hex2bin($userPublicKey)]); - if($stateUser->isEmpty()) { - return ['state' => 'error', 'msg' => '[GradidoModifieUserBalance::getUserId] couldn\'t find user via public key']; - } - $id = $stateUser->first()->id; - if($id && is_int($id) && (int)$id > 0 && !in_array((int)$id, $this->state_users)) { - array_push($this->state_users, (int)$id); - } - return $id; - } - - public function updateBalance($newBalance, $recordDate, $userId) - { - $stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances'); - $state_balance_query = $stateBalancesTable->find()->where(['state_user_id' => $userId])->order(['record_date ASC']); - $state_balance = null; - if($state_balance_query->count() > 0) { - $state_balance = $state_balance_query->last(); - } else { - $state_balance = $stateBalancesTable->newEntity(); - $state_balance->state_user_id = $userId; - } - $state_balance->amount = $newBalance; - $state_balance->record_date = $recordDate; - $this->user_balances[$userId] = $state_balance; - $stateBalancesTable->save($state_balance); - return true; - //$this->user_balances[$userId] = ['balance' => $newBalance, ''] - // - //return $stateBalancesTable->updateBalanceWithTransaction($newBalance, $recordDate, $userId); - - /*$first_of_month = new Time("$year-$month-01 00:00"); - $stateBalanceQuery = $stateBalancesTable - ->find('all') - ->where(['state_user_id' => $userId]) - ->order(['record_date' => 'DESC']) - ->limit(1); - $entity = null; - - if(!$stateBalanceQuery->isEmpty()) { - $entity = $stateBalanceQuery->first(); - if($entity->record_date != NULL && - ($entity->record_date > $recordDate || $entity->record_date->day == 1)) { - return false; - } - } else { - $entity = $stateBalancesTable->newEntity(); - $entity->state_user_id = $userId; - } - $entity->record_date = $recordDate; - $entity->amount = $newBalance; - /*if(!$stateBalancesTable->save($entity)) { - return ['state' => 'error', 'msg' => 'error saving state balance', 'details' => $entity->getErrors()]; - }*/ - //return true; - } - - public function getAllStateUsers() - { - return $this->state_users; - } - public function getAllStateUserBalances() - { - return $this->user_balances; - } -} - -class ManageNodeGroupAdd extends GradidoModifieUserBalance -{ - /* - "add_user": { - "user\": " << user << ", - }, - OR - - "move_user_inbound|move_user_outbound": { - "user": " << user << ", - "other_group": " << other_group << ", - "paired_transaction_id": { - "seconds": << ts.seconds <<, - "nanos": << ts.nanos - } - }, - - */ - - private $user_pubkey; - private $other_group = ''; - private $remove_from_group = false; - - public function __construct($data) - { - $this->user_pubkey = $data['user']; - if(isset($data['other_group'])) { - $this->other_group = $data['other_group']; - } - } - - public function finalize($transactionId, $received) - { - $transactionGroupAddadressTable = TableRegistry::getTableLocator()->get('TransactionGroupAddaddress'); - $stateGroupAddresses = TableRegistry::getTableLocator()->get('StateGroupAddresses'); - $transactionGroupEntity = $transactionGroupAddadressTable->newEntity(); - if(!is_int($transactionId)) { - return ['state' => 'error', 'msg' => '[ManageNodeGroupAdd::finalize] transaction id is not int', 'details' => $transactionId]; - } - $transactionGroupEntity->transaction_id = $transactionId; - $transactionGroupEntity->address_type_id = 1; - if(strlen($this->user_pubkey) != 64) { - return ['state' => 'error', 'msg' => 'invalid size user pubkey', 'details' => strlen($this->user_pubkey)]; - } - if(!preg_match('/^[0-9a-fA-F]*$/', $this->user_pubkey)) { - return ['state' => 'error', 'msg' => 'user_pubkey isn\'t in hex format']; - } - - $userPubkeyBin = hex2bin($this->user_pubkey); - - $transactionGroupEntity->public_key = $userPubkeyBin; - $user_id = $this->getUserId($this->user_pubkey); - if(!is_int($user_id)) { - return ['state' => 'error', 'msg' => '[ManageNodeGroupAdd::finalize] user id is not int', 'details' => $user_id]; - } - $transactionGroupEntity->state_user_id = $user_id; - $transactionGroupEntity->remove_from_group = $this->remove_from_group; - if(!$transactionGroupAddadressTable->save($transactionGroupEntity)) { - return ['state' => 'error', 'msg' => 'error saving TransactionGroupAddaddress Entity', 'details' => $transactionGroupEntity->getErrors()]; - } - - - if($this->remove_from_group) { - $stateGroup_query = $stateGroupAddresses->find('all')->where(['public_key' => hex2bin($this->user_pubkey)]); - if(!$stateGroup_query->isEmpty()) { - $stateGroupAddresses->delete($stateGroup_query->first()); - } - } else { - $stateGroupAddressesEntity = $stateGroupAddresses->newEntity(); - $stateGroupAddressesEntity->group_id = 1; - $stateGroupAddressesEntity->public_key = $userPubkeyBin; - $stateGroupAddressesEntity->address_type_id = 1; - if(!$stateGroupAddresses->save($stateGroupAddressesEntity)) { - return ['state' => 'error', 'msg' => 'error saving state group addresses entity', 'details' => $stateGroupAddressesEntity->getErrors()]; - } - } - - return true; - } - - public function setRemoveFromGroup($removeFromGroup) { - $this->remove_from_group = $removeFromGroup; - } -} - - -class GradidoCreation extends GradidoModifieUserBalance -{ - /* - * "gradido_creation": { - "user": " << user << ", - "new_balance": << v.new_balance << , - "prev_transfer_rec_num": << v.prev_transfer_rec_num <<, - "amount": << v.amount << - } - */ - private $userPubkey; - private $amount; - private $targetDate; // seems currently not in node server implementet, use hedera date until it is implemented - private $new_balance; - - - public function __construct($data) - { - $this->userPubkey = $data['user']; - $this->amount = $data['amount']['amount']; - $this->new_balance = $data['new_balance']['amount']; - //$this->targetDate = $received; - } - - public function finalize($transactionId, $received) - { - // TODO: don't use, after node server transmit correct date - $this->targetDate = $received; - - $transactionCreationTable = TableRegistry::getTableLocator()->get('TransactionCreations'); - - - $state_user_id = $this->getUserId($this->userPubkey); - if(!is_int($state_user_id)) { - return $state_user_id; - } - - $entity = $transactionCreationTable->newEntity(); - $entity->transaction_id = $transactionId; - $entity->amount = $this->amount; - $entity->target_date = $this->targetDate; - $entity->state_user_id = $state_user_id; - - if(!$transactionCreationTable->save($entity)) { - return ['state' => 'error', 'msg' => 'error saving create transaction', 'details' => $entity->getErrors()]; - } - - $balance_result = $this->updateBalance($this->new_balance, $received, $state_user_id); - if(is_array($balance_result)) { - return $balance_result; - } - - return true; - } - - - -} - -class GradidoTransfer extends GradidoModifieUserBalance -{ - /* - "local_transfer|inbound_transfer|outbound_transfer": { - "sender": { - "user": " << sender << ", - "new_balance": << tt.sender.new_balance << , - "prev_transfer_rec_num": << tt.sender.prev_transfer_rec_num << - }, - "receiver": { - "user": " << receiver << ", - "new_balance": << tt.receiver.new_balance << , - "prev_transfer_rec_num": << tt.receiver.prev_transfer_rec_num << - }, - "amount": << tt.amount << - }, - * */ - private $amount; - private $sender_new_balance = null; - private $sender_pubkey; - - private $receiver_pubkey; - private $receiver_new_balance = null; - - - public function __construct($data) - { - $this->amount = $data['amount']['amount']; - - $sender = $data['sender']; - $this->sender_pubkey = $sender['user']; - if(isset($sender['new_balance'])) { - $this->sender_new_balance = $sender['new_balance']['amount']; - } - - $receiver = $data['receiver']; - $this->receiver_pubkey = $receiver['user']; - if(isset($receiver['new_balance'])) { - $this->receiver_new_balance = $receiver['new_balance']['amount']; - } - - } - - public function finalize($transactionId, $received) - { - $transactionTransferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); - if(strlen($this->sender_pubkey) != 64) { - return ['state' => 'error', 'msg' => 'invalid size sender pubkey', 'details' => strlen($this->user_pubkey)]; - } - if(!preg_match('/^[0-9a-fA-F]*$/', $this->sender_pubkey)) { - return ['state' => 'error', 'msg' => 'sender_pubkey isn\'t in hex format']; - } - if(strlen($this->receiver_pubkey) != 64) { - return ['state' => 'error', 'msg' => 'invalid size receiver pubkey', 'details' => strlen($this->user_pubkey)]; - } - if(!preg_match('/^[0-9a-fA-F]*$/', $this->receiver_pubkey)) { - return ['state' => 'error', 'msg' => 'receiver_pubkey isn\'t in hex format']; - } - - $sender_id = $this->getUserId($this->sender_pubkey); - $receiver_id = $this->getUserId($this->receiver_pubkey); - if(is_array($sender_id) && is_array($receiver_id)) { - return ['state' => 'error', 'msg' => 'neither sender or receiver known']; - } - $transferEntity = $transactionTransferTable->newEntity(); - $transferEntity->transaction_id = $transactionId; - $transferEntity->sender_public_key = hex2bin($this->sender_pubkey); - $transferEntity->receiver_public_key = hex2bin($this->receiver_pubkey); - $transferEntity->amount = $this->amount; - if($this->sender_new_balance != null) { - $transferEntity->sender_final_balance = $this->sender_new_balance; - - if(is_int($sender_id) && $sender_id > 0) { - $transferEntity->state_user_id = $sender_id; - $balance_result = $this->updateBalance($this->sender_new_balance, $received, $sender_id); - if(is_array($balance_result)) { - return $balance_result; - } - } - } - if($this->receiver_new_balance != null && is_int($receiver_id) && $receiver_id > 0) { - $transferEntity->receiver_user_id = $receiver_id; - $balance_result = $this->updateBalance($this->receiver_new_balance, $received, $receiver_id); - if(is_array($balance_result)) { - return $balance_result; - } - } - - if(!$transactionTransferTable->save($transferEntity)) { - return ['state' => 'error', 'msg' => 'error saving transaction send coins entity', 'details' => $transferEntity->getErrors()]; - } - - return true; - } - -} - - - - -class Record -{ - private $sequenceNumber = 0; - private $runningHash = null; - private $transactionType = ''; - private $memo = ''; - private $signatures = []; - private $received; - private $transactionObj = null; - private $result; - private $partCount = 0; - - public function __construct() - { - - } - - - public function parseRecord($json) { - if(!isset($json['record_type'])) { - return false; - } - //var_dump($json); - switch($json['record_type']) { - case 'GRADIDO_TRANSACTION': - return $this->parseTransaction($json['transaction']); - case 'MEMO': - $this->memo .= $json['memo']; - return true; - case 'SIGNATURES': - return $this->parseSignatures($json['signature']); - case 'STRUCTURALLY_BAD_MESSAGE': - case 'RAW_MESSAGE': - case 'BLANK': - return false; - } - } - - /*! - * \brief save data parts in db - */ - public function finalize() - { - $transactionTypesTable = TableRegistry::getTableLocator()->get('TransactionTypes'); - $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); - - $transactionTypeName = $this->nodeTransactionTypeToDBTransactionType($this->transactionType); - $transactionTypeResults = $transactionTypesTable->find('all')->where(['name' => $transactionTypeName]); - if($transactionTypeResults->isEmpty()) { - return [ - 'state' => 'error', 'msg' => 'transaction type not found', - 'details' => ['nodeType' => $this->transactionType, 'dbType' => $transactionTypeName] - ]; - } - if(!$this->transactionObj) { - return ['state' => 'error', 'msg' => 'transaction obj is null']; - } - if($this->sequenceNumber <= 0) { - return ['state' => 'error', 'msg' => 'sequence number invalid', 'details' => $this->sequenceNumber]; - } - $transactionExistResult = $transactionsTable->find('all')->where(['id' => intval($this->sequenceNumber)]); - if(!$transactionExistResult->isEmpty()) { - return ['state' => 'warning', 'msg' => 'transaction already exist in db', 'details' => $this->sequenceNumber]; - } - $newTransaction = $transactionsTable->newEntity(); - $newTransaction->id = $this->sequenceNumber; - $newTransaction->transaction_type_id = $transactionTypeResults->first()->id; - $newTransaction->memo = $this->memo; - if($this->runningHash != '' && strlen($this->runningHash) % 2 == 0) { - $newTransaction->tx_hash = hex2bin($this->runningHash); - } - $newTransaction->received = $this->received; - - //! TODO change into transaction, if at least one fail, rollback - /* - // In a controller. - $articles->getConnection()->transactional(function () use ($articles, $entities) { - foreach ($entities as $entity) { - $articles->save($entity, ['atomic' => false]); - } - }); - */ - if(!$transactionsTable->save($newTransaction)) { - return ['state' => 'error', 'msg' => 'error saving transaction', 'details' => $newTransaction->getErrors()]; - } - - foreach($this->signatures as $sign) { - $sign_result = $sign->finalize($this->sequenceNumber); - if($sign_result !== true) { - return ['state' => 'error', 'msg', 'error finalizing signature', 'details' => $sign_result]; - } - } - $transaction_obj_result = $this->transactionObj->finalize($newTransaction->id, $this->received); - if($transaction_obj_result !== true) { - return ['state' => 'error', 'msg' => 'error finalizing transaction object', 'details' => $transaction_obj_result]; - } - $state_users = $this->transactionObj->getAllStateUsers(); - $sut_entities = []; - $state_user_balances = $this->transactionObj->getAllStateUserBalances(); - foreach($state_users as $state_user_id) { - $entity = $stateUserTransactionsTable->newEntity(); - $entity->state_user_id = $state_user_id; - $entity->transaction_id = $newTransaction->id; - $entity->transaction_type_id = $newTransaction->transaction_type_id; - $entity->balance = $state_user_balances[$state_user_id]->amount; - $entity->balance_date = $state_user_balances[$state_user_id]->record_date; - $sut_entities[] = $entity; - } - $sut_results = $stateUserTransactionsTable->saveMany($sut_entities); - foreach($sut_results as $i => $result) { - if(false == $result) { - return ['state' => 'error', 'msg' => 'error saving state_user_transaction', 'details' => $sut_entities[$i]->getErrors()]; - } - } - - return true; - - } - - private function nodeTransactionTypeToDBTransactionType($nodeTransactionType) - { - switch($nodeTransactionType) { - case 'GRADIDO_CREATION': - return 'creation'; - - case 'MOVE_USER_INBOUND': - case 'ADD_USER': - return 'group add member'; - - case 'MOVE_USER_OUTBOUND': - return 'group remove member'; - - case 'LOCAL_TRANSFER': - case 'INBOUND_TRANSFER': - case 'OUTBOUND_TRANSFER': - return 'transfer'; - } - return 'unknown'; - } - - private function parseSignatures($signaturesArray) - { - foreach($signaturesArray as $sign) { - $this->signatures[] = new Signature($sign['signature'], $sign['pubkey']); - } - return true; - } - - private function parseTransaction($data) - { - $this->transactionType = $data['transaction_type']; - $sign = $data['signature']; - $this->signatures[] = new Signature($sign['signature'], $sign['pubkey']); - - $hedera = $data['hedera_transaction']; - $this->sequenceNumber = $hedera['sequenceNumber']; - $this->runningHash = $hedera['runningHash']; - $this->received = Time::createFromTimestamp($hedera['consensusTimestamp']['seconds']); - - $field_index = ''; - $class_name = ''; - - $removeFromGroup = false; - switch($this->transactionType) - { - case 'GRADIDO_CREATION': $field_index = 'gradido_creation'; $class_name = 'GradidoCreation'; break; - case 'ADD_USER': $field_index = 'add_user'; $class_name = 'ManageNodeGroupAdd'; break; - case 'MOVE_USER_INBOUND': $field_index = 'move_user_inbound'; $class_name = 'ManageNodeGroupAdd'; break; - case 'MOVE_USER_OUTBOUND': $field_index = 'move_user_outbound'; $class_name = 'ManageNodeGroupAdd'; $removeFromGroup = true; break; - case 'LOCAL_TRANSFER': $field_index = 'local_transfer'; $class_name = 'GradidoTransfer'; break; - case 'INBOUND_TRANSFER': $field_index = 'inbound_transfer'; $class_name = 'GradidoTransfer'; break; - case 'OUTBOUND_TRANSFER': $field_index = 'outbound_transfer'; $class_name = 'GradidoTransfer'; break; - } - if($class_name == '' || $field_index == '') { - return ['state' => 'error', 'msg' => 'node transaction type unknown', 'details' => $this->transactionType]; - } - $class_name = 'Model\\Transactions\\' . $class_name; - $this->transactionObj = new $class_name($data[$field_index]); - if($class_name == 'ManageNodeGroupAdd') { - $this->transactionObj->setRemoveFromGroup($removeFromGroup); - } - - $this->result = $data['result']; - $this->partCount = intval($data['parts']); - $this->memo = $data['memo']; - return true; - } - - public function getSequenceNumber() { - return $this->sequenceNumber; - } - public function getPartCount() { - return $this->partCount; - } - -} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/SignatureMap.php b/community_server/src/Model/Transactions/SignatureMap.php deleted file mode 100644 index cbe48e636..000000000 --- a/community_server/src/Model/Transactions/SignatureMap.php +++ /dev/null @@ -1,68 +0,0 @@ -mProtoSigMap = $protoSigMap; - } - - public function getProto() { - return $this->mProtoSigMap; - } - - static public function fromEntity($transactionSignatures) - { - - $protoSigMap = new \Proto\Gradido\SignatureMap(); - $sigPairs = $protoSigMap->getSigPair(); - //echo "sigPairs: "; var_dump($sigPairs); echo "
    "; - //return null; - foreach($transactionSignatures as $signature) { - $sigPair = new \Proto\Gradido\SignaturePair(); - $sigPair->setPubKey(stream_get_contents($signature->pubkey)); - $sigPair->setEd25519(stream_get_contents($signature->signature)); - - $sigPairs[] = $sigPair; - //array_push($sigPairs, $sigPair); - } - return new SignatureMap($protoSigMap); - } - - static public function build($bodyBytes, array $keys) - { - $protoSigMap = new \Proto\Gradido\SignatureMap(); - $sigPairs = $protoSigMap->getSigPair(); - //echo "sigPairs: "; var_dump($sigPairs); echo "
    "; - //return null; - - // sign with keys - foreach($keys as $key) { - $sigPair = new \Proto\Gradido\SignaturePair(); - $sigPair->setPubKey(hex2bin($key['pub'])); - $sigPair->setEd25519(sodium_crypto_sign_detached($bodyBytes, hex2bin($key['priv']))); - - $sigPairs[] = $sigPair; - } - //array_push($sigPairs, $sigPair); - - return new SignatureMap($protoSigMap); - } - - -} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/Transaction.php b/community_server/src/Model/Transactions/Transaction.php deleted file mode 100644 index 810f20c9d..000000000 --- a/community_server/src/Model/Transactions/Transaction.php +++ /dev/null @@ -1,289 +0,0 @@ -mProtoTransaction = $base64Data; - $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes()); - return; - } - - try { - $transactionBin = sodium_base642bin($base64Data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING); - } catch(\SodiumException $e) { - //$this->addError('Transaction', $e->getMessage());// . ' ' . $base64Data); - //return; - $transactionBin = base64_decode($base64Data, true); - if($transactionBin == false) { - $this->addError('Transaction', $e->getMessage());// . ' ' . $base64Data); - $this->addError('base64', $base64Data); - return; - } - } - //*/} - - if($transactionBin == false) { - //$this->addError('base64 decode failed'); - $this->addError('Transaction', 'base64 decode error: ' . $base64Data); - } else { - //var_dump($transactionBin); - $this->mProtoTransaction = new \Proto\Gradido\GradidoTransaction(); - try { - $this->mProtoTransaction->mergeFromString($transactionBin); - //var_dump($this->mProtoTransaction); - // cannot catch Exception with cakePHP, I don't know why - } catch(\Google\Protobuf\Internal\GPBDecodeException $e) { - //var_dump($e); - $this->addError('Transaction', $e->getMessage()); - return; - }//*/ - - //echo 'serialize to json:
    '; - //echo $this->mProtoTransaction->serializeToJsonString(); - //echo "body bytes:
    "; - //var_dump($this->mProtoTransaction->getBodyBytes()); - //echo "
    end body bytes
    "; - $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes()); - } - } - - static public function build(\Proto\Gradido\TransactionBody $transactionBody, $senderKeyPair) - { - $protoTransaction = new \Proto\Gradido\GradidoTransaction(); - - $recevied = new \Proto\Gradido\TimestampSeconds(); - $recevied->setSeconds(time()); - $protoTransaction->setReceived($recevied); - - $bodyBytes = $transactionBody->serializeToString(); - - $sigMap = SignatureMap::build($bodyBytes, [$senderKeyPair]); - $protoTransaction->setSigMap($sigMap->getProto()); - - $protoTransaction->setBodyBytes($bodyBytes); - - return $protoTransaction; - - } - - public function getTransactionBody() { - return $this->mTransactionBody; - } - - public function getFirstPublic() - { - if(!$this->mProtoTransaction || !$this->mProtoTransaction->getSigMap()) { - return ''; - } - $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair(); - return $sigPairs[0]->getPubKey(); - } - - public function getFirstSigningUser() - { - return $this->getStateUserFromPublickey($this->getFirstPublic()); - } - - public function getId() { - return $this->mProtoTransaction->getId(); - } - - public function validate() { - $sigMap = $this->mProtoTransaction->getSigMap(); - if(!$sigMap) { - $this->addError('Transaction', 'signature map is zero'); - //var_dump($this->mProtoTransaction); - return false; - } - //var_dump($sigMap); - //die(); - $sigPairs = $sigMap->getSigPair(); - $bodyBytes = $this->mProtoTransaction->getBodyBytes(); - - - if(!$sigPairs || count($sigPairs) < 1) { - $this->addError('Transaction::validate', 'no signature found'); - return false; - } - - // check signature(s) - foreach($sigPairs as $sigPair) { - //echo 'sig Pair: '; var_dump($sigPair); echo "
    "; - $pubkey = $sigPair->getPubKey(); - $signature = $sigPair->getEd25519(); - //echo "verify bodybytes:
    " . bin2hex($bodyBytes) . '
    '; - if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { - $this->addError('Transaction::validate', 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ' ); - return false; - } - } - - if(!$this->mTransactionBody->validate($sigPairs)) { - $this->addErrors($this->mTransactionBody->getErrors()); - return false; - } - - return true; - } - - public function save() - { - $connection = ConnectionManager::get('default'); - $connection->begin(); - //id transaction_id signature pubkey - - if (!$this->mTransactionBody->save($this->getFirstPublic(), $this->mProtoTransaction->getSigMap())) { - $this->addErrors($this->mTransactionBody->getErrors()); - $connection->rollback(); - // correct auto-increment value to prevent gaps - $transactionsTable = $this->getTable('transactions'); - $transactions = $transactionsTable->find()->select(['id'])->contain(false); - $count = $transactions->count(); - $connection = ConnectionManager::get('default'); - $connection->execute("ALTER TABLE `transactions` auto_increment = $count;"); - - return false; - } - - // save transaction signatures - $transactionsSignaturesTable = TableRegistry::getTableLocator()->get('transaction_signatures'); - $transactionId = $this->mTransactionBody->getTransactionID(); - //signature pubkey - - $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair(); - //echo "sigPairs: "; var_dump($sigPairs); - $signatureEntitys = []; - foreach($sigPairs as $sigPair) { - $signatureEntity = $transactionsSignaturesTable->newEntity(); - $signatureEntity->transaction_id = $transactionId; - $signatureEntity->signature = $sigPair->getEd25519(); - $signatureEntity->pubkey = $sigPair->getPubKey(); - array_push($signatureEntitys, $signatureEntity); - } - //debug($signatureEntitys); - if(!$transactionsSignaturesTable->saveMany($signatureEntitys)) { - foreach($signatureEntitys as $entity) { - $errors = $entity->getErrors(); - if(!$errors && count($errors) > 0) { - $pubkeyHex = bin2hex($entity->pubkey); - $this->addError('Transaction::save', 'error saving signature for pubkey: ' . $pubkeyHex . ', with errors: ' . json_encode($errors) ); - } - } - $connection->rollback(); - return false; - } - - $connection->commit(); - - $specificTransaction = $this->mTransactionBody->getSpecificTransaction(); - - $specificTransaction->sendNotificationEmail($this->mTransactionBody->getMemo()); - $this->addWarnings($specificTransaction->getWarnings()); - return true; - } - - static public function fromTable($id) - { - $transactionsTable = TableRegistry::getTableLocator()->get('transactions'); - $transactionEntry = $transactionsTable - ->find('all') - ->where(['id' => $id]) - ->contain([ - 'TransactionCreations', - 'TransactionSendCoins', - 'TransactionSignatures']) - ->first(); - //var_dump($transactionEntry->toArray()); - $protoTransaction = new \Proto\Gradido\Transaction(); - - - - $protoTransaction->setId($transactionEntry->id); - - - $recevied = new \Proto\Gradido\TimestampSeconds(); - $recevied->setSeconds($transactionEntry->received->getTimestamp()); - $protoTransaction->setReceived($recevied); - - - $sigMap = SignatureMap::fromEntity($transactionEntry->transaction_signatures); - $protoTransaction->setSigMap($sigMap->getProto()); - - //echo "sig map: check
    "; - $protoTransaction->setTxHash(stream_get_contents($transactionEntry->tx_hash)); - - $body = TransactionBody::fromEntity($transactionEntry->memo, $transactionEntry); - if(is_array($body)) { - return ['state' => 'error', 'msg' => 'error creating body transaction', 'details' => $body]; - } - - // validate signatures - $sigPairs = $sigMap->getProto()->getSigPair(); - - if(!$sigPairs || count($sigPairs) < 1) { - return ['state' => 'error', 'msg' => 'error no signatures found']; - } - - //echo "verify bodybytes:
    " . bin2hex($bodyBytes) . '
    '; - $created = new \Proto\Gradido\TimestampSeconds(); - $created->setSeconds($recevied->getSeconds()); - $body->setCreated($created); - $bodyBytes = $body->serializeToString(); - $createTrys = 0; - $createRight = false; - // check signature(s) and - // try to get created field of TransactionBody right, because it wasn't saved - foreach($sigPairs as $sigPair) { - //echo 'sig Pair: '; var_dump($sigPair); echo "
    "; - $pubkey = $sigPair->getPubKey(); - $signature = $sigPair->getEd25519(); - if(!$createRight) { - while($createTrys < 500) { - if(\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { - $createRight = true; - break; - } else { - $createTrys++; - $created->setSeconds($created->getSeconds() - 1); - //$body->setCreated($created); - $bodyBytes = $body->serializeToString(); - } - } - } - - if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) { - return ['state' => 'error', 'msg' => 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ']; - } - } - - $protoTransaction->setBodyBytes($bodyBytes); - - - - return $protoTransaction; - } - -} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php deleted file mode 100644 index 6b3817201..000000000 --- a/community_server/src/Model/Transactions/TransactionBase.php +++ /dev/null @@ -1,166 +0,0 @@ -errors; - } - - public function getWarnings() { - return $this->warnings; - } - public function addError($functionName, $errorName) { - array_push($this->errors, [$functionName => $errorName]); - } - public function addWarning($functionName, $warningName) { - array_push($this->warnings, [$functionName => $warningName]); - } - - public function addErrors($errors) { - $this->errors = array_merge($this->errors, $errors); - } - - public function addWarnings($warnings) { - $this->warnings = array_merge($this->warnings, $warnings); - } - - public function hasErrors() { - return count($this->errors) > 0; - } - - public function hasWarnings() { - return count($this->warnings) > 0; - } - public static function getTable($tableName) { - if(!isset(self::$tables[$tableName])) { - self::$tables[$tableName] = TableRegistry::getTableLocator()->get($tableName); - } - return self::$tables[$tableName]; - } - - - protected function getStateUserId($publicKey) { - - $stateUsersTable = self::getTable('state_users'); - $stateUser = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $publicKey])->first(); - if($stateUser) { - return $stateUser->id; - } - // create new entry - $stateUserEntity = $stateUsersTable->newEntity(); - $stateUserEntity->public_key = $publicKey; - if($stateUsersTable->save($stateUserEntity)) { - return $stateUserEntity->id; - } else { - $this->addError('TransactionBase::getStateUserId', 'error saving new state user with error: ' . json_encode($stateUserEntity->getErrors())); - } - - return NULL; - } - - protected function getStateUser($id) { - $stateUsersTable = self::getTable('state_users'); - $stateUser = $stateUsersTable->get($id); - if($stateUser) { - return $stateUser; - } - - return NULL; - } - - protected function getStateUserFromPublickey($publicKey) { - $stateUsersTable = self::getTable('state_users'); - $stateUser = $stateUsersTable->find('all')->where(['public_key' => $publicKey])->first(); - if($stateUser) { - return $stateUser; - } - - return NULL; - } - - - protected function updateStateBalance($stateUserId, $addAmountCent, $recordDate) { - $stateBalancesTable = self::getTable('stateBalances'); - $stateBalanceQuery = $stateBalancesTable - ->find('all') - ->select(['amount', 'id', 'record_date']) - ->contain(false) - ->where(['state_user_id' => $stateUserId]);//->first(); - //debug($stateBalanceQuery); - - if($stateBalanceQuery->count() > 0) { - - $stateBalanceEntry = $stateBalanceQuery->first(); - $stateBalanceEntry->amount = - $stateBalancesTable->calculateDecay($stateBalanceEntry->amount, $stateBalanceEntry->record_date, $recordDate) - + $addAmountCent; - } else { - $stateBalanceEntry = $stateBalancesTable->newEntity(); - $stateBalanceEntry->state_user_id = $stateUserId; - $stateBalanceEntry->amount = $addAmountCent; - } - $stateBalanceEntry->record_date = $recordDate; - $finalBalance = $stateBalanceEntry->amount; - //echo "\ntry to save: "; var_dump($stateBalanceEntry); echo "\n"; - if(!$stateBalancesTable->save($stateBalanceEntry)) { - $errors = $stateBalanceEntry->getErrors(); - $this->addError('TransactionBase::updateStateBalance', 'error saving state balance with: ' . json_encode($errors)); - return false; - } - return $finalBalance; - } - - protected function addStateUserTransaction($stateUserId, $transactionId, $transactionTypeId, $balance, $balance_date) { - $stateUserTransactionTable = self::getTable('state_user_transactions'); - - $stateUserTransactions = $stateUserTransactionTable - ->find('all') - ->where(['state_user_id' => $stateUserId]) - ->order(['transaction_id DESC']); - $new_balance = $balance; - if($stateUserTransactions->count() > 0) { - $stateBalanceTable = self::getTable('state_balances'); - $state_user_transaction = $stateUserTransactions->first(); - if(!$state_user_transaction) { - $this->addError('TransactionBase::addStateUserTransaction', 'state_user_transaction is zero, no first entry exist?'); - return false; - } - $new_balance += $stateBalanceTable->calculateDecay( - $state_user_transaction->balance, - $state_user_transaction->balance_date, - $balance_date - ); - } - $entity = $stateUserTransactionTable->newEntity(); - $entity->state_user_id = $stateUserId; - $entity->transaction_id = $transactionId; - $entity->transaction_type_id = $transactionTypeId; - $entity->balance = $new_balance; - $entity->balance_date = $balance_date; - - if(!$stateUserTransactionTable->save($entity)) { - $errors = $entity->getErrors(); - $this->addError('TransactionBase::addStateUserTransaction', 'error saving state user balance with: ' . json_encode($errors)); - return false; - } - // set balance from all state_user_transactions which came after (sorted by balance_date) to 0 - // because creation transaction can be added before other transaction which already happend - $state_user_transactions = $stateUserTransactionTable - ->find() - ->select(['id', 'balance']) - ->where(['state_user_id' => $stateUserId, 'balance_date >' => $balance_date]) - ; - foreach($state_user_transactions as $t) { - $t->balance = 0; - } - $stateUserTransactionTable->saveMany($state_user_transactions); - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Model/Transactions/TransactionBody.php b/community_server/src/Model/Transactions/TransactionBody.php deleted file mode 100644 index 87a029b80..000000000 --- a/community_server/src/Model/Transactions/TransactionBody.php +++ /dev/null @@ -1,194 +0,0 @@ -mProtoTransactionBody = new \Proto\Gradido\TransactionBody(); - try { - $this->mProtoTransactionBody->mergeFromString($bodyBytes); - // cannot catch Exception with cakePHP, I don't know why - } catch(\Google\Protobuf\Internal\GPBDecodeException $e) { - //var_dump($e); - $this->addError('TransactionBody', $e->getMessage()); - return; - } - - switch($this->mProtoTransactionBody->getData()) { - case 'creation' : $this->mSpecificTransaction = new TransactionCreation($this->mProtoTransactionBody->getCreation()); break; - case 'transfer' : $this->mSpecificTransaction = new TransactionTransfer($this->mProtoTransactionBody->getTransfer()); break; - } - } - - public function validate($sigPairs) { - - // transaction type id - $transactionTypesTable = TableRegistry::getTableLocator()->get('transaction_types'); - - $typeName = $this->getTransactionTypeName(); - $transactionType = $transactionTypesTable->find('all')->where(['name' => $typeName])->select(['id'])->first(); - if($transactionType == NULL) { - $this->addError('TransactionBody::validate', 'zero type id for type: ' . $typeName); - return false; - } - $this->transactionTypeId = $transactionType->id; - - // check if creation time is in the past - if($this->mProtoTransactionBody->getCreated()->getSeconds() > time()) { - $this->addError('TransactionBody::validate', 'Transaction were created in the past!'); - return false; - } - if(!$this->mSpecificTransaction->validate($sigPairs)) { - $this->addErrors($this->mSpecificTransaction->getErrors()); - return false; - } - - - - return true; - } - - public function getSpecificTransaction() { - return $this->mSpecificTransaction; - } - - public function getMemo() { - return $this->mProtoTransactionBody->getMemo(); - } - - public function getTransactionTypeName() - { - return $this->mProtoTransactionBody->getData(); - } - - public function save($firstPublic, $sigMap) { - $transactionsTable = TableRegistry::getTableLocator()->get('transactions'); - $transactionEntity = $transactionsTable->newEntity(); - - - $transactionEntity->transaction_type_id = $this->transactionTypeId; - $transactionEntity->memo = $this->getMemo(); - - if ($transactionsTable->save($transactionEntity)) { - // reload entity to get received date filled from mysql - $transactionEntity = $transactionsTable->get($transactionEntity->id); - // success - $this->mTransactionID = $transactionEntity->id; - if(!$this->mSpecificTransaction->save($transactionEntity->id, $firstPublic, $transactionEntity->received)) { - $this->addErrors($this->mSpecificTransaction->getErrors()); - return false; - } - } else { - $this->addError('TransactionBody::save', 'error saving transaction with: ' . json_encode($transactionEntity->getError())); - return false; - } - $previousTxHash = null; - if($this->mTransactionID > 1) { - try { - $previousTransaction = $transactionsTable - ->find('all', ['contain' => false]) - ->select(['tx_hash']) - ->where(['id' => $this->mTransactionID - 1]) - ->first(); - /*$previousTransaction = $transactionsTable->get($this->mTransactionID - 1, [ - 'contain' => false, - 'fields' => ['tx_hash'] - ]);*/ - } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) { - $this->addError('TransactionBody::save', 'previous transaction (with id ' . ($this->mTransactionID-1) . ' not found'); - return false; - } - if(!$previousTransaction) { - // shouldn't occur - $this->addError('TransactionBody::save', 'previous transaction (with id ' . ($this->mTransactionID-1) . ' not found'); - return false; - } - $previousTxHash = $previousTransaction->tx_hash; - } - try { - //$transactionEntity->received = $transactionsTable->get($transactionEntity->id, ['contain' => false, 'fields' => ['received']])->received; - $transactionEntity->received = $transactionsTable - ->find('all', ['contain' => false]) - ->where(['id' => $transactionEntity->id]) - ->select(['received'])->first()->received; - } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) { - $this->addError('TransactionBody::save', 'current transaction (with id ' . ($transactionEntity->id) . ' not found'); - $this->addError('exception: ', $ex->getMessage()); - return false; - } - - // calculate tx hash - // previous tx hash + id + received + sigMap as string - // Sodium use for the generichash function BLAKE2b today (11.11.2019), mabye change in the future - $state = \Sodium\crypto_generichash_init(); - //echo "prev hash: $previousTxHash\n"; - if($previousTxHash != null) { - \Sodium\crypto_generichash_update($state, stream_get_contents($previousTxHash)); - } - //echo "id: " . $transactionEntity->id . "\n"; - \Sodium\crypto_generichash_update($state, strval($transactionEntity->id)); - //echo "received: " . $transactionEntity->received; - \Sodium\crypto_generichash_update($state, $transactionEntity->received->i18nFormat('yyyy-MM-dd HH:mm:ss')); - \Sodium\crypto_generichash_update($state, $sigMap->serializeToString()); - $transactionEntity->tx_hash = \Sodium\crypto_generichash_final($state); - if ($transactionsTable->save($transactionEntity)) { - return true; - } - $this->addError('TransactionBody::save', 'error saving transaction with: ' . json_encode($transactionEntity->getError())); - return false; - } - - public function getTransactionID() { - return $this->mTransactionID; - } - - public function getTransactionTypeId() { - return $this->transactionTypeId; - } - - static public function fromEntity($memo, $transaction) - { - $protoBody = new \Proto\Gradido\TransactionBody(); - $protoBody->setMemo($memo); - - //$created->setSeconds($var); - //$protoBody->setCreated($created); - if(count($transaction->transaction_creations) == 1) { - //echo "is creation
    "; - $protoBody->setCreation(TransactionCreation::fromEntity($transaction->transaction_creations[0])->getProto()); - } - else if(count($transaction->transaction_send_coins) == 1) { - //echo "is transfer"; - $protoBody->setTransfer(TransactionTransfer::fromEntity($transaction->transaction_send_coins)->getProto()); - } else { - return ['invalid transaction type or count']; - } - - return $protoBody; - } - - static public function build($memo, $specificTransaction) - { - $protoBody = new \Proto\Gradido\TransactionBody(); - $protoBody->setMemo($memo); - - if(is_a($specificTransaction, 'TransactionCreation')) { - $protoBody->setCreation($specificTransaction->getProto()); - } else if(is_a($specificTransaction, 'TransactionTransfer')) { - $protoBody->setTransfer($specificTransaction->getProto()); - } else { - return ['invalid tarnsaction type']; - } - return $protoBody; - - } - -} diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php deleted file mode 100644 index 87f2d2104..000000000 --- a/community_server/src/Model/Transactions/TransactionCreation.php +++ /dev/null @@ -1,249 +0,0 @@ -protoTransactionCreation = $protoTransactionCreation; - $this->transactionCreationsTable = TableRegistry::getTableLocator()->get('transaction_creations'); - $this->receiver_pubkey_hex = bin2hex($this->getReceiverPublic()); - } - - public function getProto() { - return $this->protoTransactionCreation; - } - - static public function build($amount, $memo, $receiver_public_hex, $targetDate = null) - { - $receiver = new \Proto\Gradido\TransferAmount(); - $receiver->setAmount($amount); - //$this->receiver_pubkey_hex = $receiver_public_hex; - if(strlen($receiver_public_hex) != 64) { - return ['state' => 'error', 'msg' => 'invalid pubkey']; - } - $pubKeyBin = hex2bin($receiver_public_hex); - $receiver->setPubkey($pubKeyBin); - //var_dump($requestData); - - $creationDate = new \Proto\Gradido\TimestampSeconds(); - $creationDate->setSeconds(time()); - - $transactionBody = new \Proto\Gradido\TransactionBody(); - $transactionBody->setMemo($memo); - $transactionBody->setCreated($creationDate); - - - $transaction = new \Proto\Gradido\GradidoTransaction(); - $transaction->setReceiver($receiver); - //echo "target date: "; - //var_dump($targetDate); - //die('die'); - if($targetDate) { - $targetDateTimestamp = new \Proto\Gradido\TimestampSeconds(); - $targetDateTimestamp->setSeconds($targetDate->getTimestamp()); - //var_dump($targetDateTimestamp); die('target'); - $transaction->setTargetDate($targetDateTimestamp); - } - - $transactionBody->setCreation($transaction); - return ['state' => 'success', 'transactionBody' => $transactionBody]; - } - - - public function getAmount() { - return $this->protoTransactionCreation->getReceiver()->getAmount(); - } - - public function getReceiverPublic() { - return $this->protoTransactionCreation->getReceiver()->getPubkey(); - } - - public function getReceiverUser() { - return $this->getStateUserFromPublickey($this->getReceiverPublic()); - } - public function getTargetDate() { - return new FrozenDate($this->protoTransactionCreation->getTargetDate()->getSeconds()); - } - - public function validate($sigPairs) { - // check if receiver public is not in signature list - $receiverPublic = $this->getReceiverPublic(); - foreach($sigPairs as $sigPair) { - $pubkey = $sigPair->getPubKey(); - if($pubkey == $receiverPublic) { - $this->addError('TransactionCreation::validate', 'receiver aren\'t allowed to sign creation Transaction'); - return false; - } - } - - - /////////////// new validation, not more than 1K GDD per month via target_date /////////////////////////// - $existingCreations2 = $this->transactionCreationsTable - ->find('all') - ->select(['amount', 'state_user_id', 'target_date']) - ->contain(['StateUsers' => ['fields' => ['StateUsers.public_key']]]); - $q = $existingCreations2; - $targetDate = $this->protoTransactionCreation->getTargetDate(); - - $targetDateFrozen = new FrozenDate($targetDate->getSeconds()); - $targetDateMonthYearConcat = $targetDateFrozen->format('Ym'); - - $existingCreations2->where([ - 'target_date IS NOT' => NULL, - 'EXTRACT(YEAR_MONTH FROM target_date) LIKE ' => $targetDateMonthYearConcat, - ]); - - $newSum2 = $this->getAmount(); - $receiverEmail = ''; - foreach($existingCreations2 as $creation) { - $keyHex = bin2hex(stream_get_contents($creation->state_user->public_key)); - //echo "\ncompare \n$keyHex\nwith: \n". $this->receiver_pubkey_hex."\n"; - if($keyHex == $this->receiver_pubkey_hex) { - $newSum2 += $creation->amount; - $receiverEmail = $creation->state_user->email; - } - //$newSum2 += $creation->amount; - } - - /*if(!$existingCreations2->count()) { - if($newSum > 30000000) { - $this->addError('TransactionCreation::validate', 'Creation more than 1.000 GDD per Month (3 Month) not allowed'); - return false; - } - } else {*/ - if($newSum2 <= 0) { - $this->addError( - 'TransactionCreation::validate', - 'Creation less than 0 GDD per Month for '. $receiverEmail .' in target_date not allowed' - ); - } - if($newSum2 > 10000000) { - $this->addError( - 'TransactionCreation::validate', - 'Creation more than 1.000 GDD per Month for '. $receiverEmail .' in target_date not allowed' - ); - return false; - //} - } - - return true; - } - - public function save($transaction_id, $firstPublic, $received) - { - $stateBalancesTable = self::getTable('stateBalances'); - - $transactionCreationEntity = $this->transactionCreationsTable->newEntity(); - $transactionCreationEntity->transaction_id = $transaction_id; - - // state user id - //$state_user_id = $this->getStateUserId($firstPublic); - $receiverUserId = $this->getStateUserId($this->getReceiverPublic()); - if(!$receiverUserId) { - $this->addError('TransactionCreation::save', 'couldn\'t get state user id'); - return false; - } - - $transactionCreationEntity->state_user_id = $receiverUserId; - $transactionCreationEntity->amount = $this->getAmount(); - $transactionCreationEntity->target_date = $this->protoTransactionCreation->getTargetDate()->getSeconds(); - $target_date = new FrozenTime($transactionCreationEntity->target_date); - - //$decayed_balance = $stateBalancesTable->calculateDecay($this->getAmount(), $target_date, $received); - $balance = $this->getAmount(); - - if(!$this->transactionCreationsTable->save($transactionCreationEntity)) { - $this->addError('TransactionCreation::save', 'error saving transactionCreation with errors: ' . json_encode($transactionCreationEntity->getErrors())); - return false; - } - - // update state balance - $final_balance = $this->updateStateBalance($receiverUserId, $balance, $received); - if(false === $final_balance) { - return false; - } - - // decay is a virtual field which is calculated from amount and now() - record_date - if(!$this->addStateUserTransaction($receiverUserId, $transaction_id, 1, $balance, $received)) { - return false; - } - - return true; - } - - public function sendNotificationEmail($memo) - { - $disable_email = Configure::read('disableEmail', false); - if($disable_email) return true; - // send notification email - $receiverUserId = $this->getStateUserId($this->getReceiverPublic()); - $receiverUser = $this->getStateUser($receiverUserId); - $noReplyEmail = Configure::read('noReplyEmail'); - - try { - $email = new Email(); - $emailViewBuilder = $email->viewBuilder(); - $emailViewBuilder->setTemplate('notificationCreation') - ->setVars(['user' => $receiverUser, 'gdd_cent' => $this->getAmount(), 'memo' => $memo]); - $receiverNames = $receiverUser->getNames(); - if($receiverNames == '' || $receiverUser->email == '') { - $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id); - return false; - } - $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)']) - ->setTo([$receiverUser->email => $receiverUser->getNames()]) - ->setSubject(__('Gradido Schöpfung erhalten')) - ->send(); - } catch(Exception $e) { -// $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); - $this->addWarning('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); - return false; - } - return true; - } - - static public function fromEntity($transactionCreationEntity) - { - $protoCreation = new \Proto\Gradido\GradidoCreation(); - - //var_dump($transactionCreationEntity); - $stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); - //return new TransactionCreation($protoCreation); - $userId = $transactionCreationEntity->state_user_id; - - - $stateUser = $stateUsersTable->get($userId); - - - $receiverAmount = new \Proto\Gradido\TransferAmount(); - $receiverAmount->setPubkey(stream_get_contents($stateUser->public_key)); - $receiverAmount->setAmount($transactionCreationEntity->amount); - - $protoCreation->setReceiver($receiverAmount); - - // TODO: add target_date - // function currently not used, maybe can even be deleted - - //echo "receiver amount: check
    "; - //$identHashBytes = stream_get_contents($transactionCreationEntity->ident_hash); - - // intval - //$protoCreation->setIdentHash(intval($identHashBytes)); - //$protoCreation->setIdentHash(self::DRMakeStringHash($stateUser->email)); - return new TransactionCreation($protoCreation); - } -} diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php deleted file mode 100644 index dc1606f55..000000000 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ /dev/null @@ -1,249 +0,0 @@ -protoTransactionTransfer = $protoTransactionTransfer; - } - - public function getProto() { - return $this->protoTransactionTransfer; - } - - static public function build($amount, $memo, $receiver_public_hex, $sender_public_hex) - { - // repeated SenderAmount senderAmounts = 1; - // repeated ReceiverAmount receiverAmounts = 2; - - $sender = new \Proto\Gradido\TransferAmount(); - $sender->setAmount($amount); - - if(strlen($receiver_public_hex) != 64) { - return ['state' => 'error', 'msg' => 'invalid receiver pubkey']; - } - if(strlen($sender_public_hex) != 64) { - return ['state' => 'error', 'msg' => 'invalid sender pubkey']; - } - $receiverPubKeyBin = hex2bin($receiver_public_hex); - - $senderPubKeyBin = hex2bin($sender_public_hex); - $sender->setPubkey($senderPubKeyBin); - //var_dump($requestData); - - $creationDate = new \Proto\Gradido\TimestampSeconds(); - $creationDate->setSeconds(time()); - - $transactionBody = new \Proto\Gradido\TransactionBody(); - $transactionBody->setMemo($memo); - $transactionBody->setCreated($creationDate); - - $transfer = new \Proto\Gradido\GradidoTransfer(); - $local_transfer = new \Proto\Gradido\LocalTransfer(); - $local_transfer->setReceiver($receiverPubKeyBin); - $local_transfer->setSender($sender); - $transfer->setLocal($local_transfer); - $transactionBody->setTransfer($transfer); - return ['state' => 'success', 'transactionBody' => $transactionBody]; - } - - public function validate($sigPairs) { - //$this->addError('TransactionTransfer::validate', 'not implemented yet'); - //return false; - //$time = microtime(true); - static $functionName = 'TransactionTransfer::validate'; - - $sigPubHexs = []; - foreach($sigPairs as $sigPair) - { - $pubkey = $sigPair->getPubKey(); - $pubkey_hex = bin2hex($pubkey); - //$hash = TransactionCreation::DRMakeStringHash($pubkey); - $hash = $pubkey_hex; - if(!isset($sigPubHexs[$hash])) { - $sigPubHexs[$hash] = [$pubkey_hex]; - } else { - array_push($sigPubHexs[$hash], $pubkey_hex); - } - //array_push($sigPubHexs, $pubkey); - } - - $stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); - $local_transfer = $this->protoTransactionTransfer->getLocal(); - $sender = $local_transfer->getSender(); - $senderPublic = $sender->getPubkey(); - $senderPublicHex = bin2hex($senderPublic); - if(strlen($senderPublicHex) != 64) { - $this->addError($functionName, 'invalid sender public key'); - return false; - } - // check if signature exist for sender - //$hash = TransactionCreation::DRMakeStringHash($senderPublicHex); - $hash = $senderPublicHex; - if(!isset($sigPubHexs[$hash]) || in_array($senderPublicHex, $sigPubHexs[$hash]) === FALSE) { - $this->addError($functionName, 'missing signature for sender'); - return false; - } - // check if sender has enough Gradido - $amount = $sender->getAmount(); - $user = $stateUsersTable - ->find('all') - ->select(['id']) - ->where(['public_key' => $senderPublic]) - ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]])->first(); - if(!$user) { - $this->addError($functionName, 'couldn\'t find sender in db' ); - return false; - } - //var_dump($user); - if(intval($user->state_balances[0]->amount) < intval($amount)) { - $this->addError($functionName, 'sender hasn\t enough GDD'); - return false; - } - - $receiver_public_key = $local_transfer->getReceiver(); - if(strlen($receiver_public_key) != 32) { - $this->addError($functionName, 'invalid receiver public key'); - return false; - } - // check if receiver exist - $receiver_user = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $receiver_public_key])->first(); - if(!$receiver_user) { - $this->addError($functionName, 'couldn\'t find receiver in db' ); - return false; - } - if($amount < 0) { - $this->addError($functionName, 'negative amount not supported'); - return false; - } - return true; - } - - public function save($transaction_id, $firstPublic, $received) { - - static $functionName = 'TransactionCreation::save'; - $local_transfer = $this->protoTransactionTransfer->getLocal(); - - $senderAmount = $local_transfer->getSender(); - $receiver = $local_transfer->getReceiver(); - - $transactionTransferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins'); - - $senderUserId = $this->getStateUserId($senderAmount->getPubkey()); - $receiverUserId = $this->getStateUserId($receiver); - - if($senderUserId === NULL || $receiverUserId === NULL) { - return false; - } - - $finalSenderBalance = $this->updateStateBalance($senderUserId, -$senderAmount->getAmount(), $received); - if(false === $finalSenderBalance) { - return false; - } - if(false === $this->updateStateBalance($receiverUserId, $senderAmount->getAmount(), $received)) { - return false; - } - - $transactionTransferEntity = $transactionTransferTable->newEntity(); - $transactionTransferEntity->transaction_id = $transaction_id; - $transactionTransferEntity->state_user_id = $senderUserId; - $transactionTransferEntity->sender_public_key = $senderAmount->getPubkey(); - $transactionTransferEntity->receiver_public_key = $receiver; - $transactionTransferEntity->receiver_user_id = $receiverUserId; - $transactionTransferEntity->amount = $senderAmount->getAmount(); - $transactionTransferEntity->sender_final_balance = $finalSenderBalance; - - if(!$transactionTransferTable->save($transactionTransferEntity)) { - $this->addError($functionName, 'error saving transactionSendCoins with errors: ' . json_encode($transactionTransferEntity->getErrors())); - return false; - } - - if(!$this->addStateUserTransaction($senderUserId, $transaction_id, 2, $senderAmount->getAmount(), $received)) { - return false; - } - if(!$this->addStateUserTransaction($receiverUserId, $transaction_id, 2, -$senderAmount->getAmount(), $received)) { - return false; - } - - //$this->addError('TransactionTransfer::save', 'not implemented yet'); - //return false; - return true; - } - - public function sendNotificationEmail($memo) - { - // send notification email - $disable_email = Configure::read('disableEmail', false); - if($disable_email) return true; - - $local_transfer = $this->protoTransactionTransfer->getLocal(); - $sender = $local_transfer->getSender(); - $senderAmount = $sender->getAmount(); - $senderUser = $this->getStateUserFromPublickey($sender->getPubkey()); - $receiverUser = $this->getStateUserFromPublickey($local_transfer->getReceiver()); - - $serverAdminEmail = Configure::read('ServerAdminEmail'); - - try { - $email = new Email(); - $emailViewBuilder = $email->viewBuilder(); - $emailViewBuilder->setTemplate('notificationTransfer') - ->setVars(['receiverUser' => $receiverUser, - 'senderUser' => $senderUser, - 'gdd_cent' => $senderAmount, - 'memo' => $memo]); - $receiverNames = $receiverUser->getNames(); - if($receiverNames == '' || $receiverUser->email == '') { - $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id); - return false; - } - $noReplyEmail = Configure::read('noReplyEmail'); - $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)']) - ->setTo([$receiverUser->email => $receiverUser->getNames()]) - ->setSubject(__('Gradidos erhalten')) - ->send(); - } catch(Exception $e) { - //$this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); - $this->addWarning('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); - return false; - } - return true; - } - - public function getSenderUser() - { - $local_transfer = $this->protoTransactionTransfer->getLocal(); - return $this->getStateUserFromPublickey($local_transfer->getSender()->getPubkey()); - } - - public function getReceiverUser() - { - $local_transfer = $this->protoTransactionTransfer->getLocal(); - return $this->getStateUserFromPublickey($local_transfer->getReceiver()); - } - - public function getAmount() - { - $local_transfer = $this->protoTransactionTransfer->getLocal(); - $sender = $local_transfer->getSender(); - return $sender->getAmount(); - } - - static public function fromEntity($transactionTransferEntity) - { - $protoTransfer = new \Proto\Gradido\GradidoTransfer(); - - $stateUsersTable = TableRegistry::getTableLocator()->get('state_users'); - - - return new TransactionTransfer($protoTransfer); - } -} - diff --git a/community_server/src/Model/Validation/GenericValidation.php b/community_server/src/Model/Validation/GenericValidation.php deleted file mode 100644 index 839441454..000000000 --- a/community_server/src/Model/Validation/GenericValidation.php +++ /dev/null @@ -1,35 +0,0 @@ -]|>|<|javascript:){1,}/', $value)) { - return false; - } - return true; - } - - public static function email($value, array $context) { - if(preg_match('/^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/', $value)) { - return true; - } - return false; - } -} \ No newline at end of file diff --git a/community_server/src/Model/Validation/TransactionValidation.php b/community_server/src/Model/Validation/TransactionValidation.php deleted file mode 100644 index 9705ef40b..000000000 --- a/community_server/src/Model/Validation/TransactionValidation.php +++ /dev/null @@ -1,49 +0,0 @@ - 'en_GB']); - $numberparts = preg_split('/\./', $checkFloatVal); - //var_dump($numberparts); - if(isset($numberparts[1]) && strlen($numberparts[1]) > 2) return false; - - $floatVal = floatval(Number::format($value, ['places' => 4, 'locale' => 'en_GB'])); - //echo "floatVal: $floatVal
    "; - return $floatVal >= 0.0; - } - - public static function hexKey64($value, array $context) { - if(strlen($value) != 64) return false; - if(preg_match('/^[[:xdigit:]]*$/', $value)) { - return true; - } - return false; - } - - public static function hexKey128($value, array $context) { - if(strlen($value) != 128) return false; - if(preg_match('/^[[:xdigit:]]*$/', $value)) { - return true; - } - return false; - } - - public static function alphaNumeric($value, array $context) { - //if(preg_match('/^[a-zA-Z0-9äöüÄÖÜß _;:()-]\n\r*$/', $value)) { - if(preg_match('/([<>]|>|<|javascript:){1,}/', $value)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/community_server/src/Shell/ConsoleShell.php b/community_server/src/Shell/ConsoleShell.php deleted file mode 100644 index f7bfe8ed4..000000000 --- a/community_server/src/Shell/ConsoleShell.php +++ /dev/null @@ -1,81 +0,0 @@ -err('Unable to load Psy\Shell.'); - $this->err(''); - $this->err('Make sure you have installed psysh as a dependency,'); - $this->err('and that Psy\Shell is registered in your autoloader.'); - $this->err(''); - $this->err('If you are using composer run'); - $this->err(''); - $this->err('$ php composer.phar require --dev psy/psysh'); - $this->err(''); - - return self::CODE_ERROR; - } - - $this->out("You can exit with `CTRL-C` or `exit`"); - $this->out(''); - - Log::drop('debug'); - Log::drop('error'); - $this->_io->setLoggers(false); - restore_error_handler(); - restore_exception_handler(); - - $psy = new PsyShell(); - $psy->run(); - } - - /** - * Display help for this console. - * - * @return \Cake\Console\ConsoleOptionParser - */ - public function getOptionParser() - { - $parser = new ConsoleOptionParser('console'); - $parser->setDescription( - 'This shell provides a REPL that you can use to interact with ' . - 'your application in a command line designed to run PHP code. ' . - 'You can use it to run adhoc queries with your models, or ' . - 'explore the features of CakePHP and your application.' . - "\n\n" . - 'You will need to have psysh installed for this Shell to work.' - ); - - return $parser; - } -} diff --git a/community_server/src/Template/AddressTypes/add.ctp b/community_server/src/Template/AddressTypes/add.ctp deleted file mode 100644 index f62c5115e..000000000 --- a/community_server/src/Template/AddressTypes/add.ctp +++ /dev/null @@ -1,28 +0,0 @@ - - -
    - Form->create($addressType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/AddressTypes/edit.ctp b/community_server/src/Template/AddressTypes/edit.ctp deleted file mode 100644 index 3e363e331..000000000 --- a/community_server/src/Template/AddressTypes/edit.ctp +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - Form->create($addressType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/AddressTypes/index.ctp b/community_server/src/Template/AddressTypes/index.ctp deleted file mode 100644 index 905d406a1..000000000 --- a/community_server/src/Template/AddressTypes/index.ctp +++ /dev/null @@ -1,53 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($addressType->id) ?>name) ?>text) ?> - Html->link(__('View'), ['action' => 'view', $addressType->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $addressType->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $addressType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $addressType->id)]) ?> -
    -
    -
      - Paginator->first('<< ' . __('first')) ?> - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> - Paginator->last(__('last') . ' >>') ?> -
    -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/AddressTypes/view.ctp b/community_server/src/Template/AddressTypes/view.ctp deleted file mode 100644 index 69817e264..000000000 --- a/community_server/src/Template/AddressTypes/view.ctp +++ /dev/null @@ -1,92 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - -
    name) ?>
    text) ?>
    Number->format($addressType->id) ?>
    - - -
    diff --git a/community_server/src/Template/AdminErrors/add.ctp b/community_server/src/Template/AdminErrors/add.ctp deleted file mode 100644 index b69f68213..000000000 --- a/community_server/src/Template/AdminErrors/add.ctp +++ /dev/null @@ -1,30 +0,0 @@ - - -
    - Form->create($adminError) ?> -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('controller'); - echo $this->Form->control('action'); - echo $this->Form->control('state'); - echo $this->Form->control('msg'); - echo $this->Form->control('details'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/AdminErrors/edit.ctp b/community_server/src/Template/AdminErrors/edit.ctp deleted file mode 100644 index dea74b94b..000000000 --- a/community_server/src/Template/AdminErrors/edit.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - -
    - Form->create($adminError) ?> -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('controller'); - echo $this->Form->control('action'); - echo $this->Form->control('state'); - echo $this->Form->control('msg'); - echo $this->Form->control('details'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/AdminErrors/index.ctp b/community_server/src/Template/AdminErrors/index.ctp deleted file mode 100644 index 96e077ce1..000000000 --- a/community_server/src/Template/AdminErrors/index.ctp +++ /dev/null @@ -1,58 +0,0 @@ - - -
    -
    -
    -
    Paginator->sort('id') ?>
    -
    Paginator->sort('state_user_id') ?>
    -
    Paginator->sort('controller') ?>
    -
    Paginator->sort('action') ?>
    -
    Paginator->sort('state') ?>
    -
    Paginator->sort('msg') ?>
    -
    Paginator->sort('details') ?>
    -
    Paginator->sort('created') ?>
    -
    -
    - -
    -
    Number->format($adminError->id) ?>
    -
    has('state_user') ? $this->Html->link($adminError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $adminError->state_user->id]) : '' ?>
    -
    controller) ?>
    -
    action) ?>
    -
    state) ?>
    -
    msg) ?>
    -
    details) ?>
    -
    created) ?>
    -
    - Html->link(__('View'), ['action' => 'view', $adminError->id]) ?> -   - Html->link(__('Edit'), ['action' => 'edit', $adminError->id]) ?> -   - Form->postLink(__('Delete'), ['action' => 'delete', $adminError->id], ['confirm' => __('Are you sure you want to delete # {0}?', $adminError->id)]) ?> -
    -
    - -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/AdminErrors/view.ctp b/community_server/src/Template/AdminErrors/view.ctp deleted file mode 100644 index 0b0bebb64..000000000 --- a/community_server/src/Template/AdminErrors/view.ctp +++ /dev/null @@ -1,54 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    has('state_user') ? $this->Html->link($adminError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $adminError->state_user->id]) : '' ?>
    controller) ?>
    action) ?>
    state) ?>
    msg) ?>
    details) ?>
    Number->format($adminError->id) ?>
    created) ?>
    -
    diff --git a/community_server/src/Template/AppRequests/get_balance.ctp b/community_server/src/Template/AppRequests/get_balance.ctp deleted file mode 100644 index 7dd4d6025..000000000 --- a/community_server/src/Template/AppRequests/get_balance.ctp +++ /dev/null @@ -1,15 +0,0 @@ -element('centToFloat', ['cent' => $body['balance'], 'precision' => 4]); -} -if(isset($body['decay'])) { - $body['decay'] = $this->element('centToFloat', ['cent' => $body['decay'], 'precision' => 4]); -} -?> \ No newline at end of file diff --git a/community_server/src/Template/AppRequests/list_transactions.ctp b/community_server/src/Template/AppRequests/list_transactions.ctp deleted file mode 100644 index 174092273..000000000 --- a/community_server/src/Template/AppRequests/list_transactions.ctp +++ /dev/null @@ -1,31 +0,0 @@ -element('centToFloat', ['cent' => $body['balance'], 'precision' => 4]); -$body['decay'] = $this->element('centToFloat', ['cent' => $body['decay'], 'precision' => 4]); -$body['gdtSum'] = $this->element('centToFloat', ['cent' => $body['gdtSum'], 'precision' => 2]); - -foreach($body['transactions'] as $i => $transaction) { - $useCeil = false; - if(!isset($transaction['type'])) { - $body = ['state' => 'error', 'msg' => 'transaction without type found', 'details' => $transaction]; - } else { - if($transaction['type'] == 'decay') { - $useCeil = true; - } - $body['transactions'][$i]['balance'] = $this->element('centToFloat', ['cent' => $transaction['balance'], 'precision' => 4, 'useCeil' => $useCeil]); - if(isset($transaction['creation_amount'])) { - $body['transactions'][$i]['creation_amount'] = $this->element('centToFloat', ['cent' => $transaction['creation_amount'], 'precision' => 4]); - } - if(isset($transaction['decay'])) { - $body['transactions'][$i]['decay']['balance'] = $this->element('centToFloat', ['cent' => $transaction['decay']['balance'], 'precision' => 4]); - } - } -} - -?> \ No newline at end of file diff --git a/community_server/src/Template/BlockchainTypes/add.ctp b/community_server/src/Template/BlockchainTypes/add.ctp deleted file mode 100644 index bef6b70c5..000000000 --- a/community_server/src/Template/BlockchainTypes/add.ctp +++ /dev/null @@ -1,25 +0,0 @@ - - -
    - Form->create($blockchainType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - echo $this->Form->control('symbol'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/BlockchainTypes/edit.ctp b/community_server/src/Template/BlockchainTypes/edit.ctp deleted file mode 100644 index 40cd7849b..000000000 --- a/community_server/src/Template/BlockchainTypes/edit.ctp +++ /dev/null @@ -1,31 +0,0 @@ - - -
    - Form->create($blockchainType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - echo $this->Form->control('symbol'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/BlockchainTypes/index.ctp b/community_server/src/Template/BlockchainTypes/index.ctp deleted file mode 100644 index 457782043..000000000 --- a/community_server/src/Template/BlockchainTypes/index.ctp +++ /dev/null @@ -1,51 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>Paginator->sort('symbol') ?>
    Number->format($blockchainType->id) ?>name) ?>text) ?>symbol) ?> - Html->link(__('View'), ['action' => 'view', $blockchainType->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $blockchainType->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $blockchainType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $blockchainType->id)]) ?> -
    -
    -
      - Paginator->first('<< ' . __('first')) ?> - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> - Paginator->last(__('last') . ' >>') ?> -
    -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/BlockchainTypes/view.ctp b/community_server/src/Template/BlockchainTypes/view.ctp deleted file mode 100644 index 481cc7b90..000000000 --- a/community_server/src/Template/BlockchainTypes/view.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - - - - - -
    name) ?>
    text) ?>
    symbol) ?>
    Number->format($blockchainType->id) ?>
    -
    diff --git a/community_server/src/Template/Cell/empty b/community_server/src/Template/Cell/empty deleted file mode 100644 index 8b1378917..000000000 --- a/community_server/src/Template/Cell/empty +++ /dev/null @@ -1 +0,0 @@ - diff --git a/community_server/src/Template/CommunityProfiles/add.ctp b/community_server/src/Template/CommunityProfiles/add.ctp deleted file mode 100644 index ab7ce0f6b..000000000 --- a/community_server/src/Template/CommunityProfiles/add.ctp +++ /dev/null @@ -1,24 +0,0 @@ - - -
    - Form->create($communityProfile) ?> -
    - - Form->control('state_user_id'); - echo $this->Form->control('profile_desc'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/CommunityProfiles/edit.ctp b/community_server/src/Template/CommunityProfiles/edit.ctp deleted file mode 100644 index 230e3b685..000000000 --- a/community_server/src/Template/CommunityProfiles/edit.ctp +++ /dev/null @@ -1,30 +0,0 @@ - - -
    - Form->create($communityProfile) ?> -
    - - Form->control('state_user_id'); - echo $this->Form->control('profile_desc'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/CommunityProfiles/index.ctp b/community_server/src/Template/CommunityProfiles/index.ctp deleted file mode 100644 index 12f3c03b1..000000000 --- a/community_server/src/Template/CommunityProfiles/index.ctp +++ /dev/null @@ -1,49 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('profile_desc') ?>
    Number->format($communityProfile->id) ?>Number->format($communityProfile->state_user_id) ?>profile_desc) ?> - Html->link(__('View'), ['action' => 'view', $communityProfile->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $communityProfile->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $communityProfile->id], ['confirm' => __('Are you sure you want to delete # {0}?', $communityProfile->id)]) ?> -
    -
    -
      - Paginator->first('<< ' . __('first')) ?> - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> - Paginator->last(__('last') . ' >>') ?> -
    -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/CommunityProfiles/view.ctp b/community_server/src/Template/CommunityProfiles/view.ctp deleted file mode 100644 index 1f8aaf0f4..000000000 --- a/community_server/src/Template/CommunityProfiles/view.ctp +++ /dev/null @@ -1,32 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - -
    profile_desc) ?>
    Number->format($communityProfile->id) ?>
    Number->format($communityProfile->state_user_id) ?>
    -
    diff --git a/community_server/src/Template/Dashboard/error_http_request.ctp b/community_server/src/Template/Dashboard/error_http_request.ctp deleted file mode 100644 index cdbbec19b..000000000 --- a/community_server/src/Template/Dashboard/error_http_request.ctp +++ /dev/null @@ -1,14 +0,0 @@ -assign('title', __('Error, Please try again')); -?> - -
    - -
    diff --git a/community_server/src/Template/Dashboard/index.ctp b/community_server/src/Template/Dashboard/index.ctp deleted file mode 100644 index fdfe5b072..000000000 --- a/community_server/src/Template/Dashboard/index.ctp +++ /dev/null @@ -1,143 +0,0 @@ -assign( - 'title', - __('Willkommen') . ', ' . $user['first_name'] . ' ' . $user['last_name'] . '!' -); -$this->assign( - 'header', - '

    '.__('Willkommen') . ', ' . $user['first_name'] . ' ' . $user['last_name'] . '!

    ' -); -?> - - ms - -
    -

    Gradido ...

    -
    -
    - account_balance_wallet - Html->link( - __('Kontoübersicht'), - ['controller' => 'StateBalances', 'action' => 'overview'], - ['class' => 'action-button-link'] - );?> -
    -
    - account_balance - Html->link( - __('Überweisung'), - ['controller' => 'TransactionSendCoins', 'action' => 'create'], - ['class' => 'action-button-link'] - ); ?> -
    -
    -
    - - -
    -

    -

    Gradido ...

    -
    -
    - redeem - Html->link( - __('viele schöpfen'), - ['controller' => 'TransactionCreations', 'action' => 'createMulti'], - ['class' => 'action-button-link'] - );?> -
    -
    -
    -
    - Statistik -
    -
    - cached - Html->link( - __('Anmeldungen'), - ['controller' => 'Users', 'action' => 'statistics'], - ['class' => 'info-item-link'] - );?> -
    - -
    - error_outline - Html->link( - __('Fehler') . ' (' . $adminErrorCount . ')', - ['controller' => 'AdminErrors'], ['class' => 'info-item-link']); - ?> -
    - -
    -
    - - -
    -

    Benutzer ...

    -
    -
    - search - Html->link( - __('suchen'), - ['controller' => 'StateUsers', 'action' => 'search'], - ['class' => 'info-item-link'] - ); ?> -
    -
    - how_to_reg - - - -
    -
    - enhanced_encryption - - - -
    -
    -
    -
    -

    Login Server ...

    -
    -
    - groups - - - -
    -
    - servers - - - -
    -
    - topics - - - -
    -
    -
    -
    - hedera_accounts - - - -
    -
    - diff --git a/community_server/src/Template/Dashboard/server_index.ctp b/community_server/src/Template/Dashboard/server_index.ctp deleted file mode 100644 index 1b4da7647..000000000 --- a/community_server/src/Template/Dashboard/server_index.ctp +++ /dev/null @@ -1,36 +0,0 @@ -assign('title', __('Willkommen')); -$this->assign( - 'header', - '

    Server Dashboard, nur für Admins

    ' -); -?> -
    -

    Gradido ...

    -
    -
    - redeem - Html->link( - __('viele schöpfen'), - ['controller' => 'TransactionCreations', 'action' => 'createMulti'], - ['class' => 'action-button-link'] - );?> -
    -
    -
    -
    - error_outline - Html->link( - __('Fehler') . ' (' . $adminErrorCount . ')', - ['controller' => 'AdminErrors'], ['class' => 'info-item-link']); - ?> -
    -
    -
    \ No newline at end of file diff --git a/community_server/src/Template/Element/Flash/default.ctp b/community_server/src/Template/Element/Flash/default.ctp deleted file mode 100644 index 694b244c1..000000000 --- a/community_server/src/Template/Element/Flash/default.ctp +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/community_server/src/Template/Element/Flash/error.ctp b/community_server/src/Template/Element/Flash/error.ctp deleted file mode 100644 index 65a8fbec3..000000000 --- a/community_server/src/Template/Element/Flash/error.ctp +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/community_server/src/Template/Element/Flash/success.ctp b/community_server/src/Template/Element/Flash/success.ctp deleted file mode 100644 index 31a062095..000000000 --- a/community_server/src/Template/Element/Flash/success.ctp +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/community_server/src/Template/Element/centToFloat.ctp b/community_server/src/Template/Element/centToFloat.ctp deleted file mode 100644 index 3beabf837..000000000 --- a/community_server/src/Template/Element/centToFloat.ctp +++ /dev/null @@ -1,22 +0,0 @@ - 0) { - if(isset($useCeil) && $useCeil) { - $transformAmount = ceil($cent / pow(10, $cut_places)); - } else { - $transformAmount = floor($cent / pow(10, $cut_places)); - } -} -if($cut_places < 0) { - $cut_places = 0; -} -echo $transformAmount / pow(10, $precision - $cut_places); - diff --git a/community_server/src/Template/Element/navi.ctp b/community_server/src/Template/Element/navi.ctp deleted file mode 100644 index 33055197f..000000000 --- a/community_server/src/Template/Element/navi.ctp +++ /dev/null @@ -1,38 +0,0 @@ -getRequest()->getSession(); -$errorCount = intval($session->read('StateUser.errorCount')); -$balance = $session->read('StateUser.balance'); -//echo "balance: $balance
    "; -if(!isset($balance)) { - $balance = 0; -} - -$navi = []; -/*if($errorCount > 0) { - $errorNaviEntry = new NaviEntry(__('Fehler '). "($errorCount)", 'mdi-alert-outline', 'StateErrors', 'showForUser'); - $errorNaviEntry->setBGColor('bg-inverse-danger') - ->setIconColor('alert-color'); - array_push($navi, $errorNaviEntry); -}*/ -$balanceNaviEntry = new NaviEntry( - __('Kontoübersicht') . ' (' . - str_replace(array("\r", "\n"), '', strip_tags($this->element('printGradido', ['number' => $balance]))) - . ' )', - 'account_balance_wallet', 'StateBalances', 'overview' -); -if($balance < 0 ) { - //$balanceNaviEntry->setIconColor('alert-color'); -} else if($balance > 0) { - //$balanceNaviEntry->setIconColor('success-color'); -} -array_push($navi, $balanceNaviEntry); -array_push($navi, new NaviEntry(__('Startseite'), 'home', 'Dashboard', 'index')); -array_push($navi, new NaviEntry(__('Überweisung'), 'account_balance', 'TransactionSendCoins', 'create')); -array_push($navi, new NaviEntryExternLink(__('Mitgliederbereich'), 'people_alt', 'https://elopage.com/s/gradido/sign_in')); - -?> - diff --git a/community_server/src/Template/Element/navi_center.ctp b/community_server/src/Template/Element/navi_center.ctp deleted file mode 100644 index d07f44978..000000000 --- a/community_server/src/Template/Element/navi_center.ctp +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/community_server/src/Template/Element/navi_header.ctp b/community_server/src/Template/Element/navi_header.ctp deleted file mode 100644 index cbc2eea97..000000000 --- a/community_server/src/Template/Element/navi_header.ctp +++ /dev/null @@ -1,45 +0,0 @@ -getRequest()->getSession(); -$errorCount = intval($session->read('StateUser.errorCount')); -$transactionPendings = $session->read('Transactions.pending'); - -/* -class NavHeaderEntry -{ - public function __construct($icon_name, $controller, $action, $title) { - ; - } - - public function -} -*/ -?> - \ No newline at end of file diff --git a/community_server/src/Template/Element/navi_notify.ctp b/community_server/src/Template/Element/navi_notify.ctp deleted file mode 100644 index 12ae74465..000000000 --- a/community_server/src/Template/Element/navi_notify.ctp +++ /dev/null @@ -1,44 +0,0 @@ -getRequest()->getSession(); -$errorCount = intval($session->read('StateUser.errorCount')); -$transactionPendings = $session->read('Transactions.pending'); -$transactionPendings += $session->read('Transactions.can_signed'); - -/* -class NavHeaderEntry -{ - public function __construct($icon_name, $controller, $action, $title) { - ; - } - - public function -} -*/ -?> - 0) : ?> - Html->link( - 'announcement' - . 'ss', - ['controller' => 'StateErrors', 'action' => 'ShowForUser'], - ['class' => 'nav-link', 'escape' => false, 'title' => "$errorCount " . __('Fehler')]) ?> - - 0) : ?> - " href="account/checkTransactions"> - verified_user - - () - - - diff --git a/community_server/src/Template/Element/printEuro.ctp b/community_server/src/Template/Element/printEuro.ctp deleted file mode 100644 index 976e4e007..000000000 --- a/community_server/src/Template/Element/printEuro.ctp +++ /dev/null @@ -1,24 +0,0 @@ - 0) $class = "grd-positive-currency";*/ -if($number < 0) { - $class = 'grd-negative-currency'; -} - -?> -Number->format(intval($number) / 100.0, ['precision' => 2]) . ' €';?> - - - Number->format(intval($number) / 100.0, ['precision' => 2]) . ' €';?> - - \ No newline at end of file diff --git a/community_server/src/Template/Element/printGDT.ctp b/community_server/src/Template/Element/printGDT.ctp deleted file mode 100644 index 8052283d0..000000000 --- a/community_server/src/Template/Element/printGDT.ctp +++ /dev/null @@ -1,24 +0,0 @@ - 0) $class = "grd-positive-currency";*/ -if($number < 0) { - $class = 'grd-negative-currency'; -} - -?> -Number->format(intval($number) / 100.0, ['precision' => 2]) . ' GDT';?> - - - Number->format(intval($number) / 100.0, ['precision' => 2]) . ' GDT';?> - - \ No newline at end of file diff --git a/community_server/src/Template/Element/printGradido.ctp b/community_server/src/Template/Element/printGradido.ctp deleted file mode 100644 index 404bdb70d..000000000 --- a/community_server/src/Template/Element/printGradido.ctp +++ /dev/null @@ -1,19 +0,0 @@ - -Number->format(intval($number) / 10000.0, ['precision' => 2]) . ' GDD';?> - - - Number->format(intval($number) / 10000.0, ['precision' => 2]) . ' GDD';?> - - \ No newline at end of file diff --git a/community_server/src/Template/Element/user_menu.ctp b/community_server/src/Template/Element/user_menu.ctp deleted file mode 100644 index 633674233..000000000 --- a/community_server/src/Template/Element/user_menu.ctp +++ /dev/null @@ -1,43 +0,0 @@ -getRequest()->getSession(); -$user = $session->read('StateUser'); -$transactionPendings = $session->read('Transactions.pending'); -$this->set('user', $user); -$navi = []; -array_push($navi, new NaviEntry(__('Mein Profil'), 'build', 'Profile', 'index')); -if(intval($transactionPendings) > 0) { -/* array_push($navi, new NaviEntryAbsoluteLink( - __("Transaktionen unterzeichnen") . ' (' . intval($transactionPendings) . ')', - 'mdi-signature-freehand', 'account/checkTransactions' - ));*/ -} else { - array_push($navi, new NaviEntryAbsoluteLink(__('Abmelden'), 'exit_to_app', 'account/logout')); -} -?> -
    - - account_circle -
    - - \ No newline at end of file diff --git a/community_server/src/Template/ElopageBuys/add.ctp b/community_server/src/Template/ElopageBuys/add.ctp deleted file mode 100644 index e9c2c6a80..000000000 --- a/community_server/src/Template/ElopageBuys/add.ctp +++ /dev/null @@ -1,33 +0,0 @@ - - -
    - Form->create($elopageBuy) ?> -
    - - Form->control('elopage_user_id'); - echo $this->Form->control('affiliate_program_id'); - echo $this->Form->control('publisher_id'); - echo $this->Form->control('order_id'); - echo $this->Form->control('product_id'); - echo $this->Form->control('product_price'); - echo $this->Form->control('payer_email'); - echo $this->Form->control('publisher_email'); - echo $this->Form->control('payed'); - echo $this->Form->control('success_date'); - echo $this->Form->control('event'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/ElopageBuys/edit.ctp b/community_server/src/Template/ElopageBuys/edit.ctp deleted file mode 100644 index e33956b83..000000000 --- a/community_server/src/Template/ElopageBuys/edit.ctp +++ /dev/null @@ -1,39 +0,0 @@ - - -
    - Form->create($elopageBuy) ?> -
    - - Form->control('elopage_user_id'); - echo $this->Form->control('affiliate_program_id'); - echo $this->Form->control('publisher_id'); - echo $this->Form->control('order_id'); - echo $this->Form->control('product_id'); - echo $this->Form->control('product_price'); - echo $this->Form->control('payer_email'); - echo $this->Form->control('publisher_email'); - echo $this->Form->control('payed'); - echo $this->Form->control('success_date'); - echo $this->Form->control('event'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/ElopageBuys/index.ctp b/community_server/src/Template/ElopageBuys/index.ctp deleted file mode 100644 index 4d5ecc1d1..000000000 --- a/community_server/src/Template/ElopageBuys/index.ctp +++ /dev/null @@ -1,67 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('elopage_user_id') ?>Paginator->sort('affiliate_program_id') ?>Paginator->sort('publisher_id') ?>Paginator->sort('order_id') ?>Paginator->sort('product_id') ?>Paginator->sort('product_price') ?>Paginator->sort('payer_email') ?>Paginator->sort('publisher_email') ?>Paginator->sort('payed') ?>Paginator->sort('success_date') ?>Paginator->sort('event') ?>
    Number->format($elopageBuy->id) ?>Number->format($elopageBuy->elopage_user_id) ?>Number->format($elopageBuy->affiliate_program_id) ?>Number->format($elopageBuy->publisher_id) ?>Number->format($elopageBuy->order_id) ?>Number->format($elopageBuy->product_id) ?>Number->format($elopageBuy->product_price) ?>payer_email) ?>publisher_email) ?>payed) ?>success_date) ?>event) ?> - Html->link(__('View'), ['action' => 'view', $elopageBuy->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $elopageBuy->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $elopageBuy->id], ['confirm' => __('Are you sure you want to delete # {0}?', $elopageBuy->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/ElopageBuys/statistics.ctp b/community_server/src/Template/ElopageBuys/statistics.ctp deleted file mode 100644 index 3ac6cf7f6..000000000 --- a/community_server/src/Template/ElopageBuys/statistics.ctp +++ /dev/null @@ -1,35 +0,0 @@ -toArray()); -/*foreach($elopageBuys as $entry) { - echo $entry->success_date . "
    "; -} - * - */ -/*foreach($users as $user) { - //var_dump($user); - echo $user->created; - echo "
    "; -}*/ -?> -
    -
    -
    -
    -
    -
    -
    -

    count()?>

    - - 12.01% -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/community_server/src/Template/ElopageBuys/view.ctp b/community_server/src/Template/ElopageBuys/view.ctp deleted file mode 100644 index 2631e17fe..000000000 --- a/community_server/src/Template/ElopageBuys/view.ctp +++ /dev/null @@ -1,68 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    payer_email) ?>
    publisher_email) ?>
    event) ?>
    Number->format($elopageBuy->id) ?>
    Number->format($elopageBuy->elopage_user_id) ?>
    Number->format($elopageBuy->affiliate_program_id) ?>
    Number->format($elopageBuy->publisher_id) ?>
    Number->format($elopageBuy->order_id) ?>
    Number->format($elopageBuy->product_id) ?>
    Number->format($elopageBuy->product_price) ?>
    success_date) ?>
    payed ? __('Yes') : __('No'); ?>
    -
    diff --git a/community_server/src/Template/Email/html/default.ctp b/community_server/src/Template/Email/html/default.ctp deleted file mode 100644 index ac3daa7fe..000000000 --- a/community_server/src/Template/Email/html/default.ctp +++ /dev/null @@ -1,20 +0,0 @@ - ' . $line . "

    \n"; -endforeach; diff --git a/community_server/src/Template/Email/text/default.ctp b/community_server/src/Template/Email/text/default.ctp deleted file mode 100644 index 862cd9f76..000000000 --- a/community_server/src/Template/Email/text/default.ctp +++ /dev/null @@ -1,16 +0,0 @@ -assign('title', __('Gradido Schöpfung')); -?> first_name ?> last_name ?>, - -element('printGradido', ['number' => $gdd_cent, 'raw' => true])) ?> -Gradido Akademie schreibt: - - - - - - -Gradido Community Server \ No newline at end of file diff --git a/community_server/src/Template/Email/text/notification_transaction_failed.ctp b/community_server/src/Template/Email/text/notification_transaction_failed.ctp deleted file mode 100644 index 975848e58..000000000 --- a/community_server/src/Template/Email/text/notification_transaction_failed.ctp +++ /dev/null @@ -1,50 +0,0 @@ -assign('title', __('Gradido Transaktion fehlgeschlagen')); - -$transaction_body = $transaction->getTransactionBody(); -$specific_transaction = $transaction_body->getSpecificTransaction(); -$transaction_type_name = $transaction_body->getTransactionTypeName(); - -?> first_name ?> last_name ?>, - - - - -element('printGradido', ['number' => $specific_transaction->getAmount(), 'raw' => true]), - $specific_transaction->getReceiverUser()->getEmailWithName()) ?> - -getTargetDate()->format('d.m.Y') ?> - -element('printGradido', ['number' => $specific_transaction->getAmount(), 'raw' => true]), - $specific_transaction->getReceiverUser()->getEmailWithName()) ?> - - - - - -getErrors(); - foreach($errors as $error) { - //echo "\t".json_encode($error); - echo "\n\t".$error[array_keys($error)[0]]."\n"; - } -}?> - - - - - - -Gradido Community Server \ No newline at end of file diff --git a/community_server/src/Template/Email/text/notification_transfer.ctp b/community_server/src/Template/Email/text/notification_transfer.ctp deleted file mode 100644 index 05df9695d..000000000 --- a/community_server/src/Template/Email/text/notification_transfer.ctp +++ /dev/null @@ -1,26 +0,0 @@ -assign('title', __('Gradido Überweisung')); -$receiverNames = $receiverUser->first_name . ' ' . $receiverUser->last_name; -$senderNames = $senderUser->first_name . ' ' . $senderUser->last_name; -$senderNamesEmail = $senderUser->getEmailWithName(); -?> , - -element('printGradido', ['number' => $gdd_cent, 'raw' => true]), $senderNamesEmail) ?> - - - - - - - -email ?> - - - -Gradido Community Server \ No newline at end of file diff --git a/community_server/src/Template/Error/error400.ctp b/community_server/src/Template/Error/error400.ctp deleted file mode 100644 index 6b538b7f4..000000000 --- a/community_server/src/Template/Error/error400.ctp +++ /dev/null @@ -1,38 +0,0 @@ -layout = 'error'; - -if (Configure::read('debug')) : - $this->layout = 'dev_error'; - - $this->assign('title', $message); - $this->assign('templateName', 'error400.ctp'); - - $this->start('file'); -?> -queryString)) : ?> -

    - SQL Query: - queryString) ?> -

    - -params)) : ?> - SQL Query Params: - params) ?> - -element('auto_table_warning') ?> -end(); -endif; -?> -

    -

    - : - '{$url}'") ?> -

    diff --git a/community_server/src/Template/Error/error500.ctp b/community_server/src/Template/Error/error500.ctp deleted file mode 100644 index 3328cc52c..000000000 --- a/community_server/src/Template/Error/error500.ctp +++ /dev/null @@ -1,43 +0,0 @@ -layout = 'error'; - -if (Configure::read('debug')) : - $this->layout = 'dev_error'; - - $this->assign('title', $message); - $this->assign('templateName', 'error500.ctp'); - - $this->start('file'); -?> -queryString)) : ?> -

    - SQL Query: - queryString) ?> -

    - -params)) : ?> - SQL Query Params: - params) ?> - - - Error in: - getFile()), $error->getLine()) ?> - -element('auto_table_warning'); - - if (extension_loaded('xdebug')) : - xdebug_print_function_stack(); - endif; - - $this->end(); -endif; -?> -

    -

    - : - -

    diff --git a/community_server/src/Template/Layout/Email/html/default.ctp b/community_server/src/Template/Layout/Email/html/default.ctp deleted file mode 100644 index 3ff87ff83..000000000 --- a/community_server/src/Template/Layout/Email/html/default.ctp +++ /dev/null @@ -1,24 +0,0 @@ - - - - - <?= $this->fetch('title') ?> - - - fetch('content') ?> - - diff --git a/community_server/src/Template/Layout/Email/text/default.ctp b/community_server/src/Template/Layout/Email/text/default.ctp deleted file mode 100644 index 29b439ccc..000000000 --- a/community_server/src/Template/Layout/Email/text/default.ctp +++ /dev/null @@ -1,16 +0,0 @@ -fetch('content'); diff --git a/community_server/src/Template/Layout/ajax.ctp b/community_server/src/Template/Layout/ajax.ctp deleted file mode 100644 index 29b439ccc..000000000 --- a/community_server/src/Template/Layout/ajax.ctp +++ /dev/null @@ -1,16 +0,0 @@ -fetch('content'); diff --git a/community_server/src/Template/Layout/default.ctp b/community_server/src/Template/Layout/default.ctp deleted file mode 100644 index 4633502df..000000000 --- a/community_server/src/Template/Layout/default.ctp +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Html->charset() ?> - - - <?= $cakeDescription ?>: - <?= $this->fetch('title') ?> - - Html->meta('icon') ?> - Html->css(['main.css']) ?> - Html->script(['basic']) ?> - fetch('meta') ?> - fetch('css') ?> - fetch('script') ?> - - -
    -
    - -

    fetch('title') ?>

    - Flash->render() ?> - fetch('content') ?> -
    -
    - -
    - ms -
    - - - diff --git a/community_server/src/Template/Layout/error.ctp b/community_server/src/Template/Layout/error.ctp deleted file mode 100644 index 7367c1bf7..000000000 --- a/community_server/src/Template/Layout/error.ctp +++ /dev/null @@ -1,47 +0,0 @@ - - - - - Html->charset() ?> - - <?= $this->fetch('title') ?> - - Html->meta('icon') ?> - - Html->css('base.css') ?> - Html->css('style.css') ?> - - fetch('meta') ?> - fetch('css') ?> - fetch('script') ?> - - -
    - -
    - Flash->render() ?> - - fetch('content') ?> -
    - -
    - - diff --git a/community_server/src/Template/Layout/frontend.ctp b/community_server/src/Template/Layout/frontend.ctp deleted file mode 100644 index cb01fea30..000000000 --- a/community_server/src/Template/Layout/frontend.ctp +++ /dev/null @@ -1,113 +0,0 @@ -"; -//echo "transactions pending: " . $transactionPendings; -?> - - - - Html->charset() ?> - - - <?= $cakeDescription ?>: - <?= $this->fetch('title') ?> - - Html->meta('icon') ?> - Html->css(['main.css']) ?> - Html->script(['basic']) ?> - fetch('meta') ?> - fetch('css') ?> - fetch('script') ?> - - -
    -
    - element('navi_notify'); ?> -
    -
    - element('user_menu'); ?> -
    -
    - menu -
    - - - -
    - fetch('header')): ?> -
    - fetch('header') ?> -
    - -
    - fetch('content') ?> -
    -
    - - -
    - - ms - -
    -
    -

    -

    Alpha 0.20.06.03

    -
    -
    - - \ No newline at end of file diff --git a/community_server/src/Template/Layout/rss/default.ctp b/community_server/src/Template/Layout/rss/default.ctp deleted file mode 100644 index 8269be212..000000000 --- a/community_server/src/Template/Layout/rss/default.ctp +++ /dev/null @@ -1,11 +0,0 @@ -fetch('title'); -endif; - -echo $this->Rss->document( - $this->Rss->channel([], $channel, $this->fetch('content')) -); diff --git a/community_server/src/Template/OperatorTypes/add.ctp b/community_server/src/Template/OperatorTypes/add.ctp deleted file mode 100644 index c50feecf0..000000000 --- a/community_server/src/Template/OperatorTypes/add.ctp +++ /dev/null @@ -1,26 +0,0 @@ - - -
    - Form->create($operatorType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/OperatorTypes/edit.ctp b/community_server/src/Template/OperatorTypes/edit.ctp deleted file mode 100644 index 0b61f0f7a..000000000 --- a/community_server/src/Template/OperatorTypes/edit.ctp +++ /dev/null @@ -1,32 +0,0 @@ - - -
    - Form->create($operatorType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/OperatorTypes/index.ctp b/community_server/src/Template/OperatorTypes/index.ctp deleted file mode 100644 index 52a49b547..000000000 --- a/community_server/src/Template/OperatorTypes/index.ctp +++ /dev/null @@ -1,51 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($operatorType->id) ?>name) ?>text) ?> - Html->link(__('View'), ['action' => 'view', $operatorType->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $operatorType->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $operatorType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $operatorType->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/OperatorTypes/view.ctp b/community_server/src/Template/OperatorTypes/view.ctp deleted file mode 100644 index a7cb775cf..000000000 --- a/community_server/src/Template/OperatorTypes/view.ctp +++ /dev/null @@ -1,61 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - -
    name) ?>
    text) ?>
    Number->format($operatorType->id) ?>
    - -
    diff --git a/community_server/src/Template/Operators/add.ctp b/community_server/src/Template/Operators/add.ctp deleted file mode 100644 index 6696cce5c..000000000 --- a/community_server/src/Template/Operators/add.ctp +++ /dev/null @@ -1,26 +0,0 @@ - - -
    - Form->create($operator) ?> -
    - - Form->control('username'); - echo $this->Form->control('user_pubkey'); - echo $this->Form->control('operator_type_id'); - echo $this->Form->control('data_base64'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Operators/edit.ctp b/community_server/src/Template/Operators/edit.ctp deleted file mode 100644 index 88a348e59..000000000 --- a/community_server/src/Template/Operators/edit.ctp +++ /dev/null @@ -1,32 +0,0 @@ - - -
    - Form->create($operator) ?> -
    - - Form->control('username'); - echo $this->Form->control('user_pubkey'); - echo $this->Form->control('operator_type_id'); - echo $this->Form->control('data_base64'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Operators/index.ctp b/community_server/src/Template/Operators/index.ctp deleted file mode 100644 index 3da9a6afb..000000000 --- a/community_server/src/Template/Operators/index.ctp +++ /dev/null @@ -1,56 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - operator_type->name ?> - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('username') ?>Paginator->sort('user_pubkey') ?>Paginator->sort('operator_type_id') ?>Paginator->sort('data_base64') ?>Paginator->sort('modified') ?>
    Number->format($operator->id) ?>username) ?>user_pubkey)) ?>Html->link(__($operator->operator_type->name), ['controller' => 'OperatorTypes', 'action' => 'view', $operator->operator_type_id]) ?>data_base64) ?>modified) ?> - Html->link(__('View'), ['action' => 'view', $operator->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $operator->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $operator->id], ['confirm' => __('Are you sure you want to delete # {0}?', $operator->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/Operators/view.ctp b/community_server/src/Template/Operators/view.ctp deleted file mode 100644 index a317c8e17..000000000 --- a/community_server/src/Template/Operators/view.ctp +++ /dev/null @@ -1,40 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - -
    username) ?>
    user_pubkey)) ?>
    data_base64) ?>
    Number->format($operator->id) ?>
    Number->format($operator->operator_type_id) ?>
    -
    diff --git a/community_server/src/Template/Pages/cake_home.ctp b/community_server/src/Template/Pages/cake_home.ctp deleted file mode 100644 index 5a3731e4c..000000000 --- a/community_server/src/Template/Pages/cake_home.ctp +++ /dev/null @@ -1,276 +0,0 @@ -layout = false; - -if (!Configure::read('debug')) : - throw new NotFoundException( - 'Please replace src/Template/Pages/home.ctp with your own version or re-enable debug mode.' - ); -endif; - -$cakeDescription = 'CakePHP: the rapid development PHP framework'; -?> - - - - Html->charset() ?> - - - <?= $cakeDescription ?> - - - Html->meta('icon') ?> - Html->css('base.css') ?> - Html->css('style.css') ?> - Html->css('home.css') ?> - - - - -
    -
    Html->image('cake.logo.svg') ?>
    -
    -

    Welcome to CakePHP Red Velvet. Build fast. Grow solid.

    -
    -
    - -
    -
    -
    -

    Please be aware that this page will not be shown if you turn off debug mode unless you replace src/Template/Pages/home.ctp with your own version.

    -
    -
    - -
    - -
    -
    - -
    -
    -

    Environment

    -
      - =')) : ?> -
    • Your version of PHP is 5.6.0 or higher (detected ).
    • - -
    • Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected ).
    • - - - -
    • Your version of PHP has the mbstring extension loaded.
    • - -
    • Your version of PHP does NOT have the mbstring extension loaded.
    • - - - -
    • Your version of PHP has the openssl extension loaded.
    • - -
    • Your version of PHP has the mcrypt extension loaded.
    • - -
    • Your version of PHP does NOT have the openssl or mcrypt extension loaded.
    • - - - -
    • Your version of PHP has the intl extension loaded.
    • - -
    • Your version of PHP does NOT have the intl extension loaded.
    • - -
    -
    -
    -

    Filesystem

    -
      - -
    • Your tmp directory is writable.
    • - -
    • Your tmp directory is NOT writable.
    • - - - -
    • Your logs directory is writable.
    • - -
    • Your logs directory is NOT writable.
    • - - - - -
    • The Engine is being used for core caching. To change the config edit config/app.php
    • - -
    • Your cache is NOT working. Please check the settings in config/app.php
    • - -
    -
    -
    -
    - -
    -
    -

    Database

    - connect(); - } catch (Exception $connectionError) { - $connected = false; - $errorMsg = $connectionError->getMessage(); - if (method_exists($connectionError, 'getAttributes')) : - $attributes = $connectionError->getAttributes(); - if (isset($errorMsg['message'])) : - $errorMsg .= '
    ' . $attributes['message']; - endif; - endif; - } - ?> -
      - -
    • CakePHP is able to connect to the database.
    • - -
    • CakePHP is NOT able to connect to the database.
    • - -
    -
    -
    -

    DebugKit

    -
      - -
    • DebugKit is loaded.
    • - -
    • DebugKit is NOT loaded. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
    • - -
    -
    -
    -
    - -
    -
    -

    Editing this Page

    -
      -
    • To change the content of this page, edit: src/Template/Pages/home.ctp.
    • -
    • You can also add some CSS styles for your pages at: webroot/css/.
    • -
    -
    -
    -

    Getting Started

    - -
    -
    - -
    -
    -

    More about Cake

    -

    - CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Front Controller and MVC.
    - Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility. -

    -
    -
    -
    - -
    -
    - P -

    Help and Bug Reports

    - -
    -
    - r -

    Docs and Downloads

    - -
    -
    - s -

    Training and Certification

    - -
    -
    - - - diff --git a/community_server/src/Template/Pages/gradido.ctp b/community_server/src/Template/Pages/gradido.ctp deleted file mode 100644 index f6a2213cc..000000000 --- a/community_server/src/Template/Pages/gradido.ctp +++ /dev/null @@ -1,14 +0,0 @@ -layout = false;?> - - Web Assembly Test (CakePHP Single Node Version) - - - -
    Wird geladen...
    - - - - - \ No newline at end of file diff --git a/community_server/src/Template/Pages/home.ctp b/community_server/src/Template/Pages/home.ctp deleted file mode 100644 index 3926921c4..000000000 --- a/community_server/src/Template/Pages/home.ctp +++ /dev/null @@ -1,19 +0,0 @@ -layout = false;?> - - Web Assembly Test (CakePHP Single Node Version) - - - -
    -
    -

    Gradido

    -

    Implementierung wählen

    -
    - -
    - - - \ No newline at end of file diff --git a/community_server/src/Template/Pages/js.ctp b/community_server/src/Template/Pages/js.ctp deleted file mode 100644 index 60868adc4..000000000 --- a/community_server/src/Template/Pages/js.ctp +++ /dev/null @@ -1,41 +0,0 @@ -layout = false;?> - - - - - - - - - BootstrapVue Argon Dashboard by Creative Tim - - - - - - - - - -
    - wird geladen... -
    - - - - diff --git a/community_server/src/Template/Pages/visitor.ctp b/community_server/src/Template/Pages/visitor.ctp deleted file mode 100644 index e6956c97c..000000000 --- a/community_server/src/Template/Pages/visitor.ctp +++ /dev/null @@ -1,16 +0,0 @@ -layout = false;?> - - - - Visitor Page - - - - -
    Info Page for Visitor to learn about group before try to enter or connect (befriend)
    - - diff --git a/community_server/src/Template/Profile/edit.ctp b/community_server/src/Template/Profile/edit.ctp deleted file mode 100644 index edddf1631..000000000 --- a/community_server/src/Template/Profile/edit.ctp +++ /dev/null @@ -1,41 +0,0 @@ -assign('title', __('Profil ändern')); -// In a View class -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -?> -
    -
    - Form->create($profileForm, ['enctype' => 'multipart/form-data']) ?> - Form->control('first_name', ['label' => __('Vorname'), 'placeholder' => 'Vorname', 'value' => $user['first_name']]) ?> - Form->control('last_name', ['label' => __('Nachname'), 'placeholder' => 'Nachname', 'value' => $user['last_name']]) ?> - Form->control('profile_img', ['type' => 'file', 'accept' => 'image/*', 'label' => __('Profilbild')]) ?> - - -
    - - Form->control('profile_desc', ['label' => __('Beschreibung'), 'rows' => 4, 'placeholder' => 'Beschreibung', 'value' => $communityProfile['profile_desc']]) ?> - Form->button(__('Daten speichern'), ['name' => 'submit', 'class' => 'form-button']) ?> - Form->end() ?> -
    -
    - -Html->script(['core', 'vendor.addons']); ?> - diff --git a/community_server/src/Template/Profile/index.ctp b/community_server/src/Template/Profile/index.ctp deleted file mode 100644 index b77ff9f70..000000000 --- a/community_server/src/Template/Profile/index.ctp +++ /dev/null @@ -1,82 +0,0 @@ -'; -$header .= '

    '.$user['first_name'] . ' ' . $user['last_name'] . '

    '; -if (!empty($communityProfile['profile_desc'])) { - $header .= "

    ".$communityProfile['profile_desc']."

    "; -} -$header .= '
    '; -if ($communityProfile && $communityProfile['profile_img']) { - $header .= "
    "; -} -$this->assign('title', __('Mein Profil')); -$this->assign('header', $header); -?> - - ms - -
    -

    - - Meine Daten -

    -
    - -
    - -

    - - Passwort ändern -

    -
    - -
    -
    diff --git a/community_server/src/Template/Roles/add.ctp b/community_server/src/Template/Roles/add.ctp deleted file mode 100644 index c671ed011..000000000 --- a/community_server/src/Template/Roles/add.ctp +++ /dev/null @@ -1,23 +0,0 @@ - - -
    - Form->create($role) ?> -
    - - Form->control('title'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Roles/edit.ctp b/community_server/src/Template/Roles/edit.ctp deleted file mode 100644 index 8a7cd385f..000000000 --- a/community_server/src/Template/Roles/edit.ctp +++ /dev/null @@ -1,29 +0,0 @@ - - -
    - Form->create($role) ?> -
    - - Form->control('title'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Roles/index.ctp b/community_server/src/Template/Roles/index.ctp deleted file mode 100644 index 2637ef958..000000000 --- a/community_server/src/Template/Roles/index.ctp +++ /dev/null @@ -1,47 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('title') ?>
    Number->format($role->id) ?>title) ?> - Html->link(__('View'), ['action' => 'view', $role->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $role->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $role->id], ['confirm' => __('Are you sure you want to delete # {0}?', $role->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/Roles/view.ctp b/community_server/src/Template/Roles/view.ctp deleted file mode 100644 index 04e1dcec5..000000000 --- a/community_server/src/Template/Roles/view.ctp +++ /dev/null @@ -1,28 +0,0 @@ - - -
    -

    title) ?>

    - - - - - - - - - -
    title) ?>
    Number->format($role->id) ?>
    -
    diff --git a/community_server/src/Template/ServerUsers/add.ctp b/community_server/src/Template/ServerUsers/add.ctp deleted file mode 100644 index 35907282b..000000000 --- a/community_server/src/Template/ServerUsers/add.ctp +++ /dev/null @@ -1,26 +0,0 @@ - - -
    - Form->create($serverUser) ?> -
    - - Form->control('username'); - echo $this->Form->control('password'); - echo $this->Form->control('email'); - echo $this->Form->control('role'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/ServerUsers/edit.ctp b/community_server/src/Template/ServerUsers/edit.ctp deleted file mode 100644 index df812d032..000000000 --- a/community_server/src/Template/ServerUsers/edit.ctp +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - Form->create($serverUser) ?> -
    - - Form->control('username'); - echo $this->Form->control('password'); - echo $this->Form->control('email'); - echo $this->Form->control('role'); - echo $this->Form->control('activated'); - echo $this->Form->control('last_login', ['empty' => true]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/ServerUsers/index.ctp b/community_server/src/Template/ServerUsers/index.ctp deleted file mode 100644 index a6e14cedc..000000000 --- a/community_server/src/Template/ServerUsers/index.ctp +++ /dev/null @@ -1,59 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('username') ?>Paginator->sort('email') ?>Paginator->sort('role') ?>Paginator->sort('activated') ?>Paginator->sort('last_login') ?>Paginator->sort('created') ?>Paginator->sort('modified') ?>
    Number->format($serverUser->id) ?>username) ?>email) ?>role) ?>activated) ?>last_login) ?>created) ?>modified) ?> - Html->link(__('View'), ['action' => 'view', $serverUser->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $serverUser->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $serverUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $serverUser->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/ServerUsers/login.ctp b/community_server/src/Template/ServerUsers/login.ctp deleted file mode 100644 index 4996d5e7b..000000000 --- a/community_server/src/Template/ServerUsers/login.ctp +++ /dev/null @@ -1,22 +0,0 @@ -loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -?> -Flash->render() ?> -
    - Form->create() ?> -
    - - Form->control('username') ?> - Form->control('password') ?> -
    - Form->button(__('Login'), ['class' => 'form-button']); ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/ServerUsers/view.ctp b/community_server/src/Template/ServerUsers/view.ctp deleted file mode 100644 index 0d3a9ae21..000000000 --- a/community_server/src/Template/ServerUsers/view.ctp +++ /dev/null @@ -1,56 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    username) ?>
    password) ?>
    email) ?>
    role) ?>
    Number->format($serverUser->id) ?>
    last_login) ?>
    created) ?>
    modified) ?>
    activated ? __('Yes') : __('No'); ?>
    -
    diff --git a/community_server/src/Template/StateBalances/add.ctp b/community_server/src/Template/StateBalances/add.ctp deleted file mode 100644 index 64ef5d576..000000000 --- a/community_server/src/Template/StateBalances/add.ctp +++ /dev/null @@ -1,27 +0,0 @@ - - -
    - Form->create($stateBalance) ?> - add -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('amount'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateBalances/edit.ctp b/community_server/src/Template/StateBalances/edit.ctp deleted file mode 100644 index c4a6c1e81..000000000 --- a/community_server/src/Template/StateBalances/edit.ctp +++ /dev/null @@ -1,33 +0,0 @@ - - -
    - Form->create($stateBalance) ?> - edit -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('amount'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateBalances/index.ctp b/community_server/src/Template/StateBalances/index.ctp deleted file mode 100644 index 4b0db06d6..000000000 --- a/community_server/src/Template/StateBalances/index.ctp +++ /dev/null @@ -1,54 +0,0 @@ - - -
    -

    - index - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('modified') ?>Paginator->sort('amount') ?>
    Number->format($stateBalance->id) ?>has('state_user') ? $this->Html->link($stateBalance->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateBalance->state_user->id]) : '' ?>modified) ?>Number->format($stateBalance->amount) ?> - Html->link(__('View'), ['action' => 'view', $stateBalance->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateBalance->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateBalance->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateBalance->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateBalances/overview.ctp b/community_server/src/Template/StateBalances/overview.ctp deleted file mode 100644 index 1f2f4c811..000000000 --- a/community_server/src/Template/StateBalances/overview.ctp +++ /dev/null @@ -1,166 +0,0 @@ -assign('title', __('Kontoübersicht')); - -$header = '

    ' . __('Aktueller Kontostand: ') . '

    ' . - '

    ' . $this->element('printGradido', ['number' => $balance]) . '

    '; - -if($gdtSum > 0) { - $header .= '

    '.$this->Html->link( - $this->element('printGDT', ['number' => $gdtSum]), - ['action' => 'overview_gdt'], - ['escape' => false] - ).'

    '; -} -$this->assign('header', $header); -//var_dump($transactions); -?> - - 0) : ?> -
    - -
    - -
    -

    Überweisungen

    -

    Berechnet (debugging): element('printGradido', ['number' => $calculated_balance]) ?>

    -
    -
    -
    -
    -
    -
    -
    -
    - 30) { - $memoShort = substr($memoShort, 0, 30) . '...'; - } - $cellColorClass = 'success-color'; - if($send) { - $balance = -$balance; - $cellColorClass = 'alert-color'; - } else if($transaction['type'] == 'creation') { - $cellColorClass = 'orange-color'; - } else if($transaction['type'] == 'decay') { - $cellColorClass = 'red-color'; - } - ?> -
    -
    - Html->image('50x50.png', ['class' => 'profile-img', 'alt' => 'profile image']) ?> -
    - - - - - - - - - - -
    - - redeem - - - - arrow_back - - - arrow_forward - - - minus_circle_multiple - - -
    -
    -
    -
    - 30): ?> - - - - -
    -
    - - nice() ?> - - - -
    -
    element('printGradido', ['number' => $balance]) ?>
    -
    - - - -
    -
    - -
    -
    - - - 0) : ?> - - \ No newline at end of file diff --git a/community_server/src/Template/StateBalances/overview_gdt.ctp b/community_server/src/Template/StateBalances/overview_gdt.ctp deleted file mode 100644 index f293b93be..000000000 --- a/community_server/src/Template/StateBalances/overview_gdt.ctp +++ /dev/null @@ -1,123 +0,0 @@ -assign('title', __('GDT Kontoübersicht')); -$header = '

    ' . __('Zur Verfügung: ') . '

    '; - -if($gdtSum > 0){ - $header .= '

    '.$this->element('printGDT', ['number' => $gdtSum*100.0]).'

    '; -} -if($moreEntrysAsShown) { - $header .= ''. __('Nur die letzten 100 Einträge werden angezeigt!') . ''; -} -$this->assign('header', $header); - -?> - 0) :?> -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - element('printGDT', ['number' => $entry['amount']*100.0]); ?> - - element('printEuro', ['number' => $entry['amount']*100.0]); ?> - element('printEuro', ['number' => $entry['amount2']*100.0]) ?> - -
    -
    - Number->format($entry['factor']) ?> - x - Number->format($entry['factor2']) ?> - -
    -
    element('printGDT', ['number' => $entry['gdt']*100.0]) ?>
    -
    - -
    -
    - - 0) : ?> -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - - -
    -
    - - element('printGDT', ['number' => $gdtEntry['amount']*100.0]); ?> - - element('printEuro', ['number' => $gdtEntry['amount']*100.0]); ?> - element('printEuro', ['number' => $gdtEntry['amount2']*100.0]) ?> - -
    -
    - Number->format($gdtEntry['factor']) ?> - x - Number->format($gdtEntry['factor2']) ?> - -
    -
    element('printGDT', ['number' => $gdtEntry['gdt'] * 100.0]) ?>
    -
    - -
    -
    - -Html->script(['basic', 'popper.min', 'tippy-bundle.umd.min']) ?> - \ No newline at end of file diff --git a/community_server/src/Template/StateBalances/view.ctp b/community_server/src/Template/StateBalances/view.ctp deleted file mode 100644 index e5f8901dd..000000000 --- a/community_server/src/Template/StateBalances/view.ctp +++ /dev/null @@ -1,39 +0,0 @@ - - -
    -

    id) ?>

    - view - - - - - - - - - - - - - - - - - -
    has('state_user') ? $this->Html->link($stateBalance->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateBalance->state_user->id]) : '' ?>
    Number->format($stateBalance->id) ?>
    Number->format($stateBalance->amount) ?>
    modified) ?>
    -
    diff --git a/community_server/src/Template/StateCreated/add.ctp b/community_server/src/Template/StateCreated/add.ctp deleted file mode 100644 index c66cf83f3..000000000 --- a/community_server/src/Template/StateCreated/add.ctp +++ /dev/null @@ -1,31 +0,0 @@ - - -
    - Form->create($stateCreated) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('month'); - echo $this->Form->control('year'); - echo $this->Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('short_ident_hash'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateCreated/edit.ctp b/community_server/src/Template/StateCreated/edit.ctp deleted file mode 100644 index be1ef330b..000000000 --- a/community_server/src/Template/StateCreated/edit.ctp +++ /dev/null @@ -1,37 +0,0 @@ - - -
    - Form->create($stateCreated) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('month'); - echo $this->Form->control('year'); - echo $this->Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('short_ident_hash'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateCreated/index.ctp b/community_server/src/Template/StateCreated/index.ctp deleted file mode 100644 index 64a514b3b..000000000 --- a/community_server/src/Template/StateCreated/index.ctp +++ /dev/null @@ -1,61 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('month') ?>Paginator->sort('year') ?>Paginator->sort('state_user_id') ?>Paginator->sort('created') ?>Paginator->sort('short_ident_hash') ?>
    Number->format($stateCreated->id) ?>has('transaction') ? $this->Html->link($stateCreated->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateCreated->transaction->id]) : '' ?>Number->format($stateCreated->month) ?>Number->format($stateCreated->year) ?>has('state_user') ? $this->Html->link($stateCreated->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateCreated->state_user->id]) : '' ?>created) ?>Number->format($stateCreated->short_ident_hash) ?> - Html->link(__('View'), ['action' => 'view', $stateCreated->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateCreated->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateCreated->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateCreated->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateCreated/view.ctp b/community_server/src/Template/StateCreated/view.ctp deleted file mode 100644 index e0e9301ec..000000000 --- a/community_server/src/Template/StateCreated/view.ctp +++ /dev/null @@ -1,52 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    has('transaction') ? $this->Html->link($stateCreated->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateCreated->transaction->id]) : '' ?>
    has('state_user') ? $this->Html->link($stateCreated->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateCreated->state_user->id]) : '' ?>
    Number->format($stateCreated->id) ?>
    Number->format($stateCreated->month) ?>
    Number->format($stateCreated->year) ?>
    Number->format($stateCreated->short_ident_hash) ?>
    created) ?>
    -
    diff --git a/community_server/src/Template/StateErrors/add.ctp b/community_server/src/Template/StateErrors/add.ctp deleted file mode 100644 index 24d095b90..000000000 --- a/community_server/src/Template/StateErrors/add.ctp +++ /dev/null @@ -1,29 +0,0 @@ - - -
    - Form->create($stateError) ?> -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); - echo $this->Form->control('message_json'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateErrors/edit.ctp b/community_server/src/Template/StateErrors/edit.ctp deleted file mode 100644 index 795b6c7dd..000000000 --- a/community_server/src/Template/StateErrors/edit.ctp +++ /dev/null @@ -1,35 +0,0 @@ - - -
    - Form->create($stateError) ?> -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); - echo $this->Form->control('message_json'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateErrors/index.ctp b/community_server/src/Template/StateErrors/index.ctp deleted file mode 100644 index 3f34f449b..000000000 --- a/community_server/src/Template/StateErrors/index.ctp +++ /dev/null @@ -1,55 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('transaction_type_id') ?>Paginator->sort('created') ?>
    Number->format($stateError->id) ?>has('state_user') ? $this->Html->link($stateError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateError->state_user->id]) : '' ?>has('transaction_type') ? $this->Html->link($stateError->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateError->transaction_type->id]) : '' ?>created) ?> - Html->link(__('View'), ['action' => 'view', $stateError->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateError->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateError->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateError->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateErrors/show_for_user.ctp b/community_server/src/Template/StateErrors/show_for_user.ctp deleted file mode 100644 index 2420571a3..000000000 --- a/community_server/src/Template/StateErrors/show_for_user.ctp +++ /dev/null @@ -1,51 +0,0 @@ -assign('title', __('Fehlermeldungen')); -//var_dump($transactionTypes); -/*foreach($transactionTypes as $i => $t) { - echo "$i => "; - var_dump($t); - echo "
    "; -}*/ -?> -
    -

    Fehler

    -
    -
    -
    Transaktion Typ
    -
    Datum
    -
    Fehler
    -
    Aktionen
    -
    - transaction_type_id-1]; - $errorMessage = ""; - $errorArray = json_decode($error->message_json, true); - if(isset($errorArray['details']) && is_array($errorArray['details'])) { - foreach($errorArray['details'][0] as $function => $errorString) { - $errorMessage = '' . $function . '
    ' . $errorString; - } - } else { - $errorMessage = $error->message_json; - } - ?> -
    -
    name ?>
    -
    created ?>
    -
    -
    - Html->link( - __('Delete'), - ['action' => 'deleteForUser', $error->id], - ['class' => 'form-button button-cancel'] - ) ?>
    -
    - -
    -
    diff --git a/community_server/src/Template/StateErrors/view.ctp b/community_server/src/Template/StateErrors/view.ctp deleted file mode 100644 index c2913d306..000000000 --- a/community_server/src/Template/StateErrors/view.ctp +++ /dev/null @@ -1,44 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - -
    has('state_user') ? $this->Html->link($stateError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateError->state_user->id]) : '' ?>
    has('transaction_type') ? $this->Html->link($stateError->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateError->transaction_type->id]) : '' ?>
    Number->format($stateError->id) ?>
    created) ?>
    -
    -

    - Text->autoParagraph(h($stateError->message_json)); ?> -
    -
    diff --git a/community_server/src/Template/StateGroupAddresses/add.ctp b/community_server/src/Template/StateGroupAddresses/add.ctp deleted file mode 100644 index 43ba76178..000000000 --- a/community_server/src/Template/StateGroupAddresses/add.ctp +++ /dev/null @@ -1,28 +0,0 @@ - - -
    - Form->create($stateGroupAddress) ?> -
    - - Form->control('group_id'); - echo $this->Form->control('address_type_id', ['options' => $addressTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateGroupAddresses/edit.ctp b/community_server/src/Template/StateGroupAddresses/edit.ctp deleted file mode 100644 index d3ad6fe70..000000000 --- a/community_server/src/Template/StateGroupAddresses/edit.ctp +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - Form->create($stateGroupAddress) ?> -
    - - Form->control('group_id'); - echo $this->Form->control('address_type_id', ['options' => $addressTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateGroupAddresses/index.ctp b/community_server/src/Template/StateGroupAddresses/index.ctp deleted file mode 100644 index fb463e5dd..000000000 --- a/community_server/src/Template/StateGroupAddresses/index.ctp +++ /dev/null @@ -1,55 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('group_id') ?>Paginator->sort('address_type_id') ?>
    Number->format($stateGroupAddress->id) ?>Number->format($stateGroupAddress->group_id) ?>has('address_type') ? $this->Html->link($stateGroupAddress->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $stateGroupAddress->address_type->id]) : '' ?>public_key)) ?> - - Html->link(__('View'), ['action' => 'view', $stateGroupAddress->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateGroupAddress->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateGroupAddress->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroupAddress->id)]) ?> -
    -
    -
      - Paginator->first('<< ' . __('first')) ?> - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> - Paginator->last(__('last') . ' >>') ?> -
    -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateGroupAddresses/view.ctp b/community_server/src/Template/StateGroupAddresses/view.ctp deleted file mode 100644 index 964b12847..000000000 --- a/community_server/src/Template/StateGroupAddresses/view.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - -
    has('address_type') ? $this->Html->link($stateGroupAddress->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $stateGroupAddress->address_type->id]) : '' ?>
    Number->format($stateGroupAddress->id) ?>
    Number->format($stateGroupAddress->group_id) ?>
    -
    diff --git a/community_server/src/Template/StateGroupRelationships/add.ctp b/community_server/src/Template/StateGroupRelationships/add.ctp deleted file mode 100644 index 39eb550e8..000000000 --- a/community_server/src/Template/StateGroupRelationships/add.ctp +++ /dev/null @@ -1,25 +0,0 @@ - - -
    - Form->create($stateGroupRelationship) ?> -
    - - Form->control('state_group1_id'); - echo $this->Form->control('state_group2_id'); - echo $this->Form->control('state_relationship_id'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateGroupRelationships/edit.ctp b/community_server/src/Template/StateGroupRelationships/edit.ctp deleted file mode 100644 index 55bcc6afe..000000000 --- a/community_server/src/Template/StateGroupRelationships/edit.ctp +++ /dev/null @@ -1,31 +0,0 @@ - - -
    - Form->create($stateGroupRelationship) ?> -
    - - Form->control('state_group1_id'); - echo $this->Form->control('state_group2_id'); - echo $this->Form->control('state_relationship_id'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateGroupRelationships/index.ctp b/community_server/src/Template/StateGroupRelationships/index.ctp deleted file mode 100644 index 57fbc4da5..000000000 --- a/community_server/src/Template/StateGroupRelationships/index.ctp +++ /dev/null @@ -1,51 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('state_group1_id') ?>Paginator->sort('state_group2_id') ?>Paginator->sort('state_relationship_id') ?>
    Number->format($stateGroupRelationship->id) ?>Number->format($stateGroupRelationship->state_group1_id) ?>Number->format($stateGroupRelationship->state_group2_id) ?>Number->format($stateGroupRelationship->state_relationship_id) ?> - Html->link(__('View'), ['action' => 'view', $stateGroupRelationship->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateGroupRelationship->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateGroupRelationship->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroupRelationship->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateGroupRelationships/view.ctp b/community_server/src/Template/StateGroupRelationships/view.ctp deleted file mode 100644 index de871dc77..000000000 --- a/community_server/src/Template/StateGroupRelationships/view.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - -
    Number->format($stateGroupRelationship->id) ?>
    Number->format($stateGroupRelationship->state_group1_id) ?>
    Number->format($stateGroupRelationship->state_group2_id) ?>
    Number->format($stateGroupRelationship->state_relationship_id) ?>
    -
    diff --git a/community_server/src/Template/StateGroups/add.ctp b/community_server/src/Template/StateGroups/add.ctp deleted file mode 100644 index e71480593..000000000 --- a/community_server/src/Template/StateGroups/add.ctp +++ /dev/null @@ -1,32 +0,0 @@ - - -
    - Form->create($stateGroup) ?> -
    - - Form->control('name'); - echo $this->Form->control('user_count'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateGroups/edit.ctp b/community_server/src/Template/StateGroups/edit.ctp deleted file mode 100644 index 93b35256b..000000000 --- a/community_server/src/Template/StateGroups/edit.ctp +++ /dev/null @@ -1,38 +0,0 @@ - - -
    - Form->create($stateGroup) ?> -
    - - Form->control('name'); - echo $this->Form->control('user_count'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateGroups/index.ctp b/community_server/src/Template/StateGroups/index.ctp deleted file mode 100644 index a37029ab2..000000000 --- a/community_server/src/Template/StateGroups/index.ctp +++ /dev/null @@ -1,57 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('user_count') ?>
    Number->format($stateGroup->id) ?>name) ?>Number->format($stateGroup->user_count) ?> - Html->link(__('View'), ['action' => 'view', $stateGroup->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateGroup->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateGroup->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroup->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateGroups/view.ctp b/community_server/src/Template/StateGroups/view.ctp deleted file mode 100644 index 0ecb27009..000000000 --- a/community_server/src/Template/StateGroups/view.ctp +++ /dev/null @@ -1,152 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - -
    name) ?>
    Number->format($stateGroup->id) ?>
    Number->format($stateGroup->user_count) ?>
    - - - - -
    diff --git a/community_server/src/Template/StateRelationshipTypes/add.ctp b/community_server/src/Template/StateRelationshipTypes/add.ctp deleted file mode 100644 index 5eb7c3b4f..000000000 --- a/community_server/src/Template/StateRelationshipTypes/add.ctp +++ /dev/null @@ -1,24 +0,0 @@ - - -
    - Form->create($stateRelationshipType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateRelationshipTypes/edit.ctp b/community_server/src/Template/StateRelationshipTypes/edit.ctp deleted file mode 100644 index 96ef4ba88..000000000 --- a/community_server/src/Template/StateRelationshipTypes/edit.ctp +++ /dev/null @@ -1,30 +0,0 @@ - - -
    - Form->create($stateRelationshipType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateRelationshipTypes/index.ctp b/community_server/src/Template/StateRelationshipTypes/index.ctp deleted file mode 100644 index 2e44a8d88..000000000 --- a/community_server/src/Template/StateRelationshipTypes/index.ctp +++ /dev/null @@ -1,49 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($stateRelationshipType->id) ?>name) ?>text) ?> - Html->link(__('View'), ['action' => 'view', $stateRelationshipType->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateRelationshipType->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateRelationshipType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateRelationshipType->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateRelationshipTypes/view.ctp b/community_server/src/Template/StateRelationshipTypes/view.ctp deleted file mode 100644 index 5d745a0df..000000000 --- a/community_server/src/Template/StateRelationshipTypes/view.ctp +++ /dev/null @@ -1,32 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - -
    name) ?>
    text) ?>
    Number->format($stateRelationshipType->id) ?>
    -
    diff --git a/community_server/src/Template/StateUserRoles/assign_role.ctp b/community_server/src/Template/StateUserRoles/assign_role.ctp deleted file mode 100644 index 64d3a1f8b..000000000 --- a/community_server/src/Template/StateUserRoles/assign_role.ctp +++ /dev/null @@ -1,49 +0,0 @@ -assign('title', __('Assign Role')); -// In a View class -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -?> -Html->css([ - 'loginServer/style.css', - 'rippleUI/style.css', - 'materialdesignicons.min.css' -]) ?> - -
    -

    Assign Role

    -
    - Form->create($assignRoleForm, []) ?> -
    User:  first_name." ".$stateUser->last_name ?>
    -
    Select Role:
    Form->select('role_id', $roles, ['label' => __('Role'), 'class' => 'form-control', 'id' => 'inlineFormInputGroup', 'placeholder' => __('Role'), "multiple" => "multiple", "value" => $role_ids]) ?>
    - Form->button(' ' . __('Assign Role'), ['class' => 'form-button']) ?> - Form->hidden('public_hex', ['id' => 'input-order-row', 'value' => $public_hex]) ?> -
    -
    diff --git a/community_server/src/Template/StateUserRoles/index.ctp b/community_server/src/Template/StateUserRoles/index.ctp deleted file mode 100644 index 4e6ea8cb1..000000000 --- a/community_server/src/Template/StateUserRoles/index.ctp +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('first_name') ?> - Paginator->sort('last_name') ?> - Paginator->sort('username') ?> - Paginator->sort('email') ?> - Paginator->sort('disabled') ?> -
    Number->format($stateUser->id) ?>first_name ?>last_name ?>username ?>email ?>disabled ?> - Html->link(__('View'), ['action' => 'view', $stateUser->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateUser->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateUser->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateUserRoles/search.ctp b/community_server/src/Template/StateUserRoles/search.ctp deleted file mode 100644 index aff7fbbcb..000000000 --- a/community_server/src/Template/StateUserRoles/search.ctp +++ /dev/null @@ -1,53 +0,0 @@ -assign('title', __('Benutzer suchen')); -// In a View class -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -?> -
    -

    Benutzer suchen

    -
    - Form->create($searchForm, []) ?> - Form->control('search', ['label' => __('Suchbegriff'), 'class' => 'form-control', 'id' => 'inlineFormInputGroup', 'placeholder' => __('Vorname/Nachname/E-Mail')]) ?> - Form->button('search ' . __('Suchen'), ['class' => 'form-button']) ?> - Form->hidden('order_row', ['id' => 'input-order-row']) ?> -
    -
    -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('first_name') ?>Paginator->sort('last_name') ?>Paginator->sort('email') ?>
    - Html->link(__('Assign Role'), ['action' => 'assignRole', $stateUser['pubkeyhex']]) ?> -
    -
    diff --git a/community_server/src/Template/StateUserTransactions/add.ctp b/community_server/src/Template/StateUserTransactions/add.ctp deleted file mode 100644 index b131a43e5..000000000 --- a/community_server/src/Template/StateUserTransactions/add.ctp +++ /dev/null @@ -1,31 +0,0 @@ - - -
    - Form->create($stateUserTransaction) ?> -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateUserTransactions/edit.ctp b/community_server/src/Template/StateUserTransactions/edit.ctp deleted file mode 100644 index eec26e522..000000000 --- a/community_server/src/Template/StateUserTransactions/edit.ctp +++ /dev/null @@ -1,37 +0,0 @@ - - -
    - Form->create($stateUserTransaction) ?> -
    - - Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateUserTransactions/index.ctp b/community_server/src/Template/StateUserTransactions/index.ctp deleted file mode 100644 index 9bdd3d6b3..000000000 --- a/community_server/src/Template/StateUserTransactions/index.ctp +++ /dev/null @@ -1,57 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('transaction_type_id') ?>
    Number->format($stateUserTransaction->id) ?>has('state_user') ? $this->Html->link($stateUserTransaction->state_user->email, ['controller' => 'StateUsers', 'action' => 'view', $stateUserTransaction->state_user->id]) : '' ?>has('transaction') ? $this->Html->link($stateUserTransaction->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateUserTransaction->transaction->id]) : '' ?>has('transaction_type') ? $this->Html->link($stateUserTransaction->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateUserTransaction->transaction_type->id]) : '' ?> - Html->link(__('View'), ['action' => 'view', $stateUserTransaction->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateUserTransaction->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateUserTransaction->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateUserTransaction->id)]) ?> -
    -
    -
      - Paginator->first('<< ' . __('first')) ?> - Paginator->prev('< ' . __('previous')) ?> - Paginator->numbers() ?> - Paginator->next(__('next') . ' >') ?> - Paginator->last(__('last') . ' >>') ?> -
    -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateUserTransactions/view.ctp b/community_server/src/Template/StateUserTransactions/view.ctp deleted file mode 100644 index 13c05347b..000000000 --- a/community_server/src/Template/StateUserTransactions/view.ctp +++ /dev/null @@ -1,42 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - -
    has('state_user') ? $this->Html->link($stateUserTransaction->state_user->email, ['controller' => 'StateUsers', 'action' => 'view', $stateUserTransaction->state_user->id]) : '' ?>
    has('transaction') ? $this->Html->link($stateUserTransaction->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateUserTransaction->transaction->id]) : '' ?>
    has('transaction_type') ? $this->Html->link($stateUserTransaction->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateUserTransaction->transaction_type->id]) : '' ?>
    Number->format($stateUserTransaction->id) ?>
    -
    diff --git a/community_server/src/Template/StateUsers/add.ctp b/community_server/src/Template/StateUsers/add.ctp deleted file mode 100644 index a810bc9d5..000000000 --- a/community_server/src/Template/StateUsers/add.ctp +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - Form->create($stateUser) ?> -
    - - Form->control('index_id'); - echo $this->Form->control('state_group_id', ['options' => $stateGroups]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateUsers/edit.ctp b/community_server/src/Template/StateUsers/edit.ctp deleted file mode 100644 index 473f1d845..000000000 --- a/community_server/src/Template/StateUsers/edit.ctp +++ /dev/null @@ -1,39 +0,0 @@ - - -
    - Form->create($stateUser) ?> -
    - - Form->control('disabled'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/StateUsers/index.ctp b/community_server/src/Template/StateUsers/index.ctp deleted file mode 100644 index 4e6ea8cb1..000000000 --- a/community_server/src/Template/StateUsers/index.ctp +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('first_name') ?> - Paginator->sort('last_name') ?> - Paginator->sort('username') ?> - Paginator->sort('email') ?> - Paginator->sort('disabled') ?> -
    Number->format($stateUser->id) ?>first_name ?>last_name ?>username ?>email ?>disabled ?> - Html->link(__('View'), ['action' => 'view', $stateUser->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $stateUser->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $stateUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateUser->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/StateUsers/list_ident_hashes.ctp b/community_server/src/Template/StateUsers/list_ident_hashes.ctp deleted file mode 100644 index 777a32c99..000000000 --- a/community_server/src/Template/StateUsers/list_ident_hashes.ctp +++ /dev/null @@ -1,29 +0,0 @@ - -
    - - - - - - - - - - - - - - - - - -
    first namelast nameemailidentHashPublic key hex -
    first_name ?>last_name ?>email ?>identHash ?>public_key)) ?>
    -
    diff --git a/community_server/src/Template/StateUsers/search.ctp b/community_server/src/Template/StateUsers/search.ctp deleted file mode 100644 index 626cb7313..000000000 --- a/community_server/src/Template/StateUsers/search.ctp +++ /dev/null @@ -1,79 +0,0 @@ -assign('title', __('Benutzer suchen')); -// In a View class -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); - -$stateOptions = [ - 'all' => __('Alle'), - //'account created'=>__('Konto angelegt'), - //'account not on login-server' => __('Konto nicht auf Login-Server'), - //'email activated' => __('Konto aktiviert'), - //'account copied to community' => __('Konto auf Gemeinschafts-Server'), - 'email not activated' => __('Konto nicht aktiviert'), - //'account multiple times on login-server' => __('Konto mehrfach vorhanden'), - //'account not on community server' => __('Konto nicht auf Gemeinschafts-Server'), - //'no keys' => __('Keine Schlüssel generiert') -]; - -?> -Html->css([ - 'loginServer/style.css', - 'rippleUI/style.css', - 'materialdesignicons.min.css' -]) ?> - -
    -

    Benutzer suchen

    -
    - Form->create($searchForm, []) ?> - Form->control('search', ['label' => __('Suchbegriff'), 'class' => 'form-control', 'id' => 'inlineFormInputGroup', 'placeholder' => __('Vorname/Nachname/E-Mail'), 'required' => false]) ?> - Form->control('account_state', ['label' => __('Konto Status'), 'class' => 'form-control', 'type' => 'select', 'options' => $stateOptions]) ?> - Form->button('search ' . __('Suchen'), ['class' => 'form-button']) ?> - Form->hidden('order_row', ['id' => 'input-order-row']) ?> -
    -
    -
    - -
    - - -Html->script('userSearch.min') ?> - - - diff --git a/community_server/src/Template/StateUsers/view.ctp b/community_server/src/Template/StateUsers/view.ctp deleted file mode 100644 index c2bb33c2b..000000000 --- a/community_server/src/Template/StateUsers/view.ctp +++ /dev/null @@ -1,143 +0,0 @@ - - -
    -

    first_name) ?> last_name) ?> <email) ?>>

    - Konto-Adresse: public_key))) ?> - - - - - -
    diff --git a/community_server/src/Template/TransactionCreations/add.ctp b/community_server/src/Template/TransactionCreations/add.ctp deleted file mode 100644 index dfe34be56..000000000 --- a/community_server/src/Template/TransactionCreations/add.ctp +++ /dev/null @@ -1,29 +0,0 @@ - - -
    - Form->create($transactionCreation) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('amount'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionCreations/create.ctp b/community_server/src/Template/TransactionCreations/create.ctp deleted file mode 100644 index d5c9ee2c5..000000000 --- a/community_server/src/Template/TransactionCreations/create.ctp +++ /dev/null @@ -1,31 +0,0 @@ - $receiver) { - //var_dump($receiver); - array_push($address_options, [ - 'text' => $receiver['name'], - 'value' => $i+1, - 'title' => $receiver['key'] - ]); -} -$this->assign('title', __('Schöpfungstransaktion')); -?> -
    - - Form->create($creationForm) ?> -
    - Form->control('memo'); ?> - Form->control('amount'); ?> - Form->control('receiver', ['options' => $address_options]); ?> - -
    - Form->button(__('Transaktion(en) abschließen'), ['name' => 'next', 'class' => 'grd-form-bn grd-form-bn-succeed grd_clickable grd-width-200']) ?> - Form->button(__('Weitere Transaktion erstellen'), ['name' => 'add', 'class' => 'grd-form-bn grd_clickable grd-width-200']) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionCreations/create_multi.ctp b/community_server/src/Template/TransactionCreations/create_multi.ctp deleted file mode 100644 index d4d130b9c..000000000 --- a/community_server/src/Template/TransactionCreations/create_multi.ctp +++ /dev/null @@ -1,229 +0,0 @@ - $receiver) { - //var_dump($receiver); - array_push($address_options, [ - 'text' => $receiver['name'], - 'value' => $i+1, - 'title' => $receiver['key'] - ]); -}*/ -$this->assign('title', __('Schöpfungstransaktion')); -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); - -use Cake\I18n\FrozenTime; - -?> -
    -

    Schöpfen

    -
    - Form->create($creationForm) ?> - 0) : ?> -
    - -
    -
    - Form->control('searchText', ['label' => __('Suche'), 'placeholder' => 'Email/Name']); ?> - Form->button(__('Suchen'), ['name' => 'searchButton', 'class' => 'form-button']) ?> -
    -
    - Form->control('memo', ['label' => __('Memo'), 'placeholder' => 'Memo']); ?> - Form->control('amount', ['label' => __('Betrag in GDD'), 'required' => false]); ?> - day(1)->subMonth(1); - ?> - -
    -
    - - -
    -
    - 30000000) { - //$disable = 'disabled'; - } - ?> -
    - - Form->hidden('user_pending[' . $possibleReceiver['id'] . ']', ['value' => $possibleReceiver['pending']] ) ?> - -
    -
    - Form->checkbox('user[' .$possibleReceiver['id'] . ']', ['value' => $possibleReceiver['id'], 'hiddenField' => false, $disable]); ?> -
    -
    - - - - - - - <> - - -
    -
    - Form->text('user_amount[' . $possibleReceiver['id'] . ']', ['placeholder' => __('Für benutzerdefinierten Betrag'), 'class' => 'user_amount', 'type' => 'number', 'step' => '0.01', $disable]); ?> GDD -
    -
    - Form->date('user_target_date[' . $possibleReceiver['id'] . ']', ['value' => $firstDayLastMonth]) ?> -
    -
    -
    - - - Bereits als Transaktion angelegt: element('printGradido', ['number' => $possibleReceiver['pending']]);?> - - - - - In diesen und den letzten 2 Monaten bereits geschöpft (alte Berechnung): element('printGradido', ['number' => $possibleReceiver['amount']]);?> - - - 0) : ?> - - Im letzten Monat geschöpft (neue Berechnung): element('printGradido', ['number' => $possibleReceiver['amount2']]) ?> - - -
    -
    - - -
    - $limit) : ?> -

    Benutzer insgesamt

    -

    Seiten: - 0) echo ', '; - if($i != $page) { - echo $this->Html->link($i, ['action' => 'create_multi', $i]); - } else { - echo $i; - } - } - ?> -

    - -
    -
    -
    - Form->button(__('Transaktion(en) abschließen'), ['name' => 'next', 'class' => 'form-button' ]) ?> - Form->button(__('Weitere Transaktion erstellen'), ['name' => 'add', 'class' => 'form-button']) ?> -
    -
    - Form->end() ?> -
    -
    -Html->script('basic'); ?> - - 0) : ?> - - \ No newline at end of file diff --git a/community_server/src/Template/TransactionCreations/edit.ctp b/community_server/src/Template/TransactionCreations/edit.ctp deleted file mode 100644 index 85b7704be..000000000 --- a/community_server/src/Template/TransactionCreations/edit.ctp +++ /dev/null @@ -1,35 +0,0 @@ - - -
    - Form->create($transactionCreation) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('amount'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionCreations/index.ctp b/community_server/src/Template/TransactionCreations/index.ctp deleted file mode 100644 index 4eb7b2471..000000000 --- a/community_server/src/Template/TransactionCreations/index.ctp +++ /dev/null @@ -1,58 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('target_date') ?>Paginator->sort('received') ?>Paginator->sort('amount') ?>
    Number->format($transactionCreation->id) ?>has('transaction') ? $this->Html->link($transactionCreation->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionCreation->transaction->id]) : '' ?>has('state_user') ? $this->Html->link($transactionCreation->state_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionCreation->state_user->id]) : '' ?>target_date) ?>transaction->received) ?>element('printGradido', ['number' => $transactionCreation->amount]) ?>ident_hash) ?> - Html->link(__('View'), ['action' => 'view', $transactionCreation->id]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionCreations/view.ctp b/community_server/src/Template/TransactionCreations/view.ctp deleted file mode 100644 index a51312674..000000000 --- a/community_server/src/Template/TransactionCreations/view.ctp +++ /dev/null @@ -1,40 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - -
    has('transaction') ? $this->Html->link($transactionCreation->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionCreation->transaction->id]) : '' ?>
    has('state_user') ? $this->Html->link($transactionCreation->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $transactionCreation->state_user->id]) : '' ?>
    Number->format($transactionCreation->id) ?>
    Number->format($transactionCreation->amount) ?>
    -
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/add.ctp b/community_server/src/Template/TransactionGroupAddaddress/add.ctp deleted file mode 100644 index 21fa1bea7..000000000 --- a/community_server/src/Template/TransactionGroupAddaddress/add.ctp +++ /dev/null @@ -1,28 +0,0 @@ - - -
    - Form->create($transactionGroupAddaddres) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('address_type_id', ['options' => $addressTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/edit.ctp b/community_server/src/Template/TransactionGroupAddaddress/edit.ctp deleted file mode 100644 index e9d7c318a..000000000 --- a/community_server/src/Template/TransactionGroupAddaddress/edit.ctp +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - Form->create($transactionGroupAddaddres) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('address_type_id', ['options' => $addressTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/index.ctp b/community_server/src/Template/TransactionGroupAddaddress/index.ctp deleted file mode 100644 index 404115d69..000000000 --- a/community_server/src/Template/TransactionGroupAddaddress/index.ctp +++ /dev/null @@ -1,55 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('address_type_id') ?>
    Number->format($transactionGroupAddaddres->id) ?>has('transaction') ? $this->Html->link($transactionGroupAddaddres->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAddaddres->transaction->id]) : '' ?>has('address_type') ? $this->Html->link($transactionGroupAddaddres->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $transactionGroupAddaddres->address_type->id]) : '' ?>public_key)) ?> - - Html->link(__('View'), ['action' => 'view', $transactionGroupAddaddres->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $transactionGroupAddaddres->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupAddaddres->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupAddaddres->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionGroupAddaddress/view.ctp b/community_server/src/Template/TransactionGroupAddaddress/view.ctp deleted file mode 100644 index 8401780e7..000000000 --- a/community_server/src/Template/TransactionGroupAddaddress/view.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - -
    has('transaction') ? $this->Html->link($transactionGroupAddaddres->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAddaddres->transaction->id]) : '' ?>
    has('address_type') ? $this->Html->link($transactionGroupAddaddres->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $transactionGroupAddaddres->address_type->id]) : '' ?>
    Number->format($transactionGroupAddaddres->id) ?>
    -
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/add.ctp b/community_server/src/Template/TransactionGroupAllowtrades/add.ctp deleted file mode 100644 index 7e29efc24..000000000 --- a/community_server/src/Template/TransactionGroupAllowtrades/add.ctp +++ /dev/null @@ -1,27 +0,0 @@ - - -
    - Form->create($transactionGroupAllowtrade) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('group_id'); - echo $this->Form->control('allow'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp b/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp deleted file mode 100644 index 500241331..000000000 --- a/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp +++ /dev/null @@ -1,33 +0,0 @@ - - -
    - Form->create($transactionGroupAllowtrade) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('group_id'); - echo $this->Form->control('allow'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/index.ctp b/community_server/src/Template/TransactionGroupAllowtrades/index.ctp deleted file mode 100644 index 07386ccb2..000000000 --- a/community_server/src/Template/TransactionGroupAllowtrades/index.ctp +++ /dev/null @@ -1,53 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('group_id') ?>Paginator->sort('allow') ?>
    Number->format($transactionGroupAllowtrade->id) ?>has('transaction') ? $this->Html->link($transactionGroupAllowtrade->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAllowtrade->transaction->id]) : '' ?>Number->format($transactionGroupAllowtrade->group_id) ?>allow) ?> - Html->link(__('View'), ['action' => 'view', $transactionGroupAllowtrade->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $transactionGroupAllowtrade->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupAllowtrade->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupAllowtrade->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionGroupAllowtrades/view.ctp b/community_server/src/Template/TransactionGroupAllowtrades/view.ctp deleted file mode 100644 index 7a6a36f5a..000000000 --- a/community_server/src/Template/TransactionGroupAllowtrades/view.ctp +++ /dev/null @@ -1,38 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - -
    has('transaction') ? $this->Html->link($transactionGroupAllowtrade->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAllowtrade->transaction->id]) : '' ?>
    Number->format($transactionGroupAllowtrade->id) ?>
    Number->format($transactionGroupAllowtrade->group_id) ?>
    allow ? __('Yes') : __('No'); ?>
    -
    diff --git a/community_server/src/Template/TransactionGroupCreates/add.ctp b/community_server/src/Template/TransactionGroupCreates/add.ctp deleted file mode 100644 index 6e6174eb4..000000000 --- a/community_server/src/Template/TransactionGroupCreates/add.ctp +++ /dev/null @@ -1,29 +0,0 @@ - - -
    - Form->create($transactionGroupCreate) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('state_group_id', ['options' => $stateGroups]); - echo $this->Form->control('name'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionGroupCreates/edit.ctp b/community_server/src/Template/TransactionGroupCreates/edit.ctp deleted file mode 100644 index d1890afca..000000000 --- a/community_server/src/Template/TransactionGroupCreates/edit.ctp +++ /dev/null @@ -1,35 +0,0 @@ - - -
    - Form->create($transactionGroupCreate) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('state_group_id', ['options' => $stateGroups]); - echo $this->Form->control('name'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionGroupCreates/index.ctp b/community_server/src/Template/TransactionGroupCreates/index.ctp deleted file mode 100644 index 13aeabf83..000000000 --- a/community_server/src/Template/TransactionGroupCreates/index.ctp +++ /dev/null @@ -1,55 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('state_group_id') ?>Paginator->sort('name') ?>
    Number->format($transactionGroupCreate->id) ?>has('transaction') ? $this->Html->link($transactionGroupCreate->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupCreate->transaction->id]) : '' ?>has('state_group') ? $this->Html->link($transactionGroupCreate->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transactionGroupCreate->state_group->id]) : '' ?>name) ?> - Html->link(__('View'), ['action' => 'view', $transactionGroupCreate->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $transactionGroupCreate->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupCreate->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupCreate->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionGroupCreates/view.ctp b/community_server/src/Template/TransactionGroupCreates/view.ctp deleted file mode 100644 index c774f8bc3..000000000 --- a/community_server/src/Template/TransactionGroupCreates/view.ctp +++ /dev/null @@ -1,40 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - - - - - -
    has('transaction') ? $this->Html->link($transactionGroupCreate->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupCreate->transaction->id]) : '' ?>
    has('state_group') ? $this->Html->link($transactionGroupCreate->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transactionGroupCreate->state_group->id]) : '' ?>
    name) ?>
    Number->format($transactionGroupCreate->id) ?>
    -
    diff --git a/community_server/src/Template/TransactionSendCoins/add.ctp b/community_server/src/Template/TransactionSendCoins/add.ctp deleted file mode 100644 index 8b5a757c4..000000000 --- a/community_server/src/Template/TransactionSendCoins/add.ctp +++ /dev/null @@ -1,30 +0,0 @@ - - -
    - Form->create($transactionSendCoin) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('amount'); - echo $this->Form->control('sender_final_balance'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionSendCoins/create.ctp b/community_server/src/Template/TransactionSendCoins/create.ctp deleted file mode 100644 index 91e7678e0..000000000 --- a/community_server/src/Template/TransactionSendCoins/create.ctp +++ /dev/null @@ -1,40 +0,0 @@ -assign('title', __('Überweisung')); -// In a View class -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -?> -
    -

    Überweisen

    -
    - Form->create($transferForm) ?> - Form->control('email', ['label' => __('Empfänger'), 'placeholder' => 'E-Mail']) ?> - Form->control('group', ['label' => __('Community Alias'), 'options' => $groups, 'default' => $user['group_alias']]) ?> - Form->control('memo', ['label' => __('Verwendungszweck'), 'rows' => 3]) ?> - Form->control('amount', ['label' => __('Betrag in GDD')]) ?> - Form->button(__('Transaktion abschließen'), ['name' => 'next', 'class' => 'form-button']) ?> - - Form->end() ?> -
    -
    - -Html->script(['core', 'vendor.addons']); ?> - diff --git a/community_server/src/Template/TransactionSendCoins/create_raw.ctp b/community_server/src/Template/TransactionSendCoins/create_raw.ctp deleted file mode 100644 index 0b3d74e1f..000000000 --- a/community_server/src/Template/TransactionSendCoins/create_raw.ctp +++ /dev/null @@ -1,55 +0,0 @@ -assign('title', __('Überweisung')); -// In a View class -$this->loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -?> - -
    -
    -
    -

    Überweisen

    -
    -
    -
    -
    - Form->create($transferRawForm) ?> - Form->control('sender_privkey_hex', ['label' => __('Sender Private Key')]) ?> - Form->control('sender_pubkey_hex', ['label' => __('Sender Public Key')]) ?> - Form->control('receiver_pubkey_hex', ['label' => __('Empfänger Public Key')]) ?> - Form->control('memo', ['label' => __('Verwendungszweck'), 'rows' => 3]) ?> - Form->control('amount', ['label' => __('Betrag in GDD')]) ?> - Form->button(__('Transaktion abschließen'), ['name' => 'next', 'class' => 'btn btn-sm btn-primary']) ?> - Form->end() ?> -
    -
    -
    -
    -
    -
    -
    - -Html->script(['core', 'vendor.addons']); ?> - diff --git a/community_server/src/Template/TransactionSendCoins/edit.ctp b/community_server/src/Template/TransactionSendCoins/edit.ctp deleted file mode 100644 index 61a6841fe..000000000 --- a/community_server/src/Template/TransactionSendCoins/edit.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - -
    - Form->create($transactionSendCoin) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - echo $this->Form->control('state_user_id', ['options' => $stateUsers]); - echo $this->Form->control('amount'); - echo $this->Form->control('sender_final_balance'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionSendCoins/index.ctp b/community_server/src/Template/TransactionSendCoins/index.ctp deleted file mode 100644 index c98f675a5..000000000 --- a/community_server/src/Template/TransactionSendCoins/index.ctp +++ /dev/null @@ -1,57 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>Paginator->sort('state_user_id') ?>Paginator->sort('receiver_user_id') ?>Paginator->sort('amount') ?>Paginator->sort('sender_final_balance') ?>
    Number->format($transactionSendCoin->id) ?>has('transaction') ? $this->Html->link($transactionSendCoin->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSendCoin->transaction->id]) : '' ?>has('state_user') ? $this->Html->link($transactionSendCoin->state_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->state_user->id]) : '' ?>has('receiver_user') ? $this->Html->link($transactionSendCoin->receiver_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->receiver_user->id]) : ''?>element('printGradido', ['number' => $transactionSendCoin->amount]) ?>Number->format($transactionSendCoin->sender_final_balance) ?> - Html->link(__('View'), ['action' => 'view', $transactionSendCoin->id]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionSendCoins/view.ctp b/community_server/src/Template/TransactionSendCoins/view.ctp deleted file mode 100644 index 322621942..000000000 --- a/community_server/src/Template/TransactionSendCoins/view.ctp +++ /dev/null @@ -1,44 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - -
    has('transaction') ? $this->Html->link($transactionSendCoin->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSendCoin->transaction->id]) : '' ?>
    has('state_user') ? $this->Html->link($transactionSendCoin->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->state_user->id]) : '' ?>
    Number->format($transactionSendCoin->id) ?>
    Number->format($transactionSendCoin->amount) ?>
    Number->format($transactionSendCoin->sender_final_balance) ?>
    -
    diff --git a/community_server/src/Template/TransactionSignatures/add.ctp b/community_server/src/Template/TransactionSignatures/add.ctp deleted file mode 100644 index 752389cd7..000000000 --- a/community_server/src/Template/TransactionSignatures/add.ctp +++ /dev/null @@ -1,25 +0,0 @@ - - -
    - Form->create($transactionSignature) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionSignatures/edit.ctp b/community_server/src/Template/TransactionSignatures/edit.ctp deleted file mode 100644 index 68143712b..000000000 --- a/community_server/src/Template/TransactionSignatures/edit.ctp +++ /dev/null @@ -1,31 +0,0 @@ - - -
    - Form->create($transactionSignature) ?> -
    - - Form->control('transaction_id', ['options' => $transactions]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionSignatures/index.ctp b/community_server/src/Template/TransactionSignatures/index.ctp deleted file mode 100644 index 9b8bc2826..000000000 --- a/community_server/src/Template/TransactionSignatures/index.ctp +++ /dev/null @@ -1,49 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('transaction_id') ?>
    Number->format($transactionSignature->id) ?>has('transaction') ? $this->Html->link($transactionSignature->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSignature->transaction->id]) : '' ?> - Html->link(__('View'), ['action' => 'view', $transactionSignature->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $transactionSignature->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $transactionSignature->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionSignature->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionSignatures/view.ctp b/community_server/src/Template/TransactionSignatures/view.ctp deleted file mode 100644 index 681198125..000000000 --- a/community_server/src/Template/TransactionSignatures/view.ctp +++ /dev/null @@ -1,30 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - -
    has('transaction') ? $this->Html->link($transactionSignature->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSignature->transaction->id]) : '' ?>
    Number->format($transactionSignature->id) ?>
    -
    diff --git a/community_server/src/Template/TransactionTypes/add.ctp b/community_server/src/Template/TransactionTypes/add.ctp deleted file mode 100644 index 97de82122..000000000 --- a/community_server/src/Template/TransactionTypes/add.ctp +++ /dev/null @@ -1,26 +0,0 @@ - - -
    - Form->create($transactionType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionTypes/edit.ctp b/community_server/src/Template/TransactionTypes/edit.ctp deleted file mode 100644 index 421184b55..000000000 --- a/community_server/src/Template/TransactionTypes/edit.ctp +++ /dev/null @@ -1,32 +0,0 @@ - - -
    - Form->create($transactionType) ?> -
    - - Form->control('name'); - echo $this->Form->control('text'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/TransactionTypes/index.ctp b/community_server/src/Template/TransactionTypes/index.ctp deleted file mode 100644 index b2248ae4b..000000000 --- a/community_server/src/Template/TransactionTypes/index.ctp +++ /dev/null @@ -1,51 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('name') ?>Paginator->sort('text') ?>
    Number->format($transactionType->id) ?>name) ?>text) ?> - Html->link(__('View'), ['action' => 'view', $transactionType->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $transactionType->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $transactionType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionType->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/TransactionTypes/view.ctp b/community_server/src/Template/TransactionTypes/view.ctp deleted file mode 100644 index 3da64f7e3..000000000 --- a/community_server/src/Template/TransactionTypes/view.ctp +++ /dev/null @@ -1,63 +0,0 @@ - - -
    -

    name) ?>

    - - - - - - - - - - - - - -
    name) ?>
    text) ?>
    Number->format($transactionType->id) ?>
    - -
    diff --git a/community_server/src/Template/Transactions/add.ctp b/community_server/src/Template/Transactions/add.ctp deleted file mode 100644 index 012d82027..000000000 --- a/community_server/src/Template/Transactions/add.ctp +++ /dev/null @@ -1,44 +0,0 @@ - - -
    - Form->create($transaction) ?> -
    - - Form->control('state_group_id', ['options' => $stateGroups]); - echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); - echo $this->Form->control('memo', ['type' => 'textarea']); - echo $this->Form->control('blockchain_type_id', ['options' => $blockchainTypes]); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Transactions/decode.ctp b/community_server/src/Template/Transactions/decode.ctp deleted file mode 100644 index dddde1cb8..000000000 --- a/community_server/src/Template/Transactions/decode.ctp +++ /dev/null @@ -1,36 +0,0 @@ - - 0) : ?> -
    -
      - -
    • - -
    • - -
    -
    - - -Form->create() ?> -Form->control('base64', ['type'=> 'textarea', 'rows' => '5', 'cols' => 40]) ?> -Form->submit(); ?> -Form->end() ?> - - -getTransactionBody(); -?> - - - getMemo() ?> -
    TypegetTransactionTypeName() ?>
    Memo
    - - diff --git a/community_server/src/Template/Transactions/edit.ctp b/community_server/src/Template/Transactions/edit.ctp deleted file mode 100644 index 4085a60c4..000000000 --- a/community_server/src/Template/Transactions/edit.ctp +++ /dev/null @@ -1,49 +0,0 @@ - - -
    - Form->create($transaction) ?> -
    - - Form->control('state_group_id', ['options' => $stateGroups]); - echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]); - echo $this->Form->control('received'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Transactions/index.ctp b/community_server/src/Template/Transactions/index.ctp deleted file mode 100644 index 9f97dc0c8..000000000 --- a/community_server/src/Template/Transactions/index.ctp +++ /dev/null @@ -1,58 +0,0 @@ - - -
    -
    -
    -
    Paginator->sort('id') ?>
    -
    Paginator->sort('memo') ?>
    -
    Paginator->sort('transaction_type_id') ?>
    -
    Paginator->sort('received') ?>
    -
    - -
    -
    Number->format($transaction->id) ?>
    -
    memo) ?>
    -
    has('transaction_type') ? $this->Html->link(__($transaction->transaction_type->name), ['controller' => 'TransactionTypes', 'action' => 'view', $transaction->transaction_type->id]) : '' ?>
    -
    received) ?>
    -
    - -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/Transactions/manual_transaction.ctp b/community_server/src/Template/Transactions/manual_transaction.ctp deleted file mode 100644 index 30bda1175..000000000 --- a/community_server/src/Template/Transactions/manual_transaction.ctp +++ /dev/null @@ -1,63 +0,0 @@ -loadHelper('Form', [ - 'templates' => 'horizontal_form', -]); -$now = new \DateTime; -?> - 0) : ?> -
    -
      - -
    • - -
    • - -
    -
    - - -
    -

    -
    - Form->create() ?> - Form->control('type', ['type' => 'hidden', 'value' => 'creation']) ?> - Form->control('target_public_key', ['type'=> 'text']) ?> - Form->control('target_date', ['type'=> 'text', 'placeholder' => 'yyyy-mm-dd hh:ii:ss', 'default' => $now->format('Y-m-d H:i:s')]) ?> - Form->control('amount', ['type'=> 'number']) ?> - Form->control('memo', ['type'=> 'textarea', 'rows' => '8', 'cols' => 40]) ?> - Form->control('signer_public_key', ['type' => 'text']) ?> - Form->control('signer_private_key', ['type'=> 'text']) ?> - Form->submit(); ?> - Form->end() ?> -
    -
    -
    -

    -
    - Form->create() ?> - Form->control('type', ['type' => 'hidden', 'value' => 'transfer']) ?> - Form->control('sender_public_key', ['type'=> 'text']) ?> - Form->control('receiver_public_key', ['type'=> 'text']) ?> - Form->control('amount', ['type'=> 'number']) ?> - Form->control('memo', ['type'=> 'textarea', 'rows' => '8', 'cols' => 40]) ?> - Form->control('signer_public_key', ['type' => 'text']) ?> - Form->control('signer_private_key', ['type'=> 'text']) ?> - Form->submit(); ?> - Form->end() ?> -
    -
    - -
    -
      - $value) : ?> -
    • :
    • - -
    -
    - \ No newline at end of file diff --git a/community_server/src/Template/Transactions/send_to_node.ctp b/community_server/src/Template/Transactions/send_to_node.ctp deleted file mode 100644 index 0bb652feb..000000000 --- a/community_server/src/Template/Transactions/send_to_node.ctp +++ /dev/null @@ -1,106 +0,0 @@ -assign('title', __('Transaktionen an Gradido-Node senden')); -?> - - -

    - -Bisher keine Transaktionen eingereicht - -Letzte eingereichte Transaktion - -

    -
      - $id) : ?> -
    • - : - - - Wird verarbeitet - - in Warteschlange - - - -
    • -
    -Html->script(['core']); ?> - diff --git a/community_server/src/Template/Transactions/synchronize_with_state_user_transactions.ctp b/community_server/src/Template/Transactions/synchronize_with_state_user_transactions.ctp deleted file mode 100644 index 8ac1ecb2d..000000000 --- a/community_server/src/Template/Transactions/synchronize_with_state_user_transactions.ctp +++ /dev/null @@ -1,46 +0,0 @@ - -
    -

    Synchronize state_user_transactions with transactions

    -

    transactions count:

    -

    state_user_transaction count:

    -

    Missing count:

    -

    First 10 Missing ids:

    -

    $id) { - if($i > 10) break; - if($i > 0) echo ', '; - echo $id['id']; -} ?>

    - - -

    Synchronize errors:

    -
      - $result) : - if(false != $result) { - $succeed++; - continue; - } - ?> -
    • Error saving entity: with error: getErrors()) ?>
    • - - -
    • Succeed:
    • -
    - - - Form->create() ?> - Form->button(__('Synchronize')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Transactions/view.ctp b/community_server/src/Template/Transactions/view.ctp deleted file mode 100644 index e15b9dbe3..000000000 --- a/community_server/src/Template/Transactions/view.ctp +++ /dev/null @@ -1,259 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - -
    has('state_group') ? $this->Html->link($transaction->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transaction->state_group->id]) : '' ?>
    has('transaction_type') ? $this->Html->link($transaction->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $transaction->transaction_type->id]) : '' ?>
    Number->format($transaction->id) ?>
    received) ?>
    - - - - - - - -
    diff --git a/community_server/src/Template/Users/add.ctp b/community_server/src/Template/Users/add.ctp deleted file mode 100644 index 6f67f02e6..000000000 --- a/community_server/src/Template/Users/add.ctp +++ /dev/null @@ -1,28 +0,0 @@ - - -
    - Form->create($user) ?> -
    - - Form->control('email'); - echo $this->Form->control('first_name'); - echo $this->Form->control('last_name'); - echo $this->Form->control('password'); - echo $this->Form->control('email_checked'); - echo $this->Form->control('language'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Users/edit.ctp b/community_server/src/Template/Users/edit.ctp deleted file mode 100644 index 681eacd36..000000000 --- a/community_server/src/Template/Users/edit.ctp +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - Form->create($user) ?> -
    - - Form->control('email'); - echo $this->Form->control('first_name'); - echo $this->Form->control('last_name'); - echo $this->Form->control('password'); - echo $this->Form->control('email_checked'); - echo $this->Form->control('language'); - ?> -
    - Form->button(__('Submit')) ?> - Form->end() ?> -
    diff --git a/community_server/src/Template/Users/index.ctp b/community_server/src/Template/Users/index.ctp deleted file mode 100644 index 14566ea26..000000000 --- a/community_server/src/Template/Users/index.ctp +++ /dev/null @@ -1,59 +0,0 @@ - - -
    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Paginator->sort('id') ?>Paginator->sort('email') ?>Paginator->sort('first_name') ?>Paginator->sort('last_name') ?>Paginator->sort('password') ?>Paginator->sort('created') ?>Paginator->sort('email_checked') ?>Paginator->sort('language') ?>
    Number->format($user->id) ?>email) ?>first_name) ?>last_name) ?>Number->format($user->password) ?>created) ?>email_checked) ?>language) ?> - Html->link(__('View'), ['action' => 'view', $user->id]) ?> - Html->link(__('Edit'), ['action' => 'edit', $user->id]) ?> - Form->postLink(__('Delete'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?> -
    -
    - -

    Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>

    -
    -
    diff --git a/community_server/src/Template/Users/statistics.ctp b/community_server/src/Template/Users/statistics.ctp deleted file mode 100644 index 76532faa8..000000000 --- a/community_server/src/Template/Users/statistics.ctp +++ /dev/null @@ -1,98 +0,0 @@ -assign('title', __('Benutzer Statistiken')); - -//mdi mdi-account-multiple-plus -//$newUserPercent = (1 - (b / a)) * 100 -$newUserPercent = 0; -$percentColor = 'info'; -if($users->count() > 0 && $newUsersLastMonth->count()) { - $newUserPercent = round((1 - ($users->count() / $newUsersLastMonth->count())) * 100.0, 2); - if($newUserPercent > 0 ) { - $percentColor = 'success'; - } else if($newUserPercent <= 0) { - $percentColor = 'alert'; - } -} - -$userColor = 'info'; -if($users->count() > 0) { - if($users->count() > 0 ) { - $userColor = 'success'; - } else if($users->count() <= 0) { - $userColor = 'alert'; - } -} -?> -
    -
    -
    - people -
    -

    count()?>

    -
     
    - -   - -
    -
    -
    - group_add -
    -

    count() ?>

    -
     
    - - - arrow_drop_down - 0) : ?> - arrow_drop_up - - % - -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    - -
    -
    first_name . ' ' . $user->last_name ?>
    -
    email ?>
    -
    created ?>
    -
    - - toArray()); ?> -
    -
    -
    -

    -
    -
    -
    -
    -
    -
    - $yearEntrys) : ?> - $monthEntrys): ?> -
    -
    -
    -
    -
    - - -
    -
    -Html->script(['core', 'vendor.addons']); ?> -Html->script('userSearch') ?> \ No newline at end of file diff --git a/community_server/src/Template/Users/view.ctp b/community_server/src/Template/Users/view.ctp deleted file mode 100644 index d3a1e67cd..000000000 --- a/community_server/src/Template/Users/view.ctp +++ /dev/null @@ -1,52 +0,0 @@ - - -
    -

    id) ?>

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    email) ?>
    first_name) ?>
    last_name) ?>
    language) ?>
    Number->format($user->id) ?>
    Number->format($user->password) ?>
    created) ?>
    email_checked ? __('Yes') : __('No'); ?>
    -
    diff --git a/community_server/src/View/AjaxView.php b/community_server/src/View/AjaxView.php deleted file mode 100644 index 3cb786926..000000000 --- a/community_server/src/View/AjaxView.php +++ /dev/null @@ -1,49 +0,0 @@ -response = $this->response->withType('ajax'); - } -} diff --git a/community_server/src/View/AppView.php b/community_server/src/View/AppView.php deleted file mode 100644 index 242ab6bde..000000000 --- a/community_server/src/View/AppView.php +++ /dev/null @@ -1,40 +0,0 @@ -loadHelper('Html');` - * - * @return void - */ - public function initialize() - { - } -} diff --git a/community_server/src/View/Cell/empty b/community_server/src/View/Cell/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/community_server/src/View/Helper/empty b/community_server/src/View/Helper/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/community_server/src/protobuf b/community_server/src/protobuf deleted file mode 160000 index 77dee5685..000000000 --- a/community_server/src/protobuf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 77dee5685ebba543ea1cd2321580ad56c92f5775 diff --git a/community_server/testJson.sh b/community_server/testJson.sh deleted file mode 100755 index b66cf8d18..000000000 --- a/community_server/testJson.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -#sudo -u www-data ./vendor/bin/phpunit --filter testIndex tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest - -sudo -u www-data ./vendor/bin/phpunit --testdox tests/TestCase/Controller/JsonRequestHandlerControllerTest - diff --git a/community_server/tests/Fixture/AddressTypesFixture.php b/community_server/tests/Fixture/AddressTypesFixture.php deleted file mode 100644 index 1e06a0ec9..000000000 --- a/community_server/tests/Fixture/AddressTypesFixture.php +++ /dev/null @@ -1,46 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'name' => ['type' => 'string', 'length' => 45, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'text' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'name' => 'Lorem ipsum dolor sit amet', - 'text' => 'Lorem ipsum dolor sit amet', - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/AdminErrorsFixture.php b/community_server/tests/Fixture/AdminErrorsFixture.php deleted file mode 100644 index 0fbc3a067..000000000 --- a/community_server/tests/Fixture/AdminErrorsFixture.php +++ /dev/null @@ -1,56 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'controller' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'action' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'state' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'msg' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'details' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_general_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'state_user_id' => 1, - 'controller' => 'Lorem ipsum dolor sit amet', - 'action' => 'Lorem ipsum dolor sit amet', - 'state' => 'Lorem ipsum dolor sit amet', - 'msg' => 'Lorem ipsum dolor sit amet', - 'details' => 'Lorem ipsum dolor sit amet', - 'created' => '2019-12-16 15:08:19' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/BaseTestFixture.php b/community_server/tests/Fixture/BaseTestFixture.php deleted file mode 100644 index 1f63aa55e..000000000 --- a/community_server/tests/Fixture/BaseTestFixture.php +++ /dev/null @@ -1,36 +0,0 @@ - '$1' - protected function sqlEntrysToRecords($sql_entries, $fields) { - $field_array_keys = array_keys($fields); - $records = []; - foreach($sql_entries as $sql_entry) { - $record = []; - foreach($sql_entry as $i => $value) { - $field = $field_array_keys[$i]; - if($fields[$field]['type'] == 'binary') { - if(is_string($value)) { - $record[$field] = hex2bin($value); - } - } else { - $record[$field] = $value; - } - } - $records[] = $record; - } - return $records; - } -} \ No newline at end of file diff --git a/community_server/tests/Fixture/CommunityProfilesFixture.php b/community_server/tests/Fixture/CommunityProfilesFixture.php deleted file mode 100644 index 0fa7ed764..000000000 --- a/community_server/tests/Fixture/CommunityProfilesFixture.php +++ /dev/null @@ -1,51 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'profile_img' => ['type' => 'binary', 'length' => 4294967295, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - 'profile_desc' => ['type' => 'string', 'length' => 2000, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - '_indexes' => [ - 'state_user_id' => ['type' => 'index', 'columns' => ['state_user_id'], 'length' => []], - ], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []] - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_general_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'state_user_id' => 1, - 'profile_img' => 'Lorem ipsum dolor sit amet', - 'profile_desc' => 'Lorem ipsum dolor sit amet', - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/ElopageBuysFixture.php b/community_server/tests/Fixture/ElopageBuysFixture.php deleted file mode 100644 index 20be0f4e3..000000000 --- a/community_server/tests/Fixture/ElopageBuysFixture.php +++ /dev/null @@ -1,64 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'elopage_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'affiliate_program_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'publisher_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'order_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'product_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'product_price' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'payer_email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'publisher_email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'payed' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'success_date' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'event' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'elopage_user_id' => 1, - 'affiliate_program_id' => 1, - 'publisher_id' => 1, - 'order_id' => 1, - 'product_id' => 1, - 'product_price' => 1, - 'payer_email' => 'Lorem ipsum dolor sit amet', - 'publisher_email' => 'Lorem ipsum dolor sit amet', - 'payed' => 1, - 'success_date' => '2020-02-13 09:49:46', - 'event' => 'Lorem ipsum dolor sit amet', - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/OperatorTypesFixture.php b/community_server/tests/Fixture/OperatorTypesFixture.php deleted file mode 100644 index dfc589034..000000000 --- a/community_server/tests/Fixture/OperatorTypesFixture.php +++ /dev/null @@ -1,46 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'text' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'name' => 'Lorem ipsum dolor sit a', - 'text' => 'Lorem ipsum dolor sit amet' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/OperatorsFixture.php b/community_server/tests/Fixture/OperatorsFixture.php deleted file mode 100644 index 2cb852efc..000000000 --- a/community_server/tests/Fixture/OperatorsFixture.php +++ /dev/null @@ -1,49 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'username' => ['type' => 'string', 'length' => 128, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'operator_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'data_base64' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'username' => ['type' => 'unique', 'columns' => ['username'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'username' => 'Lorem ipsum dolor sit amet', - 'operator_type_id' => 1, - 'data_base64' => 'Lorem ipsum dolor sit amet' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/RolesFixture.php b/community_server/tests/Fixture/RolesFixture.php deleted file mode 100644 index db2c7640f..000000000 --- a/community_server/tests/Fixture/RolesFixture.php +++ /dev/null @@ -1,45 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'title' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'roles_id_IDX' => ['type' => 'unique', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'title' => 'Lorem ipsum dolor sit amet', - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/ServerUsersFixture.php b/community_server/tests/Fixture/ServerUsersFixture.php deleted file mode 100644 index 3aeedab12..000000000 --- a/community_server/tests/Fixture/ServerUsersFixture.php +++ /dev/null @@ -1,58 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'username' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'password' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'email' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'role' => ['type' => 'string', 'length' => 20, 'null' => false, 'default' => 'admin', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'activated' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], - 'last_login' => ['type' => 'datetime', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'username' => 'Lorem ipsum dolor sit amet', - 'password' => 'Lorem ipsum dolor sit amet', - 'email' => 'Lorem ipsum dolor sit amet', - 'role' => 'Lorem ipsum dolor ', - 'activated' => 1, - 'last_login' => '2019-09-13 10:30:09', - 'created' => '2019-09-13 10:30:09', - 'modified' => '2019-09-13 10:30:09' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateBalancesFixture.php b/community_server/tests/Fixture/StateBalancesFixture.php deleted file mode 100644 index 015366c80..000000000 --- a/community_server/tests/Fixture/StateBalancesFixture.php +++ /dev/null @@ -1,46 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'record_date' => ['type' => 'datetime', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql = [ - [4, 4, '2021-05-27 17:47:50', '2021-05-27 17:47:50', 28808497], - [5, 1, '2021-05-27 17:47:51', '2021-05-27 17:47:50', 9823963] - ]; - $this->records = $this->sqlEntrysToRecords($sql, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateCreatedFixture.php b/community_server/tests/Fixture/StateCreatedFixture.php deleted file mode 100644 index 2f1abd155..000000000 --- a/community_server/tests/Fixture/StateCreatedFixture.php +++ /dev/null @@ -1,63 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'month' => ['type' => 'tinyinteger', 'length' => 4, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'year' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'short_ident_hash' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - '_indexes' => [ - 'short_ident_hash' => ['type' => 'index', 'columns' => ['short_ident_hash'], 'length' => []], - ], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'transaction_id' => 1, - 'month' => 1, - 'year' => 1, - 'state_user_id' => 1, - 'created' => '2019-09-12 11:14:51', - 'short_ident_hash' => 1 - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateErrorsFixture.php b/community_server/tests/Fixture/StateErrorsFixture.php deleted file mode 100644 index 6f0d95e26..000000000 --- a/community_server/tests/Fixture/StateErrorsFixture.php +++ /dev/null @@ -1,50 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'message_json' => ['type' => 'text', 'length' => null, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_general_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'state_user_id' => 1, - 'transaction_type_id' => 1, - 'created' => '2019-11-07 13:13:12', - 'message_json' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateGroupAddressesFixture.php b/community_server/tests/Fixture/StateGroupAddressesFixture.php deleted file mode 100644 index 2ae5581c8..000000000 --- a/community_server/tests/Fixture/StateGroupAddressesFixture.php +++ /dev/null @@ -1,49 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'group_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'address_type_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'public_key' => ['type' => 'unique', 'columns' => ['public_key'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'group_id' => 1, - 'public_key' => 'Lorem ipsum dolor sit amet', - 'address_type_id' => 1, - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateGroupRelationshipsFixture.php b/community_server/tests/Fixture/StateGroupRelationshipsFixture.php deleted file mode 100644 index e50d76f5d..000000000 --- a/community_server/tests/Fixture/StateGroupRelationshipsFixture.php +++ /dev/null @@ -1,48 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'state_group1_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'state_group2_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'state_relationship_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'state_group1_id' => 1, - 'state_group2_id' => 1, - 'state_relationship_id' => 1 - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateGroupsFixture.php b/community_server/tests/Fixture/StateGroupsFixture.php deleted file mode 100644 index 57cde2350..000000000 --- a/community_server/tests/Fixture/StateGroupsFixture.php +++ /dev/null @@ -1,50 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'index_id' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'name' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'root_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'user_count' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'index_id' => 'Lorem ipsum dolor sit amet', - 'name' => 'Lorem ipsum dolor sit amet', - 'root_public_key' => 'Lorem ipsum dolor sit amet', - 'user_count' => 1 - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateRelationshipTypesFixture.php b/community_server/tests/Fixture/StateRelationshipTypesFixture.php deleted file mode 100644 index c461e0ce3..000000000 --- a/community_server/tests/Fixture/StateRelationshipTypesFixture.php +++ /dev/null @@ -1,46 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'name' => 'Lorem ipsum dolor sit a', - 'text' => 'Lorem ipsum dolor sit amet' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateUserTransactionsFixture.php b/community_server/tests/Fixture/StateUserTransactionsFixture.php deleted file mode 100644 index 605e10e5b..000000000 --- a/community_server/tests/Fixture/StateUserTransactionsFixture.php +++ /dev/null @@ -1,59 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_type_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'balance' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => true, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'balance_date' => ['type' => 'timestamp', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql = [ - [1, 4, 1, 1, 0, '2021-04-09 00:00:00'], - [2, 1, 2, 1, 0, '2021-04-12 00:00:00'], - [5, 1, 3, 2, 0, '2021-04-12 00:00:00'], - [6, 4, 3, 2, 0, '2021-04-12 00:00:00'], - [7, 1, 4, 2, 0, '2021-04-14 00:00:00'], - [8, 4, 4, 2, 0, '2021-04-14 00:00:00'], - [23, 1, 5, 2, 0, '2021-04-14 09:01:07'], - [24, 4, 5, 2, 0, '2021-04-14 09:01:07'], - [25, 4, 7, 2, 0, '2021-04-14 09:02:28'], - [26, 1, 7, 2, 0, '2021-04-14 09:02:28'], - [27, 4, 8, 2, 0, '2021-04-14 09:28:46'], - [28, 1, 8, 2, 0, '2021-04-14 09:28:46'], - [29, 4, 9, 2, 0, '2021-04-14 09:31:28'], - [30, 1, 9, 2, 0, '2021-04-14 09:31:28'] - ]; - $this->records = $this->sqlEntrysToRecords($sql, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/StateUsersFixture.php b/community_server/tests/Fixture/StateUsersFixture.php deleted file mode 100644 index a9b033bf7..000000000 --- a/community_server/tests/Fixture/StateUsersFixture.php +++ /dev/null @@ -1,54 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'index_id' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], - 'group_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'email' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'first_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'username' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'disabled' => ['type' => 'tinyinteger', 'length' => 4, 'unsigned' => false, 'null' => true, 'default' => '0', 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'public_key' => ['type' => 'unique', 'columns' => ['public_key'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - - - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql_entrys = [ - [1, 0, 0, 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f', 'test1.gmail.de', 'Max', 'Mustermann', NULL, 0], - [3, 0, 0, '131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6', 'test2.gmail.com', 'Ines', 'Mustermann', NULL, 0], - [4, 0, 0, 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2', 'test3.yahoo.com', 'Samuel', 'Schmied', NULL, 0] - ]; - $this->records = $this->sqlEntrysToRecords($sql_entrys, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionCreationsFixture.php b/community_server/tests/Fixture/TransactionCreationsFixture.php deleted file mode 100644 index 4221e8729..000000000 --- a/community_server/tests/Fixture/TransactionCreationsFixture.php +++ /dev/null @@ -1,44 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'target_date' => ['type' => 'timestamp', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql = [ - [2, 1, 4, 10000000, '2021-01-01 00:00:00'], - [3, 2, 1, 10000000, '2021-01-01 00:00:00'] - ]; - $this->records = $this->sqlEntrysToRecords($sql, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php b/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php deleted file mode 100644 index 7b659386c..000000000 --- a/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php +++ /dev/null @@ -1,54 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'address_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'transaction_id' => 1, - 'address_type_id' => 1, - 'public_key' => 'Lorem ipsum dolor sit amet' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php b/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php deleted file mode 100644 index edb745441..000000000 --- a/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php +++ /dev/null @@ -1,48 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'allow' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'transaction_id' => 1, - 'group_id' => 1, - 'allow' => 1 - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionGroupCreatesFixture.php b/community_server/tests/Fixture/TransactionGroupCreatesFixture.php deleted file mode 100644 index 73db1c751..000000000 --- a/community_server/tests/Fixture/TransactionGroupCreatesFixture.php +++ /dev/null @@ -1,50 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'group_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'name' => ['type' => 'string', 'length' => 64, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'transaction_id' => 1, - 'group_public_key' => 'Lorem ipsum dolor sit amet', - 'state_group_id' => 1, - 'name' => 'Lorem ipsum dolor sit amet' - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionSendCoinsFixture.php b/community_server/tests/Fixture/TransactionSendCoinsFixture.php deleted file mode 100644 index c186ccf8e..000000000 --- a/community_server/tests/Fixture/TransactionSendCoinsFixture.php +++ /dev/null @@ -1,54 +0,0 @@ - ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'sender_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'state_user_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => true, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'receiver_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'receiver_user_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => true, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'sender_final_balance' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql = [ - [2, 3, '0000000000000000000000000000000000000000000000000000000000000000', 1, 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2', 4, 1000000, 6254699], - [3, 4, '0000000000000000000000000000000000000000000000000000000000000000', 1, 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2', 4, 100000, 7027197], - [11, 5, '0000000000000000000000000000000000000000000000000000000000000000', 1, 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2', 4, 100000, 6922113], - [12, 7, '0000000000000000000000000000000000000000000000000000000000000000', 4, 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f', 1, 100000, 9212951], - [13, 8, '0000000000000000000000000000000000000000000000000000000000000000', 4, 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f', 1, 100000, 9112627], - [14, 9, '0000000000000000000000000000000000000000000000000000000000000000', 4, 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f', 1, 100000, 8912594] - ]; - - $this->records = $this->sqlEntrysToRecords($sql, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionSignaturesFixture.php b/community_server/tests/Fixture/TransactionSignaturesFixture.php deleted file mode 100644 index 9a5bbecee..000000000 --- a/community_server/tests/Fixture/TransactionSignaturesFixture.php +++ /dev/null @@ -1,51 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'signature' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql = [ - [1, 1, '1c5357f9438f700a5378abadd0dbd74d90e335c6b9691bb9e126520813f3218573b19226382efb89aa8444a9ca98c2e8933463335baac37baf2f4eecd990600a', 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f'], - [2, 2, '5215376ae7fb989993e3466961636519d4ade77b3bde066149ade028ad54a1a88ca8a206fcf09f52839ae0ed37b99df08ec9af12f3f37197979a206489e3ff0f', 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2'], - [3, 3, 'c70f124feaaea02194d22a5f597963ed3e430343122a0952877854766fe37a709f92b39510de2aae494ef11abe743cd59f08f971b1e0e36f4c333990453d8b0d', 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f'], - [4, 4, 'a65b39e51ab6191c51d5629bbcefd30f85f801efbb14e1c635c519e97abe217a248820fa1fc6aef56227c9d888c1919bc92471d5d7ae3522c9c50fba9f0d8402', 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f'], - [5, 5, 'a65b39e51ab6191c51d5629bbcefd30f85f801efbb14e1c635c519e97abe217a248820fa1fc6aef56227c9d888c1919bc92471d5d7ae3522c9c50fba9f0d8402', 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f'], - [6, 7, 'c233726674bff9bfb8ccb98bf358c6bc701825d971ece915d3c3a3de98886d1d13ee2f773cd9fc4ccbe543ac17be0d780ebead23a0dbf4ec814f7bae2efb9c0e', 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2'], - [7, 8, '83ab780535883ec53ee76d0f68db0e1596418c9e100c806a4d4655d4dedf589d54a6319a2795dabab301e212b52f0dafb2725b7583447f19e47cb417d188a107', 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2'], - [8, 9, '83ab780535883ec53ee76d0f68db0e1596418c9e100c806a4d4655d4dedf589d54a6319a2795dabab301e212b52f0dafb2725b7583447f19e47cb417d188a107', 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2'] - ]; - $this->records = $this->sqlEntrysToRecords($sql, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionTypesFixture.php b/community_server/tests/Fixture/TransactionTypesFixture.php deleted file mode 100644 index 48e00e0ec..000000000 --- a/community_server/tests/Fixture/TransactionTypesFixture.php +++ /dev/null @@ -1,51 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'name' => ['type' => 'string', 'length' => 24, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_bin' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'name' => 'creation', - 'text' => 'Aktives oder Bedingsungsloses Grundeinkommen' - ], - [ - 'id' => 2, - 'name' => 'transfer', - 'text' => 'Einfache Überweisung' - ] - ]; - parent::init(); - } -} diff --git a/community_server/tests/Fixture/TransactionsFixture.php b/community_server/tests/Fixture/TransactionsFixture.php deleted file mode 100644 index 8c38f0657..000000000 --- a/community_server/tests/Fixture/TransactionsFixture.php +++ /dev/null @@ -1,55 +0,0 @@ - ['type' => 'biginteger', 'length' => 20, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'state_group_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'transaction_type_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'tx_hash' => ['type' => 'binary', 'length' => 48, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - 'memo' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'received' => ['type' => 'timestamp', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null], - 'blockchain_type_id' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => true, 'null' => false, 'default' => '1', 'comment' => '', 'precision' => null, 'autoIncrement' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8mb4_unicode_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $sql = [ - [1, NULL, 1, '15f242a7bb92a7db82678e0baf5ec1734c038ac0dc7b19e6d1ebbcf92a6cf3ad00000000000000000000000000000000', 'AGE Januar 2021', '2021-04-09 00:00:00', 1], - [2, NULL, 1, 'f932eca7686802d1697773fea713a3c6a3e3dace8b5aa552dd8503d50ce349f500000000000000000000000000000000', 'AGE Januar 2021', '2021-04-12 00:00:00', 1], - [3, NULL, 2, '4e2235f208edaf5cbb285955732022a625cf1e100eb629c56896d2fbfb8b34e800000000000000000000000000000000', 'test', '2021-04-12 00:00:00', 1], - [4, NULL, 2, 'fc6e69696beb7c56ad7c511fc3999f954411427bec810184b70c092911deae1900000000000000000000000000000000', 'test time', '2021-04-14 00:00:00', 1], - [5, NULL, 2, 'a7149ebc0d6cd8c061906dafe05e13689b51642a41100d0ec7bb6cd2dcafdc1800000000000000000000000000000000', 'test time', '2021-04-14 09:01:07', 1], - [6, NULL, 9, '', '', '2021-04-14 09:02:00', 1], - [7, NULL, 2, '2e3c3ab3e42c06f2ecb12f61c970712467d8ad9ddfa16fa58dd76492e5924b7d00000000000000000000000000000000', 'test time 3', '2021-04-14 09:02:28', 1], - [8, NULL, 2, 'c2c6354d77ff371daeee25fce9c947748b53d3d6b8398a92bd681923cfd2057100000000000000000000000000000000', 'test login crash', '2021-04-14 09:28:46', 1], - [9, NULL, 2, '5a8cbf1aaac06b00b2951ff39983cb2ca9a1e6710d72c8e5067278dc679a823100000000000000000000000000000000', 'test login crash', '2021-04-14 09:31:28', 1] - ]; - $this->records = $this->sqlEntrysToRecords($sql, $this->fields); - parent::init(); - } -} diff --git a/community_server/tests/Fixture/UsersFixture.php b/community_server/tests/Fixture/UsersFixture.php deleted file mode 100644 index fc1a9e620..000000000 --- a/community_server/tests/Fixture/UsersFixture.php +++ /dev/null @@ -1,61 +0,0 @@ - ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'first_name' => ['type' => 'string', 'length' => 150, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => '', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - 'password' => ['type' => 'biginteger', 'length' => 25, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - 'privkey' => ['type' => 'binary', 'length' => 80, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], - 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null], - 'email_checked' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], - 'language' => ['type' => 'string', 'length' => 4, 'null' => false, 'default' => 'de', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null], - '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'email' => ['type' => 'unique', 'columns' => ['email'], 'length' => []], - ], - '_options' => [ - 'engine' => 'InnoDB', - 'collation' => 'utf8_general_ci' - ], - ]; - // @codingStandardsIgnoreEnd - /** - * Init method - * - * @return void - */ - public function init() - { - $this->records = [ - [ - 'id' => 1, - 'email' => 'Lorem ipsum dolor sit amet', - 'first_name' => 'Lorem ipsum dolor sit amet', - 'last_name' => 'Lorem ipsum dolor sit amet', - 'password' => 1, - 'pubkey' => 'Lorem ipsum dolor sit amet', - 'privkey' => 'Lorem ipsum dolor sit amet', - 'created' => '2020-02-13 10:54:19', - 'email_checked' => 1, - 'language' => 'Lo', - ], - ]; - parent::init(); - } -} diff --git a/community_server/tests/TestCase/ApplicationTest.php b/community_server/tests/TestCase/ApplicationTest.php deleted file mode 100644 index 1d183729d..000000000 --- a/community_server/tests/TestCase/ApplicationTest.php +++ /dev/null @@ -1,83 +0,0 @@ -bootstrap(); - $plugins = $app->getPlugins(); - - $this->assertCount(2, $plugins); - $this->assertSame('Bake', $plugins->get('Bake')->getName()); - $this->assertSame('DebugKit', $plugins->get('DebugKit')->getName()); - } - - /** - * testBootstrapPluginWitoutHalt - * - * @return void - */ - public function testBootstrapPluginWithoutHalt() - { - $this->expectException(InvalidArgumentException::class); - - $app = $this->getMockBuilder(Application::class) - ->setConstructorArgs([dirname(dirname(__DIR__)) . '/config']) - ->setMethods(['addPlugin']) - ->getMock(); - - $app->method('addPlugin') - ->will($this->throwException(new InvalidArgumentException('test exception.'))); - - $app->bootstrap(); - } - - /** - * testMiddleware - * - * @return void - */ - public function testMiddleware() - { - $app = new Application(dirname(dirname(__DIR__)) . '/config'); - $middleware = new MiddlewareQueue(); - - $middleware = $app->middleware($middleware); - - $this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0)); - $this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1)); - $this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2)); - } -} diff --git a/community_server/tests/TestCase/Controller/AddressTypesControllerTest.php b/community_server/tests/TestCase/Controller/AddressTypesControllerTest.php deleted file mode 100644 index 835fc8d08..000000000 --- a/community_server/tests/TestCase/Controller/AddressTypesControllerTest.php +++ /dev/null @@ -1,77 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php deleted file mode 100644 index a9044b4ae..000000000 --- a/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php +++ /dev/null @@ -1,76 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/AppRequestControllerTest.php.old b/community_server/tests/TestCase/Controller/AppRequestControllerTest.php.old deleted file mode 100644 index 321ed5ac1..000000000 --- a/community_server/tests/TestCase/Controller/AppRequestControllerTest.php.old +++ /dev/null @@ -1,345 +0,0 @@ -session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 1, - 'email_checked' => 1, - 'public_hex' => 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f' - ] - ]); - - $response = $this->getAndParseWithoutCompare('/api/get-balance/' . $session_id); - $this->assertEquals('success', $response->state); - $this->assertEquals(9099652, $response->balance); - $this->assertLessThan(9099652, $response->decay); - - } - - public function testGetBalance2() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 3, - 'email_checked' => 1, - 'public_hex' => '131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6' - ] - ]); - - $response = $this->getAndParseWithoutCompare('/api/get-balance/' . $session_id); - $this->assertEquals('success', $response->state); - $this->assertEquals(0, $response->balance); - } - public function testGetBalance3() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 4, - 'email_checked' => 1, - 'public_hex' => 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2' - ] - ]); - - $response = $this->getAndParseWithoutCompare('/api/get-balance/' . $session_id); - $this->assertEquals('success', $response->state); - $this->assertEquals(10899568, $response->balance); - $this->assertLessThan(10899568, $response->decay); - } - - public function testGetBalanceInvalidSession() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'email_checked' => 1, - 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' - ] - ]); - - $this->getAndParse('/api/get-balance/' . 1211, - ['state' => 'not found', 'msg' => 'invalid session', - 'details' => ['msg' => 'session not found', 'state' => 'not found'] - ] - ); - } - - public function testGetBalanceInvalidSessionId() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'email_checked' => 1, - 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' - ] - ]); - - $this->getAndParse('/api/get-balance/' , - ['state' => 'not found', 'msg' => 'invalid session', - 'details' => ['msg' => 'session not found', 'state' => 'not found'] - ] - ); - } - - /** - * Test ajaxListTransactions method - * - * @return void - */ - public function testListTransactions() - { - //ajaxListTransactions - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transactions' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 1, - 'first_name' => 'Dario', - 'last_name' => 'Frodo', - 'email_checked' => 1, - 'email' => 'fördertest@gradido.org', - 'public_hex' => '94ae135b93cd9f33752b4e55c41903a3faa13a75bb90bfd411ea1d4a1a5e711f' - ] - ]); - //echo "balance: $balance"; - $expectedResult = '{ - "state": "success", - "transactions": [ - { - "transaction_id": 2, - "date": "2021-04-12T00:00:00+00:00", - "memo": "AGE Januar 2021", - "name": "Gradido Akademie", - "type": "creation", - "target_date": "2021-01-01T00:00:00+00:00", - "balance": 10000000 - }, - { - "transaction_id": 3, - "date": "2021-04-12T00:00:00+00:00", - "memo": "test", - "balance": 1000000, - "type": "send", - "pubkey": "e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2", - "name": "Samuel Schmied", - "email": "test3.yahoo.com" - }, - { - "transaction_id": 4, - "date": "2021-04-14T00:00:00+00:00", - "memo": "test time", - "balance": 100000, - "type": "send", - "pubkey": "e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2", - "name": "Samuel Schmied", - "email": "test3.yahoo.com" - }, - { - "transaction_id": 5, - "date": "2021-04-14T09:01:07+00:00", - "memo": "test time", - "balance": 100000, - "type": "send", - "pubkey": "e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2", - "name": "Samuel Schmied", - "email": "test3.yahoo.com" - }, - { - "transaction_id": 7, - "date": "2021-04-14T09:02:28+00:00", - "memo": "test time 3", - "decay": { - "balance": 6, - "decay_duration": "0 days, 00 hours, 00 minutes, 28 seconds", - "decay_start": 1618390920, - "decay_end": 1618390948, - "decay_start_block": 1618390920 - }, - "balance": 100000, - "type": "receive", - "pubkey": "0000000000000000000000000000000000000000000000000000000000000000", - "name": "Samuel Schmied", - "email": "test3.yahoo.com" - }, - { - "transaction_id": 8, - "date": "2021-04-14T09:28:46+00:00", - "memo": "test login crash", - "decay": { - "balance": 309, - "decay_duration": "0 days, 00 hours, 26 minutes, 18 seconds", - "decay_start": 1618390948, - "decay_end": 1618392526 - }, - "balance": 100000, - "type": "receive", - "pubkey": "0000000000000000000000000000000000000000000000000000000000000000", - "name": "Samuel Schmied", - "email": "test3.yahoo.com" - }, - { - "transaction_id": 9, - "date": "2021-04-14T09:31:28+00:00", - "memo": "test login crash", - "decay": { - "balance": 33, - "decay_duration": "0 days, 00 hours, 02 minutes, 42 seconds", - "decay_start": 1618392526, - "decay_end": 1618392688 - }, - "balance": 100000, - "type": "receive", - "pubkey": "0000000000000000000000000000000000000000000000000000000000000000", - "name": "Samuel Schmied", - "email": "test3.yahoo.com" - }, - { - "type": "decay", - "balance": 1345726, - "decay_duration": "on 14.04.21", - "decay_start": 1618392688, - "decay_end": 1625673853, - "memo": "" - } - ], - "transactionExecutingCount": 0, - "count": 7, - "gdtSum": 180000, - "timeUsed": 0.44154810905456545, - "decay_date": "2021-07-07T16:04:13+00:00", - "balance": 9099652, - "decay": 7753926 -}'; - $this->getAndParse('/api/list-transactions/', json_decode($expectedResult, true)); - } - - - private function getAndParse($path, $expected) - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - - $this->disableErrorHandlerMiddleware(); - $this->get($path); - - // Check that the response was in 2xx - 3xx - $this->assertResponseSuccess(); - $json = (object)$this->viewVariable('body'); - - if(!$json) { - // Check that the response was a 200 - $this->assertResponseOk(); - - $responseBodyString = (string)$this->_response->getBody(); - $json = json_decode($responseBodyString); - $this->assertNotFalse($json); - } else { - $responseBodyString = json_encode($json); - } - - if(is_array($expected)) { - $dynamic_fields = ['timeUsed', 'decay_date', 'decay', 'gdtSum']; - // copy timeUsed because this value will be variy always - foreach($dynamic_fields as $field) { - if(isset($expected[$field]) && isset($json->$field)) { - $expected[$field] = $json->$field; - } - } - // decay balance variy always - if(isset($expected['transactions'])) { - $dynamic_transaction_fields = ['decay_duration', 'balance', 'decay_end']; - foreach($expected['transactions'] as $i => $transaction) { - if(isset($transaction['type']) && $transaction['type'] == 'decay') { - foreach($dynamic_transaction_fields as $field) { - if(isset($transaction[$field])) { - $expected['transactions'][$i][$field] = $json->transactions[$i][$field]; - } - } - } - } - } - $expected = json_encode($expected); - } - - $this->assertEquals($expected, $responseBodyString); - } - private function getAndParseWithoutCompare($path) - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - - $this->disableErrorHandlerMiddleware(); - $this->get($path); - - // Check that the response was in 2xx - 3xx - $this->assertResponseSuccess(); - $view_body = $this->viewVariable('body'); - if($view_body) { - return (object)$view_body; - } - // Check that the response was a 200 - $this->assertResponseOk(); - $responseBodyString = (string)$this->_response->getBody(); - $json = json_decode($responseBodyString, true); - $this->assertNotFalse($json); - - return $json; - } -} diff --git a/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php b/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php deleted file mode 100644 index 35f439dd7..000000000 --- a/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php +++ /dev/null @@ -1,75 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php b/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php deleted file mode 100644 index be6167155..000000000 --- a/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php +++ /dev/null @@ -1,95 +0,0 @@ -GradidoNumberComponent = new GradidoNumberComponent($registry); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->GradidoNumberComponent); - - parent::tearDown(); - } - - /** - * Test parseInputNumberToCentNumber method - * - * @return void - */ - /* public function testParseInputNumberToCentNumber() - { - $this->markTestIncomplete('Not implemented yet.'); - }*/ - - public function test100() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(100); - $this->assertEquals(1000000, $result); - } - - public function test1000() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(1000); - $this->assertEquals(10000000, $result); - } - - public function test100Comma() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('100,12'); - $this->assertEquals(1001200, $result); - } - - public function test100Point() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('100.12'); - $this->assertEquals(1001200, $result); - } - - public function test100Decimal() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(100.12); - $this->assertEquals(1001200, $result); - } - - public function test1000Point() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('1000.12'); - $this->assertEquals(10001200, $result); - } - - public function test1000Comma() - { - $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('1000,12'); - $this->assertEquals(10001200, $result); - } -} diff --git a/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php deleted file mode 100644 index c1ba84ee3..000000000 --- a/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php +++ /dev/null @@ -1,72 +0,0 @@ -JsonRequestClientComponent = new JsonRequestClientComponent($registry); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->JsonRequestClientComponent); - - parent::tearDown(); - } - - /** - * Test sendTransaction method - * - * @return void - */ - public function testSendTransaction() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test is_base64 method - * - * @return void - */ - public function testIsBase64Valid() - { - $result = $this->JsonRequestClientComponent->is_base64('CgpIYWxsbyBXZWx0EgYIr6fe7wVKLwonCiDWDyYU4+zldTQdQMIzGpsL20W+vV44JuNVA5hwczIELRDgg5sBELmhkoIE'); - - $this->assertEquals($result, true); - } - - public function testIsBase64Invalid() - { - $result = $this->JsonRequestClientComponent->is_base64('CgpIYWxsbyBXZWx0EgYIr6fe7wVKLwonCiDWDyYU4-zldTQdQMIzGpsL20W+vV44JuNVA5hwczIELRDgg5sBELmhkoIE'); - - $this->assertEquals($result, false); - } -} diff --git a/community_server/tests/TestCase/Controller/DashboardControllerTest.php b/community_server/tests/TestCase/Controller/DashboardControllerTest.php deleted file mode 100644 index cddf0b7ef..000000000 --- a/community_server/tests/TestCase/Controller/DashboardControllerTest.php +++ /dev/null @@ -1,45 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test index method - * - * @return void - */ - public function testIndex() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php deleted file mode 100644 index f990b3e57..000000000 --- a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php +++ /dev/null @@ -1,176 +0,0 @@ - 'CmYKZAog4zad42I86ERtBCTEAT56HXGiZxrj178eeY6_BmXRRfISQDnatUMvitiiP0-sY93JStYPhPKKPU4Vosv_EGrh77BVs48xhPgPj2QHWC3oyuuMh6nN8YNjBQZx20rKvdQ4uwMSRwoMQUdFIE1haSAyMDIxEgYI_c3ChQY6LwolCiD39KSaSsEDefi53ctzHE2exJXm7dFgdfUmcs0l4xefDxDQDxoGCPqbtIQG', - 'validCreation900' => 'CmYKZAog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8SQCaZHmvmvJOt336E3qst3rn1pptdAR5ZPzePaUT10x0_Yky8FnEiQtMGNy1yT94QErzwQudJZjJwDY2uyK4cTgkSOxIGCKb1vYUGOjEKJwog4zad42I86ERtBCTEAT56HXGiZxrj178eeY6_BmXRRfIQgNHKCBoGCIDMuf8F', - 'validCreation1200' => 'CmYKZAog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8SQF8jptIrosEyVmCf3WEIGVOK0NR8YCcO0j-s8v2yUyR5BKus0ciT6B7IA5LDtn7eQX6zHjg1v5WlsTiZuOpuNgwSRAoHVG8gbXVjaBIGCL3Jv4UGOjEKJwog4zad42I86ERtBCTEAT56HXGiZxrj178eeY6_BmXRRfIQgOy4CxoGCOG5toQG', - 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3', - 'validTransfer' => 'CmYKZAog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8SQA0ZVQ9T1qBabzmgDO1NAWNy2J6mlv0YjMP99CiV7bSR0zemt5XoM-kTviR1aTqKggzpSYSyTN5T6gIx2xa-hgkSYwoLTXkgQmlydGhkYXkSBgie0L-FBjJMCkoKJgog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8QgIl6EiDjNp3jYjzoRG0EJMQBPnodcaJnGuPXvx55jr8GZdFF8g', - 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==' - ]; - - /*public function setUp() { - parent::setUp(); - } -*/ - public function testWrongMethod() - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - $this->get('/JsonRequestHandler'); - $this->assertResponseOk(); - - $expected = json_encode(['state' => 'error', 'msg' => 'unknown method for get', 'details' => null]); - $this->assertEquals($expected, (string)$this->_response->getBody()); - } - - public function testInvalidJson() - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - $this->post('/JsonRequestHandler', '{This isn\'t valid json}'); - $this->assertResponseOk(); - - $expected = json_encode(['state' => 'error', 'msg' => 'parameter error']); - $this->assertEquals($expected, (string)$this->_response->getBody()); - } - - public function testNotSetTransaction() - { - $this->postAndParse( - ['method' => 'putTransaction'], - ['state' => 'error', 'msg' => 'parameter error'] - ); - } - public function testNotSetMethod() - { - $this->postAndParse( - ['transaction' => $this->transactions['validCreation']], - ['state' => 'error', 'msg' => 'parameter error'] - ); - } - - public function testUnknownMethod() - { - //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']); - $this->postAndParse( - ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']], - ['state' => 'error', 'msg' => 'unknown method for post', 'details' => 'foobar'] - ); - - } - - public function testInvalidEncodedTransaction() { - //"msg":"error parsing transaction","details":[{"Transaction":"base64 decode error"}] - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']], - ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ - ['Transaction' => 'invalid base64 string'], - ['base64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3'] - ]] - ); - } - - public function testInvalidTransaction() { - - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => base64_encode('Hallo Miau Welt')], - ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ - ['Transaction' => 'Error occurred during parsing: Unexpected wire type.'] - ]] - ); - } - - public function testToLargeCreationSum() - { - - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']], - '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}' - ); - } - - public function testToLargeCreation() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']], - '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}' - ); - } - - public function testValidTransfer() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']], - ['state' => 'success'] - ); - } - - public function testValidCreation() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']], - ['state' => 'success'] - ); - } - - private function postAndParse($params, $expected) - { - $this->enableCsrfToken(); - //$this->enableSecurityToken(); - - //$token = 'my-csrf-token'; - //$this->cookie('csrfToken', $token); - - $this->configRequest([ - 'headers' => ['Accept' => 'application/json']//, 'X-CSRF-Token' => $token] - ]); - - $this->disableErrorHandlerMiddleware(); - $this->post('/JsonRequestHandler', json_encode($params)); - - // Check that the response was a 200 - $this->assertResponseOk(); - - $responseBodyString = (string)$this->_response->getBody(); - $json = json_decode($responseBodyString); - $this->assertNotFalse($json); - - if(is_array($expected)) { - $expected = json_encode($expected); - } - $this->assertEquals($expected, $responseBodyString); - } -} diff --git a/community_server/tests/TestCase/Controller/PagesControllerTest.php b/community_server/tests/TestCase/Controller/PagesControllerTest.php deleted file mode 100644 index a8fd65233..000000000 --- a/community_server/tests/TestCase/Controller/PagesControllerTest.php +++ /dev/null @@ -1,101 +0,0 @@ -get('/'); - $locations = $this->_response->getHeader('Location'); - $this->assertRegExp('%.*/account/$%', $locations[0]); - - $this->get('/'); - $locations = $this->_response->getHeader('Location'); - $this->assertRegExp('%.*/account/$%', $locations[0]); - } - - /** - * testDisplay method - * - * @return void - */ - public function testDisplay() - { - $this->get('/pages/home'); - $this->assertResponseOk(); - $this->assertResponseContains('CakePHP'); - $this->assertResponseContains(''); - } - - /** - * Test that missing template renders 404 page in production - * - * @return void - */ - public function testMissingTemplate() - { - Configure::write('debug', false); - $this->get('/pages/not_existing'); - - $this->assertResponseError(); - $this->assertResponseContains('Not Found'); - } - - /** - * Test that missing template in debug mode renders missing_template error page - * - * @return void - */ - public function testMissingTemplateInDebug() - { - Configure::write('debug', true); - $this->get('/pages/not_existing'); - - $this->assertResponseFailure(); - $this->assertResponseContains('Template file \u0022Pages\/not_existing.ctp\u0022 is missing.'); - $this->assertResponseContains('not_existing.ctp'); - } - - /** - * Test directory traversal protection - * - * @return void - */ - public function testDirectoryTraversalProtection() - { - $this->get('/pages/../Layout/ajax'); - $this->assertResponseCode(403); - $this->assertResponseContains('Forbidden'); - } -} diff --git a/community_server/tests/TestCase/Controller/ProfilesControllerTest.php b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php deleted file mode 100644 index d87558e55..000000000 --- a/community_server/tests/TestCase/Controller/ProfilesControllerTest.php +++ /dev/null @@ -1,76 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/RolesControllerTest.php b/community_server/tests/TestCase/Controller/RolesControllerTest.php deleted file mode 100644 index 12b2868a2..000000000 --- a/community_server/tests/TestCase/Controller/RolesControllerTest.php +++ /dev/null @@ -1,75 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php deleted file mode 100644 index 9ef8d28e9..000000000 --- a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php +++ /dev/null @@ -1,179 +0,0 @@ -StateBalances = TableRegistry::getTableLocator()->get('StateBalances'); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test index method - * - * @return void - */ - public function testIndex() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test overview method - * - * @return void - */ - public function testOverview() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - - - /** - * Test overviewGdt method - * - * @return void - */ - public function testOverviewGdt() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test sortTransactions method - * - * @return void - */ - public function testSortTransactions() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - - private function getAndParse($path, $expected) - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - - $this->disableErrorHandlerMiddleware(); - $this->get($path); - - // Check that the response was a 200 - $this->assertResponseOk(); - - $responseBodyString = (string)$this->_response->getBody(); - $json = json_decode($responseBodyString); - $this->assertNotFalse($json); - - if(is_array($expected)) { - // copy timeUsed because this value will be variy always - if(isset($expected['timeUsed']) && isset($json->timeUsed)) { - $expected['timeUsed'] = $json->timeUsed; - } - $expected = json_encode($expected); - } - - $this->assertEquals($expected, $responseBodyString); - } - private function getAndParseWithoutCompare($path) - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - - $this->disableErrorHandlerMiddleware(); - $this->get($path); - - // Check that the response was a 200 - $this->assertResponseOk(); - - $responseBodyString = (string)$this->_response->getBody(); - $json = json_decode($responseBodyString); - $this->assertNotFalse($json); - - return $json; - } -} diff --git a/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php deleted file mode 100644 index 452af54fc..000000000 --- a/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php +++ /dev/null @@ -1,77 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php b/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php deleted file mode 100644 index 0c9e0a513..000000000 --- a/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php +++ /dev/null @@ -1,78 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php deleted file mode 100644 index 74c0e4b1e..000000000 --- a/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php +++ /dev/null @@ -1,97 +0,0 @@ -markTestIncomplete('Not implemented yet.'); - } - - /** - * Test index method - * - * @return void - */ - public function testIndex() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test view method - * - * @return void - */ - public function testView() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test create method - * - * @return void - */ - public function testCreate() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test add method - * - * @return void - */ - public function testAdd() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test edit method - * - * @return void - */ - public function testEdit() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test delete method - * - * @return void - */ - public function testDelete() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Behavior/empty b/community_server/tests/TestCase/Model/Behavior/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/community_server/tests/TestCase/Model/Table/AddressTypesTableTest.php b/community_server/tests/TestCase/Model/Table/AddressTypesTableTest.php deleted file mode 100644 index 8f145215c..000000000 --- a/community_server/tests/TestCase/Model/Table/AddressTypesTableTest.php +++ /dev/null @@ -1,74 +0,0 @@ -exists('AddressTypes') ? [] : ['className' => AddressTypesTable::class]; - $this->AddressTypes = TableRegistry::getTableLocator()->get('AddressTypes', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->AddressTypes); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php b/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php deleted file mode 100644 index 09d7a35fb..000000000 --- a/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php +++ /dev/null @@ -1,83 +0,0 @@ -exists('AdminErrors') ? [] : ['className' => AdminErrorsTable::class]; - $this->AdminErrors = TableRegistry::getTableLocator()->get('AdminErrors', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->AdminErrors); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test buildRules method - * - * @return void - */ - public function testBuildRules() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php b/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php deleted file mode 100644 index 0d7e5fba2..000000000 --- a/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php +++ /dev/null @@ -1,72 +0,0 @@ -exists('CommunityProfiles') ? [] : ['className' => CommunityProfilesTable::class]; - $this->CommunityProfiles = TableRegistry::getTableLocator()->get('CommunityProfiles', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->CommunityProfiles); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Table/RolesTableTest.php b/community_server/tests/TestCase/Model/Table/RolesTableTest.php deleted file mode 100644 index b40a0ca9b..000000000 --- a/community_server/tests/TestCase/Model/Table/RolesTableTest.php +++ /dev/null @@ -1,82 +0,0 @@ -exists('Roles') ? [] : ['className' => RolesTable::class]; - $this->Roles = TableRegistry::getTableLocator()->get('Roles', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->Roles); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test buildRules method - * - * @return void - */ - public function testBuildRules() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php b/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php deleted file mode 100644 index 68049de34..000000000 --- a/community_server/tests/TestCase/Model/Table/StateBalancesTableTest.php +++ /dev/null @@ -1,124 +0,0 @@ -exists('StateBalances') ? [] : ['className' => StateBalancesTable::class]; - $this->StateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->StateBalancesTable); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test buildRules method - * - * @return void - */ - public function testBuildRules() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test sortTransactions method - * - * @return void - */ - public function testSortTransactions() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test updateLastStateBalanceOfMonth method - * - * @return void - */ - public function testUpdateLastStateBalanceOfMonth() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test chooseForMonthAndUser method - * - * @return void - */ - public function testChooseForMonthAndUser() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test updateBalanceWithTransaction method - * - * @return void - */ - public function testUpdateBalanceWithTransaction() - { - $this->markTestIncomplete('Not implemented yet.'); - } - -} diff --git a/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php b/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php deleted file mode 100644 index 21cbe6128..000000000 --- a/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php +++ /dev/null @@ -1,84 +0,0 @@ -exists('StateErrors') ? [] : ['className' => StateErrorsTable::class]; - $this->StateErrors = TableRegistry::getTableLocator()->get('StateErrors', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->StateErrors); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test buildRules method - * - * @return void - */ - public function testBuildRules() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Table/StateUserTransactionsTableTest.php b/community_server/tests/TestCase/Model/Table/StateUserTransactionsTableTest.php deleted file mode 100644 index 173ad8e12..000000000 --- a/community_server/tests/TestCase/Model/Table/StateUserTransactionsTableTest.php +++ /dev/null @@ -1,85 +0,0 @@ -exists('StateUserTransactions') ? [] : ['className' => StateUserTransactionsTable::class]; - $this->StateUserTransactions = TableRegistry::getTableLocator()->get('StateUserTransactions', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->StateUserTransactions); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test buildRules method - * - * @return void - */ - public function testBuildRules() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php b/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php deleted file mode 100644 index 49deb1166..000000000 --- a/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php +++ /dev/null @@ -1,97 +0,0 @@ -exists('StateUsers') ? [] : ['className' => StateUsersTable::class]; - $this->StateUsersTable = TableRegistry::getTableLocator()->get('StateUsers', $config); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->StateUsersTable); - - parent::tearDown(); - } - - /** - * Test initialize method - * - * @return void - */ - public function testInitialize() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test validationDefault method - * - * @return void - */ - public function testValidationDefault() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test buildRules method - * - * @return void - */ - public function testBuildRules() - { - $this->markTestIncomplete('Not implemented yet.'); - } - - /** - * Test getReceiverProposal method - * - * @return void - */ - public function testGetReceiverProposal() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php deleted file mode 100644 index e53549a42..000000000 --- a/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php +++ /dev/null @@ -1,41 +0,0 @@ -assertEquals(true, true); - } - - - - -} diff --git a/community_server/tests/TestCase/View/Helper/empty b/community_server/tests/TestCase/View/Helper/empty deleted file mode 100644 index e69de29bb..000000000 diff --git a/community_server/tests/bootstrap.php b/community_server/tests/bootstrap.php deleted file mode 100644 index 0ca191e4a..000000000 --- a/community_server/tests/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ - - RewriteEngine On - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - diff --git a/community_server/webroot/css/fonts_local.css b/community_server/webroot/css/fonts_local.css deleted file mode 100644 index 99dac0484..000000000 --- a/community_server/webroot/css/fonts_local.css +++ /dev/null @@ -1,79 +0,0 @@ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 21.01.2021, 12:32:20 - Author : einhornimmond -*/ - -/* open-sans-300 - latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - src: url('../fonts/open-sans-v18-latin-300.eot'); /* IE9 Compat Modes */ - src: local(''), - url('../fonts/open-sans-v18-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/open-sans-v18-latin-300.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/open-sans-v18-latin-300.woff') format('woff'), /* Modern Browsers */ - url('../fonts/open-sans-v18-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/open-sans-v18-latin-300.svg#OpenSans') format('svg'); /* Legacy iOS */ -} - -/* open-sans-regular - latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('../fonts/open-sans-v18-latin-regular.eot'); /* IE9 Compat Modes */ - src: local(''), - url('../fonts/open-sans-v18-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/open-sans-v18-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/open-sans-v18-latin-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/open-sans-v18-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/open-sans-v18-latin-regular.svg#OpenSans') format('svg'); /* Legacy iOS */ -} - -/* open-sans-600 - latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: url('../fonts/open-sans-v18-latin-600.eot'); /* IE9 Compat Modes */ - src: local(''), - url('../fonts/open-sans-v18-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/open-sans-v18-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/open-sans-v18-latin-600.woff') format('woff'), /* Modern Browsers */ - url('../fonts/open-sans-v18-latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/open-sans-v18-latin-600.svg#OpenSans') format('svg'); /* Legacy iOS */ -} - -/* open-sans-700 - latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: url('../fonts/open-sans-v18-latin-700.eot'); /* IE9 Compat Modes */ - src: local(''), - url('../fonts/open-sans-v18-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/open-sans-v18-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/open-sans-v18-latin-700.woff') format('woff'), /* Modern Browsers */ - url('../fonts/open-sans-v18-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/open-sans-v18-latin-700.svg#OpenSans') format('svg'); /* Legacy iOS */ -} - -/* open-sans-800 - latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 800; - src: url('../fonts/open-sans-v18-latin-800.eot'); /* IE9 Compat Modes */ - src: local(''), - url('../fonts/open-sans-v18-latin-800.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/open-sans-v18-latin-800.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/open-sans-v18-latin-800.woff') format('woff'), /* Modern Browsers */ - url('../fonts/open-sans-v18-latin-800.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/open-sans-v18-latin-800.svg#OpenSans') format('svg'); /* Legacy iOS */ -} diff --git a/community_server/webroot/css/grd_styles.css b/community_server/webroot/css/grd_styles.css deleted file mode 100644 index e745ea55e..000000000 --- a/community_server/webroot/css/grd_styles.css +++ /dev/null @@ -1,1821 +0,0 @@ -/* ============================================================ - - Grid Layout Page - - Datei : layout.less - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -/*==================================== -= BREAK POINTS = -====================================*/ -/* https://scotch.io/courses/getting-started-with-less/responsive-and-media-queries */ -/* GRID */ -.layout { - display: grid; - grid-template-rows: [top] 8vh [line2] 86vh [footer1] 3vh [footer2] 5vh [end]; - grid-template-columns: [left1] auto [left2] 1fr [left3] 12fr [right3] 1fr [right2] auto [right1]; - grid-template-areas: "header header header header header" "left . center center ." "footer footer footer footer footer" "bottom bottom bottom bottom bottom"; - margin: 0; - padding: 0; -} -@media (max-width:1199px) { - .layout { - grid-template-areas: "header header header header header" "left . center center center" "footer footer footer footer footer" "bottom bottom bottom bottom bottom"; - } -} -@media (max-width:767px) { - .layout { - position: relative; - display: grid; - grid-template-rows: [top] 12vh [line2] 80vh [footer1] 3vh [footer2] 8vh [end]; - grid-template-columns: [left1] 100vw [right1]; - grid-template-areas: "header" "center" "footer" "bottom"; - margin: 0; - padding: 0; - } -} -.header-notify { - grid-area: header; - grid-column-start: right3; - grid-column-end: right2; -} -.header-user { - grid-area: header; - grid-column-start: right2; - grid-column-end: right1; -} -.sidebar1 { - grid-area: left; - grid-row-start: top; - grid-row-end: end; -} -@media (max-width:767px) { - .sidebar1 { - position: relative; - grid-area: header; - z-index: 2; - top: -300px; - right: 0px; - } - .header-user, - .header-notify { - grid-area: header; - } -} -.center-form-single, -.content { - grid-area: center; - grid-row-start: line2; - grid-row-end: footer1; -} -.footer { - grid-area: footer; - grid-row-start: footer1; - grid-row-end: footer2; -} -.nav-bottom { - grid-area: bottom; - grid-row-start: footer2; - grid-row-end: end; -} -/* ============================================================ - - Generic Color Definitions - - Vars and some generic CSS rules. - - Datei : colors.less - Datum : 2020-05-26 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -/* MAIN */ -/* MENU */ -/* CONTENT */ -/* CONTENT-NAV */ -/* CONTENT-ITEMS */ -/* CONTENT-TABLE */ -/* FORMS */ -/* VARIOUS INDIVIDUAL */ -/* XXX TODO XXX */ -/*rgba(0, 0, 0, 0.5) ??? */ -/* NOTIFICATION */ -/* https://www.w3schools.com/colors/colors_shades.asp */ -.info-color { - color: grey; -} -.success-color { - color: #047006; -} -.alert-color { - color: #ff5f66; -} -.orange-color { - color: #ffa600; -} -.blue-color { - color: blue; -} -.unobtrusive { - color: grey; -} -.info-icon { - color: grey; - background-color: #80808026; -} -.success-icon { - color: #047006; - background-color: rgba(4, 112, 6, 0.2); -} -.alert-icon { - color: #ff5f66; - background-color: #ff5f662e; -} -/* ======================= - Gradido - =======================*/ -/* Gradido */ -.grd-negative-currency { - color: red; -} -/* Gradido Transform */ -.gdt-text-color { - color: #a27824; -} -.grd_clickable { - cursor: pointer; -} -/* ============================================================ - - Typography Definitions - - Datei : typography.less - Datum : 2020-05-26 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -.small-font { - font-size: 0.75em; - font-weight: 300; -} -/* ============================================================ - - Basic screen styles. - - Datei : screen.less - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@font-face { - font-family: 'Material Icons Outlined'; - font-style: normal; - font-weight: 400; - src: url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.eot); - /* For IE6-8 */ - src: local('Material Icons Outlined'), local('Material-Icons-Outlined'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2) format('woff2'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff) format('woff'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf) format('truetype'); -} -.material-icons-outlined { - font-family: 'Material Icons Outlined'; - font-weight: normal; - font-style: normal; - font-size: 24px; - line-height: 1; - letter-spacing: normal; - text-transform: none; - vertical-align: middle; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -webkit-font-feature-settings: 'liga'; - -webkit-font-smoothing: antialiased; -} -@media screen { - /* ======================= - Basis - =======================*/ - html, - body { - font-family: 'Roboto', sans-serif; - font-size: 100%; - line-height: 27px; - color: #212529; - background-color: #f9fafb; - margin: 0; - overflow: auto; - } - div { - border-collapse: collapse; - box-sizing: border-box; - } - /* ======================= - Kopfbereich - =======================*/ - .header { - display: flex; - justify-content: space-between; - align-items: center; - flex: flex-grow; - width: 100%; - padding: 1em; - background-color: #fff; - } - /* ======================= - Fußbereich - =======================*/ - .footer { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - font-size: 70%; - font-style: italic; - line-height: 0; - } - .bottomright { - position: fixed; - bottom: 0; - right: 0; - color: grey; - font-size: smaller; - line-height: 0.125em; - padding-right: 0.25em; - text-align: right; - } - .bottomleft { - position: fixed; - bottom: 0; - left: 0; - color: grey; - font-size: smaller; - line-height: 1.125em; - padding-left: 0.25em; - } - /* ======================= - Sonstige - =======================*/ - /* Hyperlinks */ - a { - text-decoration: none; - color: inherit; - } - main a { - text-decoration: underline; - font-style: italic; - } - a:link, - a:visited { - color: inherit; - } - a:hover, - a:focus { - text-decoration: underline; - } - a:active { - background-color: #fff; - color: #000; - } - a:focus, - a:active { - outline: none; - } - a.grd_invisible_link { - color: #000; - text-decoration: none; - } - a.grd_invisible_link:hover { - color: grey; - } - [type=button]:not(:disabled), - [type=reset]:not(:disabled), - [type=submit]:not(:disabled), - button:not(:disabled) { - cursor: pointer; - } -} -@media screen and (max-width:767px) { - .bottomright { - font-size: 0.7em; - font-weight: 300; - line-height: 1em; - width: 100px; - } - .bottomright p { - margin-block-start: 0; - margin-block-end: 2px; - margin-inline-start: 0; - margin-inline-end: 0; - } -} -/* Ende @media screen */ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* ============================================================ - - Screen styles for flash messages. - - Datei : messages.css - Datum : 30.10.2019, 16:04:16 - Autor : einhornimmond, Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - .flash-messages { - width: 30%; - position: absolute; - top: 57px; - left: 241px; - text-align: center; - } - .flash-messages .alert { - margin: 0; - padding: 1em; - vertical-align: middle; - border-radius: 5px; - } - .flash-messages .alert-success { - color: #1A1A1A !important; - background-color: #06c50a; - border: 1px solid #04700675; - } - .flash-messages .alert-error { - color: #fff !important; - background-color: red; - border: 1px solid rgba(255, 0, 0, 0.5); - } - .flash-messages .message { - padding: 5px; - } - .flash-messages .success { - color: #047006; - } - .flash-messages .error { - color: red; - } - .flash-messages.hidden { - display: none; - } - /* messages, update flash */ - .grd-error { - color: red; - border: 1px solid rgba(255, 0, 0, 0.5); - padding: 5px; - } - .grd-info { - border: 1px dotted gray; - padding: 5px; - } - .grd-success { - padding: 5px; - color: #047006; - } -} -@media screen and (max-width:767px) { - .flash-messages { - width: 90%; - top: 0; - left: 0; - text-align: center; - } -} -/* ============================================================ - - User Menu - - Datei : user.less - Datum : 2020-07-03 - Autor : Christine Slotty - Copyright : Gradido - - ============================================================*/ -@media screen { - .header-user { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-end; - align-content: flex-end; - position: relative; - width: 100%; - min-width: 12em; - height: 40px; - background-color: #fff; - border: 1px solid #f2f4f5; - border-radius: 0 0 0 18px; - } - .user-menu-container { - display: flex; - justify-content: flex-end; - align-items: center; - font-size: 0.8em; - font-weight: 300; - padding: 0.25em 0.5em; - z-index: 20; - height: 40px; - } - .user-name, - .user-icon { - display: inline-block; - vertical-align: middle; - cursor: pointer; - } - .user-name { - padding-right: 0.25em; - } - .nav-vertical.user-menu { - display: none; - background-color: #fff; - border-left: 1px solid #f2f4f5; - border-bottom: 1px solid #f2f4f5; - border-radius: 0 0 16px 16px; - z-index: 15; - font-size: 0.9em; - margin-top: 0 !important; - position: fixed; - top: 39px; - right: 0; - } - .nav-vertical.user-menu.visible { - display: inherit; - } - .nav-vertical.user-menu > ul { - padding: 2em; - padding-top: 0.5em; - padding-bottom: 1em; - margin-block-end: 0; - margin-block-start: 0; - } - .nav-vertical.user-menu li { - padding: 0.0125em; - } - .nav-top > ul { - padding: 0; - padding-right: 2em; - } - .material-icons-outlined.user-info { - color: grey; - } - .material-icons-outlined.user-info.success { - color: #047006; - } -} -@media screen and (max-width:767px) { - .header-user { - position: relative; - min-width: 3em; - background-color: transparent; - justify-content: center; - height: 100%; - margin-top: -13px; - margin-left: -16px; - color: #047006; - } - .user-menu-container { - margin: 0; - padding: 0; - } - .user-name { - display: none; - } - .nav-vertical { - margin-top: 55px; - } - .nav-vertical.user-menu { - position: fixed; - top: 1px; - right: 0; - margin-top: 0; - } - .nav-vertical.user-menu > ul { - padding: 1em 1em; - padding-top: 3em; - } -} -/* ============================================================ - - Navigation - - Datei : navi.less - Datum : 2020-04-30 - Autor : einhornimmond / Christine Slotty - Copyright : Gradido - - ============================================================*/ -@media screen { - .logo { - display: none; - vertical-align: middle; - height: 30px; - padding: 0.5em; - } - .logo.big.visible, - .logo.small.visible { - display: block !important; - } - .logo.mobile { - display: none; - } - .logo.small.visible { - padding-left: 41px; - } - /* - SIDEBARS - */ - .sidebar1 { - background-color: #fff; - font-size: 0.8em; - font-weight: 500; - line-height: 2.5em; - padding: 0; - border-right: 1px solid #f2f4f5; - } - .sidebar2 { - padding: 1em; - background-color: #f9fafb; - } - .sidebar1-header { - font-size: 0.75em; - font-style: italic; - color: grey; - } - /* set general icons size here! */ - .nav-icon { - font-size: 18px !important; - color: #4F4F4F; - vertical-align: middle; - padding-right: 1em; - } - /* important! order matters! we need to overwrite the main button's size here */ - .nav-main-button { - font-size: 32px !important; - color: grey; - margin: 0.3em; - } - /* Hide mobile menu button! */ - .nav-main-button.mobile { - display: none; - } - .nav-menu.nav-menu-maximized { - width: 280px; - height: 100%; - } - .nav-menu.nav-menu-minimized { - width: 120px; - height: 100%; - } - .nav-menu-maximized { - -webkit-animation: slide-out 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - animation: slide-out 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - } - .nav-menu-minimized { - -webkit-animation: slide-in 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - animation: slide-in 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - } - .nav-menu-minimized .link-title { - display: none; - } - .nav-menu-minimized .nav-icon, - .nav-menu-minimized .nav-main-button { - padding-left: 72px; - } - /** - * ---------------------------------------- - * animations slide-in / slide-out - * ---------------------------------------- - */ - /* slide-in */ - @-webkit-keyframes slide-in { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - opacity: 0; - } - 100% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - opacity: 1; - } - } - @keyframes slide-in { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - opacity: 0; - } - 100% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - opacity: 1; - } - } - /* slide-out */ - @-webkit-keyframes slide-out { - 0% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - } - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - } - @keyframes slide-out { - 0% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - } - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - } - /* - NAVI MOBILE - */ - /* END navi mobile base */ - .selected { - color: #047006; - } - .link-title { - vertical-align: middle; - line-height: normal; - background-color: transparent; - } - .nav-horizontal { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; - align-items: flex-end; - list-style-type: none; - gap: 5%; - padding: 1em; - } - .footer .nav-horizontal { - gap: 0; - padding: 0 1em; - padding-inline-start: 0 !important; - } - .nav-top-smaller { - margin: 0; - padding: 0; - } - .nav-smaller { - justify-content: left; - align-items: flex-start; - gap: 0; - padding: 0; - } - .nav-smaller li { - padding: 0 !important; - padding: 0.2em 0.5em !important; - border: 1px solid #047006; - margin: 0.1em 0.3em; - border-radius: 12px; - } - .nav-smaller .heading { - font-weight: bold; - } - .nav-vertical { - margin-top: -2em; - } - .nav-horizontal li { - padding: 0.5em; - } - .nav-vertical > ul { - display: flex; - flex-direction: column; - list-style-type: none; - gap: 5%; - padding: 1em; - } - .nav-vertical li { - padding: 0.5em; - } - .nav-top > ul { - padding: 0; - padding-right: 2em; - } - .nav-bottom { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - list-style-type: none; - margin-bottom: 20px; - } - .nav-bottom p { - font-size: 0.9em; - color: grey; - margin: 0; - } - nav.grd-left-bar { - position: fixed; - top: 80.5px; - } - nav .grd-nav-bn { - width: 100px; - } - nav ul { - margin-top: 0; - padding-left: 0; - } - /* buttons */ - .grd-nav-bn:hover, - .grd-active { - background-color: lightgray; - border-color: #000; - } - .grd-nav-bn { - padding: 10px; - border: 1px solid grey; - display: table-cell; - text-align: center; - vertical-align: middle; - color: grey; - } - .grd-nav-bn-large { - width: 40vw; - height: 18vh; - font-size: 35px; - } - a.grd-nav-bn, - a.grd-nav-bn:visited { - color: #000; - text-decoration: none; - } -} -@media screen and (max-width:767px) { - .logo.big, - .logo.small { - display: none; - } - .logo.visible { - padding: 0 !important; - } - .logo, - .logo.mobile, - .logo.mobile.visible { - display: block; - position: fixed; - top: 12px; - left: 12px; - } - .logo.big, - .logo.big.visible { - display: none !important; - } - .nav-main-button { - display: none; - } - .nav-main-button.mobile { - display: block; - position: fixed; - top: 2px; - right: 46px; - z-index: 3; - } - .nav-menu.nav-menu-minimized, - .nav-menu.nav-menu-maximized { - width: 280px; - height: 300px; - } - .nav-menu-minimized .nav-icon, - .nav-menu-minimized .nav-main-button { - padding-left: 0; - } - .nav-menu-maximized { - -webkit-animation: slide-down 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - animation: slide-down 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - } - .nav-menu-minimized { - -webkit-animation: slide-up 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - animation: slide-up 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both; - } - @-webkit-keyframes slide-down { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - opacity: 0; - } - 100% { - -webkit-transform: translateY(300px); - transform: translateX(300px); - opacity: 1; - } - } - @keyframes slide-down { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - opacity: 0; - } - 100% { - -webkit-transform: translateY(300px); - transform: translateY(300px); - opacity: 1; - } - } - @-webkit-keyframes slide-up { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - 100% { - -webkit-transform: translateY(-300px); - transform: translateY(-300px); - } - } - @keyframes slide-up { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - 100% { - -webkit-transform: translateY(-300px); - transform: translateY(-300px); - } - } -} -@media screen and (max-width:767px) { - .nav-vertical { - margin-top: 55px; - } -} -@media screen and (max-width:767px) { - .nav-bottom p { - font-size: 0.8em; - margin-top: -10px; - } -} -/* ============================================================ - - Notification - - Datei : notification.css - Datum : 2020-06-10 - Autor : Christine Slotty - Copyright : Gradido - - ============================================================*/ -@media screen { - .header-notify { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; - z-index: 10; - } - .notify { - display: block; - padding: 0.5rem 0.3rem; - color: #525c5d; - animation: blinkingNotifySymbol 1.2s infinite; - } - .notify-alert { - color: #ff5f66; - animation: blinkingAlertSymbol 1.2s infinite; - } - @keyframes blinkingNotifySymbol { - 0% { - color: #525c5d; - } - 49% { - color: #525c5d; - } - 60% { - color: #525c5d82; - } - 99% { - color: #525c5d82; - } - 100% { - color: #525c5d; - } - } - @keyframes blinkingAlertSymbol { - 0% { - color: #ff5f66; - } - 49% { - color: #ff5f66; - } - 60% { - color: #ff5f669e; - } - 99% { - color: #ff5f669e; - } - 100% { - color: #ff5f66; - } - } - /* - .notification-indicator-primary { - background: #047006; - } - - .notification-indicator-warning { - background: #f0825f - } - .notification-indicator-secondary { - background: grey - } - - .notification-indicator-secondary:before { - content: ""; - background: rgba(128, 128, 128, .5) - } - - .notification-indicator-success { - background: #00e093 - } - - .notification-indicator-success:before { - content: ""; - background: rgba(0, 224, 147, .5) - } - - .notification-indicator-info { - background: #6c61f6 - } - - .notification-indicator-info:before { - content: ""; - background: rgba(108, 97, 246, .5) - } - - - .notification-indicator-danger { - background: #ff5f66 - } - - .notification-indicator-danger:before { - content: ""; - background: rgba(255, 95, 102, .5) - } - - .notification-indicator-light { - background: #dfdfdf - } - - .notification-indicator-light:before { - content: ""; - background: rgba(223, 223, 223, .5) - } - - .notification-indicator-dark { - background: #74767b - } - - .notification-indicator-dark:before { - content: ""; - background: rgba(116, 118, 123, .5) - } - - .notification-indicator-white { - background: #fff - } - - .notification-indicator-white:before { - content: ""; - background: rgba(255, 255, 255, .5) - } - */ -} -@media screen and (max-width:767px) { - .header-notify { - justify-content: flex-end; - margin-right: 93px; - margin-top: 8px; - } -} -/* ============================================================ - - Screen styles for the regular center part. - - Datei : center.css - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - /* ========= - CONTENT - =========*/ - .content-default { - display: flex; - justify-content: center; - max-width: 90%; - } - .content { - display: flex; - justify-content: flex-start; - flex-direction: column; - overflow: auto; - width: 100%; - background-color: #f9fafb; - line-height: 1.75em; - letter-spacing: 0.03rem; - font-family: Roboto, sans-serif; - font-weight: 500; - font-size: 1rem; - padding-right: 5em; - } - /* Center Navigation Top */ - .nav-content { - position: relative; - color: #565656; - margin: 0 0.25em; - } - .nav-content-list { - display: flex; - list-style-type: none; - padding: 0; - margin-left: 0.25em; - } - .nav-content-separator { - margin: 0 1em; - } - /* Center Content Container */ - .content-container { - background-color: #fff; - color: #212529; - border-radius: 0.5em; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); - border: 1px solid rgba(238, 238, 238, 0.75); - margin: 1em 0.25em; - } - /* Block Container Above Main */ - .block-container { - width: 100%; - display: flex; - } - /* Top Info Above Main */ - .info-container { - display: flex; - justify-content: space-between; - align-items: center; - max-width: 70%; - padding: 1em 25px; - } - /* Main Container */ - .main-container { - width: 100%; - } - .default-container { - width: 90%; - margin: auto; - padding: 1em; - } - /* Content Block */ - .content-block { - width: 170px; - padding: 20px 25px 20px; - border: 1px dashed grey; - border-radius: 16px; - margin: 1em; - display: flex; - flex-direction: column; - justify-content: center; - justify-items: center; - align-items: center; - } - .block-img { - width: 40px; - height: 40px; - line-height: 20px; - font-size: 24px; - padding: 8px; - border-radius: 20px; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); - overflow: hidden; - border-style: none; - box-sizing: border-box; - } - /* Generic Content */ - .content-region h3 { - color: #21252969; - } - .content-region { - border-bottom: 1px dashed #F5F5F5; - padding: 0 25px; - padding-bottom: 2em; - margin: 1em 0.25em; - } - .content-collection { - display: flex; - } - .content-item { - margin: 0.5em 0; - margin-right: 5em; - width: 220px; - padding: 1em 2em; - } - .action-button { - background: #f9fafb; - border-left: 3px solid #047006; - } - .info-item { - border-left: 2px solid grey; - } - .inline-header { - display: inline; - } - .show-profile-img { - display: block; - height: 100px; - vertical-align: middle; - border-radius: 10px; - border: 2px dotted #80808026; - } - /* OTHER */ - .info-item i, - .info-item-link, - .action-button i, - .action-button-link { - vertical-align: middle; - } -} -@media screen and (max-width:767px) { - .content { - padding-right: 0; - } -} -@media screen and (max-width:767px) { - .nav-content-list { - display: flex; - font-size: small; - margin-bottom: 0; - justify-content: center; - } -} -@media screen and (max-width:1199px) { - .info-container { - flex-direction: column; - max-width: 90%; - line-height: 0.25em; - } -} -@media screen and (max-width:767px) { - .main-container { - max-width: 97%; - } -} -@media screen and (max-width:767px) { - .content-region { - padding-left: 5px; - } - .content-collection { - flex-direction: column; - align-items: center; - } - .content-item { - margin: 0.5em 0; - margin-right: 0; - width: 160px; - padding: 1em 2em; - } -} -/* Ende @media screen */ -/* ============================================================ - - Screen styles for the simple center form. (login etc) - - Datei : center-form-single.css - Datum : 2020-07-10 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - .center-form-single { - width: 50%; - margin: auto; - } - .center-form-header { - margin-bottom: 50px; - } - .center-logo { - display: block; - margin: 0 auto; - width: 280px; - } - .center-logo img { - width: 100%; - vertical-align: middle; - border-style: none; - } - .center-form-container { - display: flex; - flex-direction: column; - padding: 2em 8em; - background-color: #fff; - border-radius: 6px; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2); - margin-bottom: 1.5rem; - border: 1px solid rgba(238, 238, 238, 0.75); - } - .center-form-title h1 { - margin-block-start: 0; - } - .center-form-selectors { - display: flex; - justify-content: flex-end; - align-items: center; - height: 38px; - padding: 5px 0; - margin-bottom: 2em; - } - .center-form-form, - .center-form-form form { - display: flex; - flex-direction: column; - } - .center-form-form .form-label { - text-align: left; - } - .center-form-form .form-control { - width: 100%; - margin: auto; - box-sizing: border-box; - margin-bottom: 0.5em; - } - .center-form-submit { - width: 100%; - margin: 1em 0; - } - .reset-pwd-link, - .signup-link { - padding: 0 20px; - } - .reset-pwd-link a, - .signup-link a { - color: #047006; - } - .reset-pwd-link p, - .signup-link p { - display: inline-block; - margin-block-start: 0; - margin-block-end: 0; - } - .center-bottom { - color: grey; - text-align: center; - padding-top: 30px; - } - .flag-btn { - text-align: center; - vertical-align: middle; - padding: 3px 11px; - } - .flag { - display: block; - } - .flag-germany { - background: red; - border-top: 9px solid #000; - border-bottom: 9px solid #fc0; - width: 40px; - height: 10px; - } - .flag-england { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); - background-size: cover; - width: 40px; - height: 28px; - } - .group { - padding-left: 10px; - padding-top: 10px; - padding-bottom: 10px; - } - .group-is-invalid { - background-color: rgba(240, 130, 95, 0.2); - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); - background-repeat: no-repeat; - background-position: center right calc(0.375em + 0.1875rem); - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - } - .group-is-invalid .radio label .input-frame::before { - border-color: red; - } -} -@media screen and (max-width:767px) { - .center-form-header { - margin-bottom: 30px; - margin-top: -50px; - } - .center-form-single { - width: 97%; - margin: auto; - } - .center-form-container { - padding: 1em 0.5em; - } -} -/* Ende @media screen */ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* ============================================================ - - Screen styles for plain facts. - - Datei : facts.css - Datum : 08.07.2020 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - .fact-list { - display: flex; - flex-direction: column; - list-style-type: none; - width: 100%; - padding-inline-start: 0; - font-weight: 300; - } - .fact { - display: inline-block; - padding-left: 1em; - } - .label { - width: 150px; - text-align: right; - font-weight: bold; - } -} -@media screen and (max-width:767px) { - .fact-list { - margin-block-start: 0; - margin-block-end: 0; - } - li.fact { - display: flex; - flex-direction: column; - } - .fact { - padding-left: 0.5em; - } - .label { - width: 250px; - text-align: left; - font-size: 0.9em; - font-weight: normal; - } -} -/* ============================================================ - - Screen styles for lists. - - Datei : list.css - Datum : 2020-06-09 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - /* ========= - LISTS - =========*/ - /* List Content */ - .content-list { - width: 100%; - } - .content-list-title { - font-size: 1rem; - margin: 0; - padding: 20px 25px; - color: #313131; - } - .content-list-table { - display: flex; - flex-direction: column; - width: 100%; - overflow: auto; - font-size: 16px; - color: #212529; - } - .row { - display: flex; - width: 100%; - border-top: 1px solid #f2f4f9; - -webkit-transition-duration: 0.5s; - transition-duration: 0.5s; - } - .row:hover { - background-color: #f6f7f9; - } - .cell { - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 1em 1.5em; - } - .cell-dense { - padding: 0.1em 0.5em; - } - .centered { - justify-content: center; - } - .c0 { - flex-grow: 5; - min-width: 20%; - } - .c1 { - min-width: 40px; - flex: 0 0 40px; - } - .c2 { - min-width: 80px; - flex: 0 0 80px; - } - .c3 { - min-width: 160px; - flex: 0 0 160px; - } - .c4 { - min-width: 240px; - flex: 0 0 240px; - } - .c5 { - min-width: 320px; - flex: 0 0 320px; - } - .c6 { - min-width: 400px; - flex: 0 0 400px; - } - .header-cell { - border-top: 1px solid #f2f4f9; - background-color: #fafafa; - color: #101010; - } - .content-list-table img, - .content-list-table i { - vertical-align: middle; - } - .content-list-table > span { - font-size: 0.8em; - padding: 0.5em 2em; - vertical-align: middle; - } - /* Individual Tables XXX rm!! */ - .error-list { - grid-template-columns: 2fr 2fr 5fr 1fr; - } - .transactions { - grid-template-columns: 1fr 4fr 2fr 2fr; - } - .profile-img { - width: 30px; - height: 30px; - border-radius: 6px; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); - overflow: hidden; - border-style: none; - box-sizing: border-box; - margin-right: 40px; - } - .tx-email { - cursor: pointer; - display: block; - color: #101010; - font-weight: 400; - } - .small { - font-size: 80%; - font-weight: 400; - } - /*, - .cell-icon .material-icons-outlined */ - .cell-icon { - /*noch ungeklärt - icon ist nicht aligned */ - /*font-size: 1.25em;*/ - vertical-align: middle; - } - /* ===================================== - FORM TOP CONTENT (checkTransaction) - =====================================*/ - .form-content { - padding: 35px; - padding-top: 20px; - max-width: 80%; - margin: auto; - } - .content-table { - border: 1px solid #f2f4f9; - border-top: none; - margin-bottom: 1.5rem; - } - .content-row { - display: flex; - justify-content: space-between; - font-weight: 400; - border-top: 1px solid #f2f4f9; - } - .content-row-header { - font-weight: 500; - color: #101010; - } - .content-row-bg { - background-color: #f0f2f5; - } - .content-cell { - display: block; - border-collapse: collapse; - padding: 10px 15px; - } - .form-button .material-icons-outlined { - font-size: 1.25em; - } -} -@media screen and (max-width:767px) { - .row { - flex-direction: column; - } -} -@media screen and (max-width:767px) { - .cell { - padding: 0.25em 1.5em; - } - .c1 { - flex-basis: auto; - } - .c2 { - flex-basis: auto; - } - .c3 { - flex-basis: auto; - } - .c4 { - flex-basis: auto; - } - .c5 { - flex-basis: auto; - } - .c6 { - flex-basis: auto; - } -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 23.11.2020, 14:04:28 - Author : einhornimmond -*/ -/* Style the tab */ -.tab { - overflow: hidden; - border: 1px solid #ccc; - background-color: #f1f1f1; -} -/* Style the buttons that are used to open the tab content */ -.tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 14px 16px; - transition: 0.3s; -} -/* Change background color of buttons on hover */ -.tab button:hover { - background-color: #ddd; -} -/* Create an active/current tablink class */ -.tab button.active { - background-color: #ccc; -} -/* Style the tab content */ -.tabcontent { - display: none; - padding: 6px 12px; - border: 1px solid #ccc; - border-top: none; -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* ============================================================ - - Screen styles for forms. - - Datei : form.css - Datum : 2020-06-07 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - /* ========= - FORMS - =========*/ - /* Form Content */ - .action-form { - width: 100%; - } - .form-header { - border-left: 3px solid #047006; - background: #f9fafb; - padding: 15px 20px; - margin: 0; - margin-bottom: 15px; - border-radius: 0 6px 0 0; - } - .form-label { - grid-column: 0.5; - font-weight: 400; - text-align: right; - padding-right: 0.5em; - } - .form-control { - grid-column: 0.66666667; - padding: 0.4em 0.75em; - padding-left: 20px; - padding-right: 20px; - margin: 0; - margin-right: 0.5em; - color: rgba(16, 16, 16, 0.8); - display: block; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - background-color: #f6f7f9; - background-clip: padding-box; - border: 1px solid #f0f2f5; - border-radius: 0.25rem; - -webkit-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - } - .form-control:focus { - color: #495057; - background-color: #f6f7f9; - border-color: #d7dee5; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); - } - textarea { - resize: vertical; - } - .badge { - display: inline-block; - padding: 0.45rem 1rem; - font-size: 80%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0.25rem; - -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - } - .badge-warning { - color: #fff; - background-color: #00e093; - } - .badge-error { - color: #fff; - background-color: #ff5f66; - } - .form-full-width { - grid-column-start: 1; - grid-column-end: 3; - display: flex; - flex-direction: column; - } - .form-button { - cursor: pointer; - font: 600 13.3333px Arial; - font-size: 0.875rem; - line-height: 1.5; - text-align: center; - vertical-align: middle; - color: #fff; - background-color: #047006; - border-color: #047006; - border: 1px solid transparent; - border-radius: 0.2rem; - height: 35px; - max-height: 35px; - padding: 4px 15px; - margin-right: 0.5em; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); - } - .form-button:hover { - background-color: #034b04; - border-color: #023f03; - } - .button-cancel { - color: #fff !important; - background-color: #f0825f; - border-color: #f0825f; - } - .button-cancel:hover { - background-color: #ec5e30; - border-color: #eb5425; - } - .link-button { - display: inline-block; - background: #f9fafb; - color: #fff; - height: 17px; - padding: 1em 2em; - line-height: 1em; - border-radius: 6px; - text-align: center; - vertical-align: middle; - } - .action-link { - color: #047006 !important; - } - .action-link-button { - background-color: #047006 !important; - color: #fff !important; - margin-top: 1em; - padding: 0.5em 1em; - } - .edit-profile-img { - width: 100px; - } - .note-smaller { - font-size: smaller; - } - .form-row, - .grid-row { - display: flex; - justify-content: flex-start; - align-items: center; - align-content: center; - width: 100%; - -webkit-transition-duration: 0.5s; - transition-duration: 0.5s; - } - .justify-end { - justify-content: flex-end; - } - .form-row { - border-top: 1px solid #f2f4f9; - } - .form-row:hover { - background-color: #f6f7f9; - } - /* CENTER FORM SPECIFICS */ - .form-body form { - display: grid; - grid-template-columns: 220px 1fr; - margin: 36px 75px; - grid-gap: 1em; - } - .center-form { - width: 450px; - } - .center-form .form-control { - width: 90%; - } - .center-form fieldset { - margin-bottom: 1em; - } -} -@media screen and (max-width:767px) { - .grid-row { - flex-direction: column; - } -} -@media screen and (max-width:767px) { - .form-body form { - grid-template-columns: 1fr; - margin: 20px; - grid-gap: 0.25em; - } - .form-label { - text-align: left; - } -} diff --git a/community_server/webroot/css/loginServer/style.css b/community_server/webroot/css/loginServer/style.css deleted file mode 100644 index bf5f617a7..000000000 --- a/community_server/webroot/css/loginServer/style.css +++ /dev/null @@ -1,14488 +0,0 @@ -.bg-inverse-primary { - background: rgba(4, 112, 6, .2) -} - -.bg-inverse-secondary { - background: rgba(128, 128, 128, .2) -} - -.bg-inverse-success { - background: rgba(0, 224, 147, .2) -} - -.bg-inverse-info { - background: rgba(108, 97, 246, .2) -} - -.bg-inverse-warning { - background: rgba(240, 130, 95, .2) -} - -.bg-inverse-danger { - background: rgba(255, 95, 102, .2) -} - -.bg-inverse-light { - background: rgba(223, 223, 223, .2) -} - -.bg-inverse-dark { - background: rgba(116, 118, 123, .2) -} - -.bg-inverse-white { - background: rgba(255, 255, 255, .2) -} - -.bg-inverse-orange { - background: rgba(255, 166, 0, .2) -} - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both -} - -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite -} - -@-webkit-keyframes fadeIn { - from { - opacity: 0 - } - - to { - opacity: 1 - } - -} - -@keyframes fadeIn { - from { - opacity: 0 - } - - to { - opacity: 1 - } - -} - -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn -} - -@-webkit-keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0) - } - - to { - opacity: 1; - -webkit-transform: none; - transform: none - } - -} - -@keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0) - } - - to { - opacity: 1; - -webkit-transform: none; - transform: none - } - -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown -} - -@-webkit-keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0) - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0) - } - -} - -@keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0) - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0) - } - -} - -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp -} - -@-webkit-keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 50% { - opacity: 1 - } - -} - -@keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 50% { - opacity: 1 - } - -} - -.zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn -} - -@keyframes bounceIn { - 20%, - 40%, - 60%, - 80%, - from, - to { - -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); - animation-timing-function: cubic-bezier(.215, .61, .355, 1) - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 20% { - -webkit-transform: scale3d(1.4, 1.4, 1.4); - transform: scale3d(1.4, 1.4, 1.4) - } - - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9) - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03) - } - - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97) - } - - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1) - } - -} - -@-webkit-keyframes rotate360 { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - -webkit-transform-origin: center; - transform-origin: center - } - -} - -@keyframes rotate360 { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - -webkit-transform-origin: center; - transform-origin: center - } - -} - -@-webkit-keyframes bounceIn { - 20%, - 40%, - 60%, - 80%, - from, - to { - -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); - animation-timing-function: cubic-bezier(.215, .61, .355, 1) - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 20% { - -webkit-transform: scale3d(1.4, 1.4, 1.4); - transform: scale3d(1.4, 1.4, 1.4) - } - - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9) - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03) - } - - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97) - } - - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1) - } - -} - -@-webkit-keyframes ripple { - 0%, - 35% { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 1 - } - - 50% { - -webkit-transform: scale(.6); - transform: scale(.6); - opacity: .8 - } - - 100% { - opacity: 0; - -webkit-transform: scale(1.2); - transform: scale(1.2) - } - -} - -@keyframes ripple { - 0%, - 35% { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 1 - } - - 50% { - -webkit-transform: scale(.6); - transform: scale(.6); - opacity: .8 - } - - 100% { - opacity: 0; - -webkit-transform: scale(1.2); - transform: scale(1.2) - } - -} - -body, -html { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - letter-spacing: .03rem; - font-family: Roboto, sans-serif; - font-weight: 400; - font-size: 14px -} - -@media (min-width:768px) and (max-width:991px) { - body, - html { - font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - body, - html { - font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - body, - html { - font-size: 14px - } - -} - -h1, -h2, -h3, -h4, -h5, -h6, -label { - font-family: Roboto, sans-serif; - font-weight: 500 -} - -label, -p { - font-family: Roboto, sans-serif; - font-weight: 400; - letter-spacing: .03rem -} - -a { - font-family: Roboto, sans-serif; - font-weight: 400 -} - -a:hover { - text-decoration: none -} - -pre { - font-size: 15px -} - -@media (min-width:768px) and (max-width:991px) { - pre { - font-size: calc(15px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - pre { - font-size: calc(16px + 0 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - pre { - font-size: 16px - } - -} - -.checkbox label, -.radio label, -label { - font-family: Roboto, sans-serif; - font-weight: 400 -} - -b { - font-weight: 700 -} - -small { - font-size: 14px; - font-family: Roboto, sans-serif; - font-weight: 400; - display: inline-block; - line-height: 1.4 -} - -@media (min-width:768px) and (max-width:991px) { - small { - font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - small { - font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - small { - font-size: 13px - } - -} - -h1 { - font-size: 20px -} - -@media (min-width:768px) and (max-width:991px) { - h1 { - font-size: calc(20px + 4 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - h1 { - font-size: calc(24px + 8 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - h1 { - font-size: 32px - } - -} - -h2 { - font-size: 19px -} - -@media (min-width:768px) and (max-width:991px) { - h2 { - font-size: calc(19px + 3 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - h2 { - font-size: calc(22px + 7 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - h2 { - font-size: 29px - } - -} - -h3 { - font-size: 18px -} - -@media (min-width:768px) and (max-width:991px) { - h3 { - font-size: calc(18px + 3 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - h3 { - font-size: calc(21px + 5 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - h3 { - font-size: 26px - } - -} - -h4 { - font-size: 17px -} - -@media (min-width:768px) and (max-width:991px) { - h4 { - font-size: calc(17px + 2 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - h4 { - font-size: calc(19px + 4 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - h4 { - font-size: 23px - } - -} - -h5 { - font-size: 17px -} - -@media (min-width:768px) and (max-width:991px) { - h5 { - font-size: calc(17px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - h5 { - font-size: calc(18px + 2 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - h5 { - font-size: 20px - } - -} - -h6 { - font-size: 16px -} - -@media (min-width:768px) and (max-width:991px) { - h6 { - font-size: calc(16px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - h6 { - font-size: calc(17px + 1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - h6 { - font-size: 18px - } - -} - -.display-1 { - font-size: 26px -} - -@media (min-width:768px) and (max-width:991px) { - .display-1 { - font-size: calc(26px + 7 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .display-1 { - font-size: calc(33px + 25 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .display-1 { - font-size: 58px - } - -} - -.display-2 { - font-size: 24px -} - -@media (min-width:768px) and (max-width:991px) { - .display-2 { - font-size: calc(24px + 7 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .display-2 { - font-size: calc(31px + 21 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .display-2 { - font-size: 52px - } - -} - -.display-3 { - font-size: 23px -} - -@media (min-width:768px) and (max-width:991px) { - .display-3 { - font-size: calc(23px + 6 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .display-3 { - font-size: calc(29px + 17 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .display-3 { - font-size: 46px - } - -} - -.display-4 { - font-size: 22px -} - -@media (min-width:768px) and (max-width:991px) { - .display-4 { - font-size: calc(22px + 5 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .display-4 { - font-size: calc(27px + 14 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .display-4 { - font-size: 41px - } - -} - -.display-5 { - font-size: 21px -} - -@media (min-width:768px) and (max-width:991px) { - .display-5 { - font-size: calc(21px + 4 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .display-5 { - font-size: calc(25px + 11 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .display-5 { - font-size: 36px - } - -} - -.form-control, -input[type=email], -input[type=name], -input[type=number], -input[type=password], -input[type=text], -textarea { - font-family: Roboto, sans-serif; - font-weight: 500; - font-size: 14px -} - -@media (min-width:768px) and (max-width:991px) { - .form-control, - input[type=email], - input[type=name], - input[type=number], - input[type=password], - input[type=text], - textarea { - font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .form-control, - input[type=email], - input[type=name], - input[type=number], - input[type=password], - input[type=text], - textarea { - font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .form-control, - input[type=email], - input[type=name], - input[type=number], - input[type=password], - input[type=text], - textarea { - font-size: 13px - } - -} - -.form-control.placeholder, -input[type=email].placeholder, -input[type=name].placeholder, -input[type=number].placeholder, -input[type=password].placeholder, -input[type=text].placeholder, -textarea.placeholder { - font-family: inherit; - font-size: inherit; - color: #afb5ba; - font-weight: inherit -} - -.form-control:-moz-placeholder, -input[type=email]:-moz-placeholder, -input[type=name]:-moz-placeholder, -input[type=number]:-moz-placeholder, -input[type=password]:-moz-placeholder, -input[type=text]:-moz-placeholder, -textarea:-moz-placeholder { - font-family: inherit; - font-size: inherit; - color: #afb5ba; - font-weight: inherit -} - -.form-control::-moz-placeholder, -input[type=email]::-moz-placeholder, -input[type=name]::-moz-placeholder, -input[type=number]::-moz-placeholder, -input[type=password]::-moz-placeholder, -input[type=text]::-moz-placeholder, -textarea::-moz-placeholder { - font-family: inherit; - font-size: inherit; - color: #afb5ba; - font-weight: inherit -} - -.form-control:-ms-input-placeholder, -input[type=email]:-ms-input-placeholder, -input[type=name]:-ms-input-placeholder, -input[type=number]:-ms-input-placeholder, -input[type=password]:-ms-input-placeholder, -input[type=text]:-ms-input-placeholder, -textarea:-ms-input-placeholder { - font-family: inherit; - font-size: inherit; - color: #afb5ba; - font-weight: inherit -} - -.form-control::-webkit-input-placeholder, -input[type=email]::-webkit-input-placeholder, -input[type=name]::-webkit-input-placeholder, -input[type=number]::-webkit-input-placeholder, -input[type=password]::-webkit-input-placeholder, -input[type=text]::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - font-family: inherit; - font-size: inherit; - color: #afb5ba; - font-weight: inherit -} - -.grid-title { - font-size: 14px; - font-family: Roboto, sans-serif; - font-weight: 500 -} - -@media (min-width:768px) and (max-width:991px) { - .grid-title { - font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .grid-title { - font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .grid-title { - font-size: 14px - } - -} - -.bootstrap-tagsinput .tag { - font-size: 14px; - font-family: Roboto, sans-serif; - font-weight: 500 -} - -@media (min-width:768px) and (max-width:991px) { - .bootstrap-tagsinput .tag { - font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .bootstrap-tagsinput .tag { - font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .bootstrap-tagsinput .tag { - font-size: 13px - } - -} - -.font-weight-medium { - font-weight: 500 !important -} - -.font-weight-bold, -.font-weight-bolder, -.font-weight-medium { - letter-spacing: 1px -} - -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -:root { - --blue: #007bff; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #dc3545; - --orange: #fd7e14; - --yellow: #ffc107; - --green: #28a745; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #6c757d; - --gray-dark: #343a40; - --primary: #047006; - --secondary: grey; - --success: #00e093; - --info: #6c61f6; - --warning: #f0825f; - --danger: #ff5f66; - --light: #dfdfdf; - --dark: #74767b; - --white: #fff; - --orange: #ffa600; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace -} - -*, -::after, -::before { - box-sizing: border-box -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0) -} - -article, -aside, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section { - display: block -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.7; - color: #212529; - text-align: left; - background-color: #fff -} - -[tabindex="-1"]:focus { - outline: 0 !important -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - margin-bottom: .5rem -} - -p { - margin-top: 0; - margin-bottom: 1rem -} - -abbr[data-original-title], -abbr[title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - text-decoration-skip-ink: none -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit -} - -dl, -ol, -ul { - margin-top: 0; - margin-bottom: 1rem -} - -ol ol, -ol ul, -ul ol, -ul ul { - margin-bottom: 0 -} - -dt { - font-weight: 700 -} - -dd { - margin-bottom: .5rem; - margin-left: 0 -} - -blockquote { - margin: 0 0 1rem -} - -b, -strong { - font-weight: bolder -} - -small { - font-size: 80% -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline -} - -sub { - bottom: -.25em -} - -sup { - top: -.5em -} - -a { - color: #047006; - text-decoration: none; - background-color: transparent -} - -a:hover { - color: #012602; - text-decoration: underline -} - -a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none -} - -a:not([href]):not([tabindex]):focus, -a:not([href]):not([tabindex]):hover { - color: inherit; - text-decoration: none -} - -a:not([href]):not([tabindex]):focus { - outline: 0 -} - -code, -kbd, -pre, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto -} - -figure { - margin: 0 0 1rem -} - -img { - vertical-align: middle; - border-style: none -} - -svg { - overflow: hidden; - vertical-align: middle -} - -table { - border-collapse: collapse -} - -caption { - padding-top: 10px 15px; - padding-bottom: 10px 15px; - color: #6c757d; - text-align: left; - caption-side: bottom -} - -th { - text-align: inherit -} - -label { - display: inline-block; - margin-bottom: .5rem -} - -button { - border-radius: 0 -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color -} - -button, -input, -optgroup, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit -} - -button, -input { - overflow: visible -} - -button, -select { - text-transform: none -} - -select { - word-wrap: normal -} - -[type=button], -[type=reset], -[type=submit], -button { - -webkit-appearance: button -} - -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled), -button:not(:disabled) { - cursor: pointer -} - -[type=button]::-moz-focus-inner, -[type=reset]::-moz-focus-inner, -[type=submit]::-moz-focus-inner, -button::-moz-focus-inner { - padding: 0; - border-style: none -} - -input[type=checkbox], -input[type=radio] { - box-sizing: border-box; - padding: 0 -} - -input[type=date], -input[type=datetime-local], -input[type=month], -input[type=time] { - -webkit-appearance: listbox -} - -textarea { - overflow: auto; - resize: vertical -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0 -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal -} - -progress { - vertical-align: baseline -} - -[type=number]::-webkit-inner-spin-button, -[type=number]::-webkit-outer-spin-button { - height: auto -} - -[type=search] { - outline-offset: -2px; - -webkit-appearance: none -} - -[type=search]::-webkit-search-decoration { - -webkit-appearance: none -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button -} - -output { - display: inline-block -} - -summary { - display: list-item; - cursor: pointer -} - -template { - display: none -} - -[hidden] { - display: none !important -} - -.h1, -.h2, -.h3, -.h4, -.h5, -.h6, -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: .5rem; - font-weight: 500; - line-height: 1.2 -} - -.h1, -h1 { - font-size: 2.5rem -} - -.h2, -h2 { - font-size: 2rem -} - -.h3, -h3 { - font-size: 1.75rem -} - -.h4, -h4 { - font-size: 1.5rem -} - -.h5, -h5 { - font-size: 1.25rem -} - -.h6, -h6 { - font-size: 1rem -} - -.lead { - font-size: 1.25rem; - font-weight: 300 -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2 -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2 -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2 -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2 -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, .1) -} - -.small, -small { - font-size: 80%; - font-weight: 400 -} - -.mark, -mark { - padding: .2em; - background-color: #fcf8e3 -} - -.list-unstyled { - padding-left: 0; - list-style: none -} - -.list-inline { - padding-left: 0; - list-style: none -} - -.list-inline-item { - display: inline-block -} - -.list-inline-item:not(:last-child) { - margin-right: .5rem -} - -.initialism { - font-size: 90%; - text-transform: uppercase -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #6c757d -} - -.blockquote-footer::before { - content: "\2014\00A0" -} - -.img-fluid { - max-width: 100%; - height: auto -} - -.img-thumbnail { - padding: .25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: .25rem; - max-width: 100%; - height: auto -} - -.figure { - display: inline-block -} - -.figure-img { - margin-bottom: .5rem; - line-height: 1 -} - -.figure-caption { - font-size: 90%; - color: #6c757d -} - -code { - font-size: 90%; - color: #bd4147; - word-break: break-word -} - -a>code { - color: inherit -} - -kbd { - padding: .2rem .4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: .2rem -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700 -} - -pre { - display: block; - font-size: 90%; - color: #212529 -} - -pre code { - font-size: inherit; - color: inherit; - word-break: normal -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll -} - -.container { - width: 100%; - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto -} - -@media (min-width:576px) { - .container { - max-width: 540px - } - -} - -@media (min-width:768px) { - .container { - max-width: 720px - } - -} - -@media (min-width:992px) { - .container { - max-width: 960px - } - -} - -@media (min-width:1200px) { - .container { - max-width: 1140px - } - -} - -.container-fluid { - width: 100%; - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto -} - -.row { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - margin-right: -10px; - margin-left: -10px -} - -.no-gutters { - margin-right: 0; - margin-left: 0 -} - -.no-gutters>.col, -.no-gutters>[class*=col-] { - padding-right: 0; - padding-left: 0 -} - -.col, -.col-1, -.col-10, -.col-11, -.col-12, -.col-2, -.col-3, -.col-4, -.col-5, -.col-6, -.col-7, -.col-8, -.col-9, -.col-auto, -.col-lg, -.col-lg-1, -.col-lg-10, -.col-lg-11, -.col-lg-12, -.col-lg-2, -.col-lg-3, -.col-lg-4, -.col-lg-5, -.col-lg-6, -.col-lg-7, -.col-lg-8, -.col-lg-9, -.col-lg-auto, -.col-md, -.col-md-1, -.col-md-10, -.col-md-11, -.col-md-12, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9, -.col-md-auto, -.col-sm, -.col-sm-1, -.col-sm-10, -.col-sm-11, -.col-sm-12, -.col-sm-2, -.col-sm-3, -.col-sm-4, -.col-sm-5, -.col-sm-6, -.col-sm-7, -.col-sm-8, -.col-sm-9, -.col-sm-auto, -.col-xl, -.col-xl-1, -.col-xl-10, -.col-xl-11, -.col-xl-12, -.col-xl-2, -.col-xl-3, -.col-xl-4, -.col-xl-5, -.col-xl-6, -.col-xl-7, -.col-xl-8, -.col-xl-9, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 10px; - padding-left: 10px -} - -.col { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% -} - -.col-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% -} - -.col-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% -} - -.col-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% -} - -.col-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% -} - -.col-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% -} - -.col-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% -} - -.col-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% -} - -.col-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% -} - -.col-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% -} - -.col-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% -} - -.col-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% -} - -.col-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% -} - -.col-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% -} - -.order-first { - -webkit-box-ordinal-group: 0; - order: -1 -} - -.order-last { - -webkit-box-ordinal-group: 14; - order: 13 -} - -.order-0 { - -webkit-box-ordinal-group: 1; - order: 0 -} - -.order-1 { - -webkit-box-ordinal-group: 2; - order: 1 -} - -.order-2 { - -webkit-box-ordinal-group: 3; - order: 2 -} - -.order-3 { - -webkit-box-ordinal-group: 4; - order: 3 -} - -.order-4 { - -webkit-box-ordinal-group: 5; - order: 4 -} - -.order-5 { - -webkit-box-ordinal-group: 6; - order: 5 -} - -.order-6 { - -webkit-box-ordinal-group: 7; - order: 6 -} - -.order-7 { - -webkit-box-ordinal-group: 8; - order: 7 -} - -.order-8 { - -webkit-box-ordinal-group: 9; - order: 8 -} - -.order-9 { - -webkit-box-ordinal-group: 10; - order: 9 -} - -.order-10 { - -webkit-box-ordinal-group: 11; - order: 10 -} - -.order-11 { - -webkit-box-ordinal-group: 12; - order: 11 -} - -.order-12 { - -webkit-box-ordinal-group: 13; - order: 12 -} - -.offset-1 { - margin-left: 8.33333% -} - -.offset-2 { - margin-left: 16.66667% -} - -.offset-3 { - margin-left: 25% -} - -.offset-4 { - margin-left: 33.33333% -} - -.offset-5 { - margin-left: 41.66667% -} - -.offset-6 { - margin-left: 50% -} - -.offset-7 { - margin-left: 58.33333% -} - -.offset-8 { - margin-left: 66.66667% -} - -.offset-9 { - margin-left: 75% -} - -.offset-10 { - margin-left: 83.33333% -} - -.offset-11 { - margin-left: 91.66667% -} - -@media (min-width:576px) { - .col-sm { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-sm-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-sm-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-sm-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-sm-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-sm-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-sm-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-sm-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-sm-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-sm-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-sm-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-sm-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-sm-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-sm-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-sm-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-sm-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-sm-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-sm-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-sm-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-sm-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-sm-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-sm-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-sm-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-sm-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-sm-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-sm-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-sm-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-sm-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-sm-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-sm-0 { - margin-left: 0 - } - - .offset-sm-1 { - margin-left: 8.33333% - } - - .offset-sm-2 { - margin-left: 16.66667% - } - - .offset-sm-3 { - margin-left: 25% - } - - .offset-sm-4 { - margin-left: 33.33333% - } - - .offset-sm-5 { - margin-left: 41.66667% - } - - .offset-sm-6 { - margin-left: 50% - } - - .offset-sm-7 { - margin-left: 58.33333% - } - - .offset-sm-8 { - margin-left: 66.66667% - } - - .offset-sm-9 { - margin-left: 75% - } - - .offset-sm-10 { - margin-left: 83.33333% - } - - .offset-sm-11 { - margin-left: 91.66667% - } - -} - -@media (min-width:768px) { - .col-md { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-md-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-md-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-md-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-md-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-md-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-md-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-md-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-md-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-md-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-md-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-md-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-md-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-md-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-md-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-md-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-md-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-md-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-md-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-md-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-md-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-md-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-md-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-md-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-md-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-md-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-md-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-md-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-md-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-md-0 { - margin-left: 0 - } - - .offset-md-1 { - margin-left: 8.33333% - } - - .offset-md-2 { - margin-left: 16.66667% - } - - .offset-md-3 { - margin-left: 25% - } - - .offset-md-4 { - margin-left: 33.33333% - } - - .offset-md-5 { - margin-left: 41.66667% - } - - .offset-md-6 { - margin-left: 50% - } - - .offset-md-7 { - margin-left: 58.33333% - } - - .offset-md-8 { - margin-left: 66.66667% - } - - .offset-md-9 { - margin-left: 75% - } - - .offset-md-10 { - margin-left: 83.33333% - } - - .offset-md-11 { - margin-left: 91.66667% - } - -} - -@media (min-width:992px) { - .col-lg { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-lg-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-lg-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-lg-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-lg-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-lg-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-lg-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-lg-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-lg-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-lg-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-lg-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-lg-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-lg-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-lg-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-lg-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-lg-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-lg-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-lg-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-lg-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-lg-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-lg-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-lg-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-lg-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-lg-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-lg-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-lg-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-lg-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-lg-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-lg-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-lg-0 { - margin-left: 0 - } - - .offset-lg-1 { - margin-left: 8.33333% - } - - .offset-lg-2 { - margin-left: 16.66667% - } - - .offset-lg-3 { - margin-left: 25% - } - - .offset-lg-4 { - margin-left: 33.33333% - } - - .offset-lg-5 { - margin-left: 41.66667% - } - - .offset-lg-6 { - margin-left: 50% - } - - .offset-lg-7 { - margin-left: 58.33333% - } - - .offset-lg-8 { - margin-left: 66.66667% - } - - .offset-lg-9 { - margin-left: 75% - } - - .offset-lg-10 { - margin-left: 83.33333% - } - - .offset-lg-11 { - margin-left: 91.66667% - } - -} - -@media (min-width:1200px) { - .col-xl { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-xl-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-xl-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-xl-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-xl-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-xl-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-xl-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-xl-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-xl-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-xl-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-xl-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-xl-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-xl-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-xl-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-xl-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-xl-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-xl-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-xl-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-xl-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-xl-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-xl-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-xl-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-xl-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-xl-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-xl-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-xl-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-xl-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-xl-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-xl-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-xl-0 { - margin-left: 0 - } - - .offset-xl-1 { - margin-left: 8.33333% - } - - .offset-xl-2 { - margin-left: 16.66667% - } - - .offset-xl-3 { - margin-left: 25% - } - - .offset-xl-4 { - margin-left: 33.33333% - } - - .offset-xl-5 { - margin-left: 41.66667% - } - - .offset-xl-6 { - margin-left: 50% - } - - .offset-xl-7 { - margin-left: 58.33333% - } - - .offset-xl-8 { - margin-left: 66.66667% - } - - .offset-xl-9 { - margin-left: 75% - } - - .offset-xl-10 { - margin-left: 83.33333% - } - - .offset-xl-11 { - margin-left: 91.66667% - } - -} - -.table { - width: 100%; - margin-bottom: 1rem; - color: #212529 -} - -.table td, -.table th { - padding: 10px 15px; - vertical-align: top; - border-top: 1px solid #f2f4f9 -} - -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #f2f4f9 -} - -.table tbody+tbody { - border-top: 2px solid #f2f4f9 -} - -.table-sm td, -.table-sm th { - padding: 10px 15px -} - -.table-bordered { - border: 1px solid #f2f4f9 -} - -.table-bordered td, -.table-bordered th { - border: 1px solid #f2f4f9 -} - -.table-bordered thead td, -.table-bordered thead th { - border-bottom-width: 2px -} - -.table-borderless tbody+tbody, -.table-borderless td, -.table-borderless th, -.table-borderless thead th { - border: 0 -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: #f6f7f9 -} - -.table-hover tbody tr:hover { - color: #212529; - background-color: #f6f7f9 -} - -.table-primary, -.table-primary>td, -.table-primary>th { - background-color: #b9d7b9 -} - -.table-primary tbody+tbody, -.table-primary td, -.table-primary th, -.table-primary thead th { - border-color: #7cb57e -} - -.table-hover .table-primary:hover { - background-color: #a9cea9 -} - -.table-hover .table-primary:hover>td, -.table-hover .table-primary:hover>th { - background-color: #a9cea9 -} - -.table-secondary, -.table-secondary>td, -.table-secondary>th { - background-color: #dbdbdb -} - -.table-secondary tbody+tbody, -.table-secondary td, -.table-secondary th, -.table-secondary thead th { - border-color: #bdbdbd -} - -.table-hover .table-secondary:hover { - background-color: #cecece -} - -.table-hover .table-secondary:hover>td, -.table-hover .table-secondary:hover>th { - background-color: #cecece -} - -.table-success, -.table-success>td, -.table-success>th { - background-color: #b8f6e1 -} - -.table-success tbody+tbody, -.table-success td, -.table-success th, -.table-success thead th { - border-color: #7aefc7 -} - -.table-hover .table-success:hover { - background-color: #a1f3d7 -} - -.table-hover .table-success:hover>td, -.table-hover .table-success:hover>th { - background-color: #a1f3d7 -} - -.table-info, -.table-info>td, -.table-info>th { - background-color: #d6d3fc -} - -.table-info tbody+tbody, -.table-info td, -.table-info th, -.table-info thead th { - border-color: #b3adfa -} - -.table-hover .table-info:hover { - background-color: #c0bbfa -} - -.table-hover .table-info:hover>td, -.table-hover .table-info:hover>th { - background-color: #c0bbfa -} - -.table-warning, -.table-warning>td, -.table-warning>th { - background-color: #fbdcd2 -} - -.table-warning tbody+tbody, -.table-warning td, -.table-warning th, -.table-warning thead th { - border-color: #f7beac -} - -.table-hover .table-warning:hover { - background-color: #f9cabb -} - -.table-hover .table-warning:hover>td, -.table-hover .table-warning:hover>th { - background-color: #f9cabb -} - -.table-danger, -.table-danger>td, -.table-danger>th { - background-color: #ffd2d4 -} - -.table-danger tbody+tbody, -.table-danger td, -.table-danger th, -.table-danger thead th { - border-color: #ffacaf -} - -.table-hover .table-danger:hover { - background-color: #ffb9bc -} - -.table-hover .table-danger:hover>td, -.table-hover .table-danger:hover>th { - background-color: #ffb9bc -} - -.table-light, -.table-light>td, -.table-light>th { - background-color: #f6f6f6 -} - -.table-light tbody+tbody, -.table-light td, -.table-light th, -.table-light thead th { - border-color: #eee -} - -.table-hover .table-light:hover { - background-color: #e9e9e9 -} - -.table-hover .table-light:hover>td, -.table-hover .table-light:hover>th { - background-color: #e9e9e9 -} - -.table-dark, -.table-dark>td, -.table-dark>th { - background-color: #d8d9da -} - -.table-dark tbody+tbody, -.table-dark td, -.table-dark th, -.table-dark thead th { - border-color: #b7b8ba -} - -.table-hover .table-dark:hover { - background-color: #cbccce -} - -.table-hover .table-dark:hover>td, -.table-hover .table-dark:hover>th { - background-color: #cbccce -} - -.table-white, -.table-white>td, -.table-white>th { - background-color: #fff -} - -.table-white tbody+tbody, -.table-white td, -.table-white th, -.table-white thead th { - border-color: #fff -} - -.table-hover .table-white:hover { - background-color: #f2f2f2 -} - -.table-hover .table-white:hover>td, -.table-hover .table-white:hover>th { - background-color: #f2f2f2 -} - -.table-orange, -.table-orange>td, -.table-orange>th { - background-color: #ffe6b8 -} - -.table-orange tbody+tbody, -.table-orange td, -.table-orange th, -.table-orange thead th { - border-color: #ffd17a -} - -.table-hover .table-orange:hover { - background-color: #ffdd9f -} - -.table-hover .table-orange:hover>td, -.table-hover .table-orange:hover>th { - background-color: #ffdd9f -} - -.table-active, -.table-active>td, -.table-active>th { - background-color: rgba(0, 0, 0, .075) -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, .075) -} - -.table-hover .table-active:hover>td, -.table-hover .table-active:hover>th { - background-color: rgba(0, 0, 0, .075) -} - -.table .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55 -} - -.table .thead-light th { - color: #495057; - background-color: #e1e4e6; - border-color: #f2f4f9 -} - -.table-dark { - color: #fff; - background-color: #343a40 -} - -.table-dark td, -.table-dark th, -.table-dark thead th { - border-color: #454d55 -} - -.table-dark.table-bordered { - border: 0 -} - -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, .05) -} - -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, .075) -} - -@media (max-width:575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-sm>.table-bordered { - border: 0 - } - -} - -@media (max-width:767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-md>.table-bordered { - border: 0 - } - -} - -@media (max-width:991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-lg>.table-bordered { - border: 0 - } - -} - -@media (max-width:1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-xl>.table-bordered { - border: 0 - } - -} - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch -} - -.table-responsive>.table-bordered { - border: 0 -} - -.form-control { - display: block; - width: 100%; - height: calc(1.5em + .75rem + 2px); - padding: .375rem .75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - background-color: #f6f7f9; - background-clip: padding-box; - border: 1px solid #f0f2f5; - border-radius: .25rem; - -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .form-control { - -webkit-transition: none; - transition: none - } - -} - -.form-control::-ms-expand { - background-color: transparent; - border: 0 -} - -.form-control:focus { - color: #495057; - background-color: #f6f7f9; - border-color: #d7dee5; - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.form-control::-webkit-input-placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control::-moz-placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control::-ms-input-placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control::placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control:disabled, -.form-control[readonly] { - background-color: #f8f9fa; - opacity: 1 -} - -select.form-control:focus::-ms-value { - color: #6c757d; - background-color: #f6f7f9 -} - -.form-control-file, -.form-control-range { - display: block; - width: 100% -} - -.col-form-label { - padding-top: calc(.375rem + 1px); - padding-bottom: calc(.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5 -} - -.col-form-label-lg { - padding-top: calc(.5rem + 1px); - padding-bottom: calc(.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5 -} - -.col-form-label-sm { - padding-top: calc(.25rem + 1px); - padding-bottom: calc(.25rem + 1px); - font-size: .875rem; - line-height: 1.5 -} - -.form-control-plaintext { - display: block; - width: 100%; - padding-top: .375rem; - padding-bottom: .375rem; - margin-bottom: 0; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0 -} - -.form-control-plaintext.form-control-lg, -.form-control-plaintext.form-control-sm { - padding-right: 0; - padding-left: 0 -} - -.form-control-sm { - height: calc(1.5em + .5rem + 2px); - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem -} - -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: .5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: .3rem -} - -select.form-control[multiple], -select.form-control[size] { - height: auto -} - -textarea.form-control { - height: auto -} - -.form-group { - margin-bottom: 1rem -} - -.form-text { - display: block; - margin-top: .25rem -} - -.form-row { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px -} - -.form-row>.col, -.form-row>[class*=col-] { - padding-right: 5px; - padding-left: 5px -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem -} - -.form-check-input { - position: absolute; - margin-top: .3rem; - margin-left: -1.25rem -} - -.form-check-input:disabled~.form-check-label { - color: #adb5bd -} - -.form-check-label { - margin-bottom: 0 -} - -.form-check-inline { - display: -webkit-inline-box; - display: inline-flex; - -webkit-box-align: center; - align-items: center; - padding-left: 0; - margin-right: .75rem -} - -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: .3125rem; - margin-left: 0 -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: .25rem; - font-size: 80%; - color: #28a745 -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: .25rem .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(40, 167, 69, .9); - border-radius: .25rem -} - -.form-control.is-valid, -.was-validated .form-control:valid { - border-color: #28a745; - padding-right: calc(1.5em + .75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: center right calc(.375em + .1875rem); - background-size: calc(.75em + .375rem) calc(.75em + .375rem) -} - -.form-control.is-valid:focus, -.was-validated .form-control:valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.form-control.is-valid~.valid-feedback, -.form-control.is-valid~.valid-tooltip, -.was-validated .form-control:valid~.valid-feedback, -.was-validated .form-control:valid~.valid-tooltip { - display: block -} - -.was-validated textarea.form-control:valid, -textarea.form-control.is-valid { - padding-right: calc(1.5em + .75rem); - background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) -} - -.custom-select.is-valid, -.was-validated .custom-select:valid { - border-color: #28a745; - padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) -} - -.custom-select.is-valid:focus, -.was-validated .custom-select:valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.custom-select.is-valid~.valid-feedback, -.custom-select.is-valid~.valid-tooltip, -.was-validated .custom-select:valid~.valid-feedback, -.was-validated .custom-select:valid~.valid-tooltip { - display: block -} - -.form-control-file.is-valid~.valid-feedback, -.form-control-file.is-valid~.valid-tooltip, -.was-validated .form-control-file:valid~.valid-feedback, -.was-validated .form-control-file:valid~.valid-tooltip { - display: block -} - -.form-check-input.is-valid~.form-check-label, -.was-validated .form-check-input:valid~.form-check-label { - color: #28a745 -} - -.form-check-input.is-valid~.valid-feedback, -.form-check-input.is-valid~.valid-tooltip, -.was-validated .form-check-input:valid~.valid-feedback, -.was-validated .form-check-input:valid~.valid-tooltip { - display: block -} - -.custom-control-input.is-valid~.custom-control-label, -.was-validated .custom-control-input:valid~.custom-control-label { - color: #28a745 -} - -.custom-control-input.is-valid~.custom-control-label::before, -.was-validated .custom-control-input:valid~.custom-control-label::before { - border-color: #28a745 -} - -.custom-control-input.is-valid~.valid-feedback, -.custom-control-input.is-valid~.valid-tooltip, -.was-validated .custom-control-input:valid~.valid-feedback, -.was-validated .custom-control-input:valid~.valid-tooltip { - display: block -} - -.custom-control-input.is-valid:checked~.custom-control-label::before, -.was-validated .custom-control-input:valid:checked~.custom-control-label::before { - border-color: #34ce57; - background-color: #34ce57 -} - -.custom-control-input.is-valid:focus~.custom-control-label::before, -.was-validated .custom-control-input:valid:focus~.custom-control-label::before { - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before, -.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before { - border-color: #28a745 -} - -.custom-file-input.is-valid~.custom-file-label, -.was-validated .custom-file-input:valid~.custom-file-label { - border-color: #28a745 -} - -.custom-file-input.is-valid~.valid-feedback, -.custom-file-input.is-valid~.valid-tooltip, -.was-validated .custom-file-input:valid~.valid-feedback, -.was-validated .custom-file-input:valid~.valid-tooltip { - display: block -} - -.custom-file-input.is-valid:focus~.custom-file-label, -.was-validated .custom-file-input:valid:focus~.custom-file-label { - border-color: #28a745; - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: .25rem; - font-size: 80%; - color: #dc3545 -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: .25rem .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(220, 53, 69, .9); - border-radius: .25rem -} - -.form-control.is-invalid, -.was-validated .form-control:invalid { - border-color: #dc3545; - padding-right: calc(1.5em + .75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); - background-repeat: no-repeat; - background-position: center right calc(.375em + .1875rem); - background-size: calc(.75em + .375rem) calc(.75em + .375rem) -} - -.form-control.is-invalid:focus, -.was-validated .form-control:invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.form-control.is-invalid~.invalid-feedback, -.form-control.is-invalid~.invalid-tooltip, -.was-validated .form-control:invalid~.invalid-feedback, -.was-validated .form-control:invalid~.invalid-tooltip { - display: block -} - -.was-validated textarea.form-control:invalid, -textarea.form-control.is-invalid { - padding-right: calc(1.5em + .75rem); - background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) -} - -.custom-select.is-invalid, -.was-validated .custom-select:invalid { - border-color: #dc3545; - padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) -} - -.custom-select.is-invalid:focus, -.was-validated .custom-select:invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.custom-select.is-invalid~.invalid-feedback, -.custom-select.is-invalid~.invalid-tooltip, -.was-validated .custom-select:invalid~.invalid-feedback, -.was-validated .custom-select:invalid~.invalid-tooltip { - display: block -} - -.form-control-file.is-invalid~.invalid-feedback, -.form-control-file.is-invalid~.invalid-tooltip, -.was-validated .form-control-file:invalid~.invalid-feedback, -.was-validated .form-control-file:invalid~.invalid-tooltip { - display: block -} - -.form-check-input.is-invalid~.form-check-label, -.was-validated .form-check-input:invalid~.form-check-label { - color: #dc3545 -} - -.form-check-input.is-invalid~.invalid-feedback, -.form-check-input.is-invalid~.invalid-tooltip, -.was-validated .form-check-input:invalid~.invalid-feedback, -.was-validated .form-check-input:invalid~.invalid-tooltip { - display: block -} - -.custom-control-input.is-invalid~.custom-control-label, -.was-validated .custom-control-input:invalid~.custom-control-label { - color: #dc3545 -} - -.custom-control-input.is-invalid~.custom-control-label::before, -.was-validated .custom-control-input:invalid~.custom-control-label::before { - border-color: #dc3545 -} - -.custom-control-input.is-invalid~.invalid-feedback, -.custom-control-input.is-invalid~.invalid-tooltip, -.was-validated .custom-control-input:invalid~.invalid-feedback, -.was-validated .custom-control-input:invalid~.invalid-tooltip { - display: block -} - -.custom-control-input.is-invalid:checked~.custom-control-label::before, -.was-validated .custom-control-input:invalid:checked~.custom-control-label::before { - border-color: #e4606d; - background-color: #e4606d -} - -.custom-control-input.is-invalid:focus~.custom-control-label::before, -.was-validated .custom-control-input:invalid:focus~.custom-control-label::before { - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before, -.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before { - border-color: #dc3545 -} - -.custom-file-input.is-invalid~.custom-file-label, -.was-validated .custom-file-input:invalid~.custom-file-label { - border-color: #dc3545 -} - -.custom-file-input.is-invalid~.invalid-feedback, -.custom-file-input.is-invalid~.invalid-tooltip, -.was-validated .custom-file-input:invalid~.invalid-feedback, -.was-validated .custom-file-input:invalid~.invalid-tooltip { - display: block -} - -.custom-file-input.is-invalid:focus~.custom-file-label, -.was-validated .custom-file-input:invalid:focus~.custom-file-label { - border-color: #dc3545; - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.form-inline { - display: -webkit-box; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap; - -webkit-box-align: center; - align-items: center -} - -.form-inline .form-check { - width: 100% -} - -@media (min-width:576px) { - .form-inline label { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - margin-bottom: 0 - } - - .form-inline .form-group { - display: -webkit-box; - display: flex; - -webkit-box-flex: 0; - flex: 0 0 auto; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap; - -webkit-box-align: center; - align-items: center; - margin-bottom: 0 - } - - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle - } - - .form-inline .form-control-plaintext { - display: inline-block - } - - .form-inline .custom-select, - .form-inline .input-group { - width: auto - } - - .form-inline .form-check { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - width: auto; - padding-left: 0 - } - - .form-inline .form-check-input { - position: relative; - flex-shrink: 0; - margin-top: 0; - margin-right: .25rem; - margin-left: 0 - } - - .form-inline .custom-control { - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center - } - - .form-inline .custom-control-label { - margin-bottom: 0 - } - -} - -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: .375rem .75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: .25rem; - -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .btn { - -webkit-transition: none; - transition: none - } - -} - -.btn:hover { - color: #212529; - text-decoration: none -} - -.btn.focus, -.btn:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.btn.disabled, -.btn:disabled { - opacity: .65 -} - -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none -} - -.btn-primary { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-primary:hover { - color: #fff; - background-color: #034b04; - border-color: #023f03 -} - -.btn-primary.focus, -.btn-primary:focus { - box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) -} - -.btn-primary.disabled, -.btn-primary:disabled { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-primary:not(:disabled):not(.disabled).active, -.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle { - color: #fff; - background-color: #023f03; - border-color: #023203 -} - -.btn-primary:not(:disabled):not(.disabled).active:focus, -.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) -} - -.btn-secondary { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-secondary:hover { - color: #fff; - background-color: #6d6d6d; - border-color: #676767 -} - -.btn-secondary.focus, -.btn-secondary:focus { - box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) -} - -.btn-secondary.disabled, -.btn-secondary:disabled { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-secondary:not(:disabled):not(.disabled).active, -.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle { - color: #fff; - background-color: #676767; - border-color: #606060 -} - -.btn-secondary:not(:disabled):not(.disabled).active:focus, -.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) -} - -.btn-success { - color: #fff; - background-color: #00e093; - border-color: #00e093 -} - -.btn-success:hover { - color: #fff; - background-color: #00ba7a; - border-color: #00ad72 -} - -.btn-success.focus, -.btn-success:focus { - box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) -} - -.btn-success.disabled, -.btn-success:disabled { - color: #fff; - background-color: #00e093; - border-color: #00e093 -} - -.btn-success:not(:disabled):not(.disabled).active, -.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle { - color: #fff; - background-color: #00ad72; - border-color: #00a069 -} - -.btn-success:not(:disabled):not(.disabled).active:focus, -.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) -} - -.btn-info { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-info:hover { - color: #fff; - background-color: #4a3df4; - border-color: #3f31f3 -} - -.btn-info.focus, -.btn-info:focus { - box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) -} - -.btn-info.disabled, -.btn-info:disabled { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-info:not(:disabled):not(.disabled).active, -.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle { - color: #fff; - background-color: #3f31f3; - border-color: #3425f3 -} - -.btn-info:not(:disabled):not(.disabled).active:focus, -.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) -} - -.btn-warning { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-warning:hover { - color: #fff; - background-color: #ed673c; - border-color: #ec5e30 -} - -.btn-warning.focus, -.btn-warning:focus { - box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) -} - -.btn-warning.disabled, -.btn-warning:disabled { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-warning:not(:disabled):not(.disabled).active, -.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle { - color: #fff; - background-color: #ec5e30; - border-color: #eb5425 -} - -.btn-warning:not(:disabled):not(.disabled).active:focus, -.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) -} - -.btn-danger { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-danger:hover { - color: #fff; - background-color: #ff3941; - border-color: #ff2c35 -} - -.btn-danger.focus, -.btn-danger:focus { - box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) -} - -.btn-danger.disabled, -.btn-danger:disabled { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-danger:not(:disabled):not(.disabled).active, -.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle { - color: #fff; - background-color: #ff2c35; - border-color: #ff1f29 -} - -.btn-danger:not(:disabled):not(.disabled).active:focus, -.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) -} - -.btn-light { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-light:hover { - color: #212529; - background-color: #ccc; - border-color: #c6c6c6 -} - -.btn-light.focus, -.btn-light:focus { - box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) -} - -.btn-light.disabled, -.btn-light:disabled { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-light:not(:disabled):not(.disabled).active, -.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle { - color: #212529; - background-color: #c6c6c6; - border-color: #bfbfbf -} - -.btn-light:not(:disabled):not(.disabled).active:focus, -.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) -} - -.btn-dark { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-dark:hover { - color: #fff; - background-color: #616367; - border-color: #5b5d61 -} - -.btn-dark.focus, -.btn-dark:focus { - box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) -} - -.btn-dark.disabled, -.btn-dark:disabled { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-dark:not(:disabled):not(.disabled).active, -.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle { - color: #fff; - background-color: #5b5d61; - border-color: #55575a -} - -.btn-dark:not(:disabled):not(.disabled).active:focus, -.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) -} - -.btn-white { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-white:hover { - color: #212529; - background-color: #ececec; - border-color: #e6e6e6 -} - -.btn-white.focus, -.btn-white:focus { - box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) -} - -.btn-white.disabled, -.btn-white:disabled { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-white:not(:disabled):not(.disabled).active, -.btn-white:not(:disabled):not(.disabled):active,.show>.btn-white.dropdown-toggle { - color: #212529; - background-color: #e6e6e6; - border-color: #dfdfdf -} - -.btn-white:not(:disabled):not(.disabled).active:focus, -.btn-white:not(:disabled):not(.disabled):active:focus,.show>.btn-white.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) -} - -.btn-orange { - color: #212529; - background-color: #ffa600; - border-color: #ffa600 -} - -.btn-orange:hover { - color: #fff; - background-color: #d98d00; - border-color: #cc8500 -} - -.btn-orange.focus, -.btn-orange:focus { - box-shadow: 0 0 0 .2rem rgba(222, 147, 6, .5) -} - -.btn-orange.disabled, -.btn-orange:disabled { - color: #212529; - background-color: #ffa600; - border-color: #ffa600 -} - -.btn-orange:not(:disabled):not(.disabled).active, -.btn-orange:not(:disabled):not(.disabled):active,.show>.btn-orange.dropdown-toggle { - color: #fff; - background-color: #cc8500; - border-color: #bf7d00 -} - -.btn-orange:not(:disabled):not(.disabled).active:focus, -.btn-orange:not(:disabled):not(.disabled):active:focus,.show>.btn-orange.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(222, 147, 6, .5) -} - -.btn-outline-primary { - color: #047006; - border-color: #047006 -} - -.btn-outline-primary:hover { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-outline-primary.focus, -.btn-outline-primary:focus { - box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) -} - -.btn-outline-primary.disabled, -.btn-outline-primary:disabled { - color: #047006; - background-color: transparent -} - -.btn-outline-primary:not(:disabled):not(.disabled).active, -.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-outline-primary:not(:disabled):not(.disabled).active:focus, -.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) -} - -.btn-outline-secondary { - color: grey; - border-color: grey -} - -.btn-outline-secondary:hover { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-outline-secondary.focus, -.btn-outline-secondary:focus { - box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) -} - -.btn-outline-secondary.disabled, -.btn-outline-secondary:disabled { - color: grey; - background-color: transparent -} - -.btn-outline-secondary:not(:disabled):not(.disabled).active, -.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) -} - -.btn-outline-success { - color: #00e093; - border-color: #00e093 -} - -.btn-outline-success:hover { - color: #fff; - background-color: #00e093; - border-color: #00e093 -} - -.btn-outline-success.focus, -.btn-outline-success:focus { - box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) -} - -.btn-outline-success.disabled, -.btn-outline-success:disabled { - color: #00e093; - background-color: transparent -} - -.btn-outline-success:not(:disabled):not(.disabled).active, -.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #00e093; - border-color: #00e093 -} - -.btn-outline-success:not(:disabled):not(.disabled).active:focus, -.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) -} - -.btn-outline-info { - color: #6c61f6; - border-color: #6c61f6 -} - -.btn-outline-info:hover { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-outline-info.focus, -.btn-outline-info:focus { - box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) -} - -.btn-outline-info.disabled, -.btn-outline-info:disabled { - color: #6c61f6; - background-color: transparent -} - -.btn-outline-info:not(:disabled):not(.disabled).active, -.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-outline-info:not(:disabled):not(.disabled).active:focus, -.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) -} - -.btn-outline-warning { - color: #f0825f; - border-color: #f0825f -} - -.btn-outline-warning:hover { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-outline-warning.focus, -.btn-outline-warning:focus { - box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) -} - -.btn-outline-warning.disabled, -.btn-outline-warning:disabled { - color: #f0825f; - background-color: transparent -} - -.btn-outline-warning:not(:disabled):not(.disabled).active, -.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-outline-warning:not(:disabled):not(.disabled).active:focus, -.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) -} - -.btn-outline-danger { - color: #ff5f66; - border-color: #ff5f66 -} - -.btn-outline-danger:hover { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-outline-danger.focus, -.btn-outline-danger:focus { - box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) -} - -.btn-outline-danger.disabled, -.btn-outline-danger:disabled { - color: #ff5f66; - background-color: transparent -} - -.btn-outline-danger:not(:disabled):not(.disabled).active, -.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-outline-danger:not(:disabled):not(.disabled).active:focus, -.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) -} - -.btn-outline-light { - color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-outline-light:hover { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-outline-light.focus, -.btn-outline-light:focus { - box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) -} - -.btn-outline-light.disabled, -.btn-outline-light:disabled { - color: #dfdfdf; - background-color: transparent -} - -.btn-outline-light:not(:disabled):not(.disabled).active, -.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-outline-light:not(:disabled):not(.disabled).active:focus, -.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) -} - -.btn-outline-dark { - color: #74767b; - border-color: #74767b -} - -.btn-outline-dark:hover { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-outline-dark.focus, -.btn-outline-dark:focus { - box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) -} - -.btn-outline-dark.disabled, -.btn-outline-dark:disabled { - color: #74767b; - background-color: transparent -} - -.btn-outline-dark:not(:disabled):not(.disabled).active, -.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-outline-dark:not(:disabled):not(.disabled).active:focus, -.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) -} - -.btn-outline-white { - color: #fff; - border-color: #fff -} - -.btn-outline-white:hover { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-outline-white.focus, -.btn-outline-white:focus { - box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) -} - -.btn-outline-white.disabled, -.btn-outline-white:disabled { - color: #fff; - background-color: transparent -} - -.btn-outline-white:not(:disabled):not(.disabled).active, -.btn-outline-white:not(:disabled):not(.disabled):active,.show>.btn-outline-white.dropdown-toggle { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-outline-white:not(:disabled):not(.disabled).active:focus, -.btn-outline-white:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-white.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) -} - -.btn-outline-orange { - color: #ffa600; - border-color: #ffa600 -} - -.btn-outline-orange:hover { - color: #212529; - background-color: #ffa600; - border-color: #ffa600 -} - -.btn-outline-orange.focus, -.btn-outline-orange:focus { - box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5) -} - -.btn-outline-orange.disabled, -.btn-outline-orange:disabled { - color: #ffa600; - background-color: transparent -} - -.btn-outline-orange:not(:disabled):not(.disabled).active, -.btn-outline-orange:not(:disabled):not(.disabled):active,.show>.btn-outline-orange.dropdown-toggle { - color: #212529; - background-color: #ffa600; - border-color: #ffa600 -} - -.btn-outline-orange:not(:disabled):not(.disabled).active:focus, -.btn-outline-orange:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-orange.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5) -} - -.btn-link { - font-weight: 400; - color: #047006; - text-decoration: none -} - -.btn-link:hover { - color: #012602; - text-decoration: underline -} - -.btn-link.focus, -.btn-link:focus { - text-decoration: underline; - box-shadow: none -} - -.btn-link.disabled, -.btn-link:disabled { - color: #6c757d; - pointer-events: none -} - -.btn-group-lg>.btn, -.btn-lg { - padding: .5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: .3rem -} - -.btn-group-sm>.btn, -.btn-sm { - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem -} - -.btn-block { - display: block; - width: 100% -} - -.btn-block+.btn-block { - margin-top: .5rem -} - -input[type=button].btn-block, -input[type=reset].btn-block, -input[type=submit].btn-block { - width: 100% -} - -.fade { - -webkit-transition: opacity .15s linear; - transition: opacity .15s linear -} - -@media (prefers-reduced-motion:reduce) { - .fade { - -webkit-transition: none; - transition: none - } - -} - -.fade:not(.show) { - opacity: 0 -} - -.collapse:not(.show) { - display: none -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - transition: height .35s ease -} - -@media (prefers-reduced-motion:reduce) { - .collapsing { - -webkit-transition: none; - transition: none - } - -} - -.dropdown, -.dropleft, -.dropright, -.dropup { - position: relative -} - -.dropdown-toggle { - white-space: nowrap -} - -.dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: 'http://www.w3.org/2000/svg'; - border-top: .3em solid; - border-right: .3em solid transparent; - border-bottom: 0; - border-left: .3em solid transparent -} - -.dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: .5rem 0; - margin: .125rem 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: .25rem -} - -.dropdown-menu-left { - right: auto; - left: 0 -} - -.dropdown-menu-right { - right: 0; - left: auto -} - -@media (min-width:576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0 - } - - .dropdown-menu-sm-right { - right: 0; - left: auto - } - -} - -@media (min-width:768px) { - .dropdown-menu-md-left { - right: auto; - left: 0 - } - - .dropdown-menu-md-right { - right: 0; - left: auto - } - -} - -@media (min-width:992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0 - } - - .dropdown-menu-lg-right { - right: 0; - left: auto - } - -} - -@media (min-width:1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0 - } - - .dropdown-menu-xl-right { - right: 0; - left: auto - } - -} - -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: .125rem -} - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: '0 0 8 8'; - border-top: 0; - border-right: .3em solid transparent; - border-bottom: .3em solid; - border-left: .3em solid transparent -} - -.dropup .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: .125rem -} - -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: '%2328a745'; - border-top: .3em solid transparent; - border-right: 0; - border-bottom: .3em solid transparent; - border-left: .3em solid -} - -.dropright .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropright .dropdown-toggle::after { - vertical-align: 0 -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: .125rem -} - -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' -} - -.dropleft .dropdown-toggle::after { - display: none -} - -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: .255em; - vertical-align: .255em; - content: 'http://www.w3.org/2000/svg'; - border-top: .3em solid transparent; - border-right: .3em solid; - border-bottom: .3em solid transparent -} - -.dropleft .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropleft .dropdown-toggle::before { - vertical-align: 0 -} - -.dropdown-menu[x-placement^=bottom], -.dropdown-menu[x-placement^=left], -.dropdown-menu[x-placement^=right], -.dropdown-menu[x-placement^=top] { - right: auto; - bottom: auto -} - -.dropdown-divider { - height: 0; - margin: .5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef -} - -.dropdown-item { - display: block; - width: 100%; - padding: .25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0 -} - -.dropdown-item:focus, -.dropdown-item:hover { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa -} - -.dropdown-item.active, -.dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #007bff -} - -.dropdown-item.disabled, -.dropdown-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: transparent -} - -.dropdown-menu.show { - display: block -} - -.dropdown-header { - display: block; - padding: .5rem 1.5rem; - margin-bottom: 0; - font-size: .875rem; - color: #6c757d; - white-space: nowrap -} - -.dropdown-item-text { - display: block; - padding: .25rem 1.5rem; - color: #212529 -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: -webkit-inline-box; - display: inline-flex; - vertical-align: middle -} - -.btn-group-vertical>.btn, -.btn-group>.btn { - position: relative; - -webkit-box-flex: 1; - flex: 1 1 auto -} - -.btn-group-vertical>.btn:hover, -.btn-group>.btn:hover { - z-index: 1 -} - -.btn-group-vertical>.btn.active, -.btn-group-vertical>.btn:active, -.btn-group-vertical>.btn:focus, -.btn-group>.btn.active, -.btn-group>.btn:active, -.btn-group>.btn:focus { - z-index: 1 -} - -.btn-toolbar { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-pack: start; - justify-content: flex-start -} - -.btn-toolbar .input-group { - width: auto -} - -.btn-group>.btn-group:not(:first-child), -.btn-group>.btn:not(:first-child) { - margin-left: -1px -} - -.btn-group>.btn-group:not(:last-child)>.btn, -.btn-group>.btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.btn-group>.btn-group:not(:first-child)>.btn, -.btn-group>.btn:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.dropdown-toggle-split { - padding-right: .5625rem; - padding-left: .5625rem -} - -.dropdown-toggle-split::after, -.dropright .dropdown-toggle-split::after, -.dropup .dropdown-toggle-split::after { - margin-left: 0 -} - -.dropleft .dropdown-toggle-split::before { - margin-right: 0 -} - -.btn-group-sm>.btn+.dropdown-toggle-split, -.btn-sm+.dropdown-toggle-split { - padding-right: .375rem; - padding-left: .375rem -} - -.btn-group-lg>.btn+.dropdown-toggle-split, -.btn-lg+.dropdown-toggle-split { - padding-right: .75rem; - padding-left: .75rem -} - -.btn-group-vertical { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-align: start; - align-items: flex-start; - -webkit-box-pack: center; - justify-content: center -} - -.btn-group-vertical>.btn, -.btn-group-vertical>.btn-group { - width: 100% -} - -.btn-group-vertical>.btn-group:not(:first-child), -.btn-group-vertical>.btn:not(:first-child) { - margin-top: -1px -} - -.btn-group-vertical>.btn-group:not(:last-child)>.btn, -.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 -} - -.btn-group-vertical>.btn-group:not(:first-child)>.btn, -.btn-group-vertical>.btn:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.btn-group-toggle>.btn, -.btn-group-toggle>.btn-group>.btn { - margin-bottom: 0 -} - -.btn-group-toggle>.btn input[type=checkbox], -.btn-group-toggle>.btn input[type=radio], -.btn-group-toggle>.btn-group>.btn input[type=checkbox], -.btn-group-toggle>.btn-group>.btn input[type=radio] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none -} - -.input-group { - position: relative; - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-align: stretch; - align-items: stretch; - width: 100% -} - -.input-group>.custom-file, -.input-group>.custom-select, -.input-group>.form-control, -.input-group>.form-control-plaintext { - position: relative; - -webkit-box-flex: 1; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0 -} - -.input-group>.custom-file+.custom-file, -.input-group>.custom-file+.custom-select, -.input-group>.custom-file+.form-control, -.input-group>.custom-select+.custom-file, -.input-group>.custom-select+.custom-select, -.input-group>.custom-select+.form-control, -.input-group>.form-control+.custom-file, -.input-group>.form-control+.custom-select, -.input-group>.form-control+.form-control, -.input-group>.form-control-plaintext+.custom-file, -.input-group>.form-control-plaintext+.custom-select, -.input-group>.form-control-plaintext+.form-control { - margin-left: -1px -} - -.input-group>.custom-file .custom-file-input:focus~.custom-file-label, -.input-group>.custom-select:focus, -.input-group>.form-control:focus { - z-index: 3 -} - -.input-group>.custom-file .custom-file-input:focus { - z-index: 4 -} - -.input-group>.custom-select:not(:last-child), -.input-group>.form-control:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group>.custom-select:not(:first-child), -.input-group>.form-control:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.input-group>.custom-file { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center -} - -.input-group>.custom-file:not(:last-child) .custom-file-label, -.input-group>.custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group>.custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.input-group-append, -.input-group-prepend { - display: -webkit-box; - display: flex -} - -.input-group-append .btn, -.input-group-prepend .btn { - position: relative; - z-index: 2 -} - -.input-group-append .btn:focus, -.input-group-prepend .btn:focus { - z-index: 3 -} - -.input-group-append .btn+.btn, -.input-group-append .btn+.input-group-text, -.input-group-append .input-group-text+.btn, -.input-group-append .input-group-text+.input-group-text, -.input-group-prepend .btn+.btn, -.input-group-prepend .btn+.input-group-text, -.input-group-prepend .input-group-text+.btn, -.input-group-prepend .input-group-text+.input-group-text { - margin-left: -1px -} - -.input-group-prepend { - margin-right: -1px -} - -.input-group-append { - margin-left: -1px -} - -.input-group-text { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - padding: .375rem .75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #f0f2f5; - border-radius: .25rem -} - -.input-group-text input[type=checkbox], -.input-group-text input[type=radio] { - margin-top: 0 -} - -.input-group-lg>.custom-select, -.input-group-lg>.form-control:not(textarea) { - height: calc(1.5em + 1rem + 2px) -} - -.input-group-lg>.custom-select, -.input-group-lg>.form-control, -.input-group-lg>.input-group-append>.btn, -.input-group-lg>.input-group-append>.input-group-text, -.input-group-lg>.input-group-prepend>.btn, -.input-group-lg>.input-group-prepend>.input-group-text { - padding: .5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: .3rem -} - -.input-group-sm>.custom-select, -.input-group-sm>.form-control:not(textarea) { - height: calc(1.5em + .5rem + 2px) -} - -.input-group-sm>.custom-select, -.input-group-sm>.form-control, -.input-group-sm>.input-group-append>.btn, -.input-group-sm>.input-group-append>.input-group-text, -.input-group-sm>.input-group-prepend>.btn, -.input-group-sm>.input-group-prepend>.input-group-text { - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem -} - -.input-group-lg>.custom-select, -.input-group-sm>.custom-select { - padding-right: 1.75rem -} - -.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle), -.input-group>.input-group-append:last-child>.input-group-text:not(:last-child), -.input-group>.input-group-append:not(:last-child)>.btn, -.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group>.input-group-append>.btn, -.input-group>.input-group-append>.input-group-text, -.input-group>.input-group-prepend:first-child>.btn:not(:first-child), -.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child), -.input-group>.input-group-prepend:not(:first-child)>.btn, -.input-group>.input-group-prepend:not(:first-child)>.input-group-text { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.custom-control { - position: relative; - display: block; - min-height: 1.7rem; - padding-left: 1.9rem -} - -.custom-control-inline { - display: -webkit-inline-box; - display: inline-flex; - margin-right: 1rem -} - -.custom-control-input { - position: absolute; - z-index: -1; - opacity: 0 -} - -.custom-control-input:checked~.custom-control-label::before { - color: #fff; - border-color: #00e093; - background-color: #00e093 -} - -.custom-control-input:focus~.custom-control-label::before { - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-control-input:focus:not(:checked)~.custom-control-label::before { - border-color: #80bdff -} - -.custom-control-input:not(:disabled):active~.custom-control-label::before { - color: #fff; - background-color: #b3d7ff; - border-color: #b3d7ff -} - -.custom-control-input:disabled~.custom-control-label { - color: #6c757d -} - -.custom-control-input:disabled~.custom-control-label::before { - background-color: #e9ecef -} - -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top -} - -.custom-control-label::before { - position: absolute; - top: .15rem; - left: -1.9rem; - display: block; - width: 1.4rem; - height: 1.4rem; - pointer-events: none; - content: '0 0 4 5'; - background-color: #fff; - border: #e1e5f1 solid 1px -} - -.custom-control-label::after { - position: absolute; - top: .15rem; - left: -1.9rem; - display: block; - width: 1.4rem; - height: 1.4rem; - content: '%23343a40'; - background: no-repeat 50%/50% 50% -} - -.custom-checkbox .custom-control-label::before { - border-radius: .25rem -} - -.custom-checkbox .custom-control-input:checked~.custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") -} - -.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before { - border-color: #007bff; - background-color: #007bff -} - -.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3c/svg%3e") -} - -.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-radio .custom-control-label::before { - border-radius: 50% -} - -.custom-radio .custom-control-input:checked~.custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3ccircle r=!string!fill=!string!/%3e%3c/svg%3e") -} - -.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-switch { - padding-left: 2.8rem -} - -.custom-switch .custom-control-label::before { - left: -2.8rem; - width: 2.3rem; - pointer-events: all; - border-radius: 25px -} - -.custom-switch .custom-control-label::after { - top: calc(.15rem + 2px); - left: calc(-2.8rem + 2px); - width: 1.1rem; - height: 1.1rem; - background-color: #e1e5f1; - border-radius: 25px; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; - transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .custom-switch .custom-control-label::after { - -webkit-transition: none; - transition: none - } - -} - -.custom-switch .custom-control-input:checked~.custom-control-label::after { - background-color: #fff; - -webkit-transform: translateX(.9rem); - transform: translateX(.9rem) -} - -.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + .75rem + 2px); - padding: .375rem 1.75rem .375rem .75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: .25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -.custom-select:focus { - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-select:focus::-ms-value { - color: #6c757d; - background-color: #f6f7f9 -} - -.custom-select[multiple], -.custom-select[size]:not([size='M2 0L0 2h4zm0 5L0 3h4z']) { - height: auto; - padding-right: .75rem; - background-image: none -} - -.custom-select:disabled { - color: #6c757d; - background-color: #e9ecef -} - -.custom-select::-ms-expand { - display: none -} - -.custom-select-sm { - height: calc(1.5em + .5rem + 2px); - padding-top: .25rem; - padding-bottom: .25rem; - padding-left: .5rem; - font-size: .875rem -} - -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: .5rem; - padding-bottom: .5rem; - padding-left: 1rem; - font-size: 1.25rem -} - -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + .75rem + 2px); - margin-bottom: 0 -} - -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + .75rem + 2px); - margin: 0; - opacity: 0 -} - -.custom-file-input:focus~.custom-file-label { - border-color: #80bdff; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-file-input:disabled~.custom-file-label { - background-color: #e9ecef -} - -.custom-file-input:lang(en)~.custom-file-label::after { - content: 'http://www.w3.org/2000/svg' -} - -.custom-file-input~.custom-file-label[data-browse]::after { - content: attr(data-browse) -} - -.custom-file-label { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + .75rem + 2px); - padding: .375rem .75rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - background-color: #f6f7f9; - border: 1px solid #f0f2f5; - border-radius: .25rem -} - -.custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + .75rem); - padding: .375rem .75rem; - line-height: 1.5; - color: #495057; - content: '0 0 8 8'; - background-color: #e9ecef; - border-left: inherit; - border-radius: 0 .25rem .25rem 0 -} - -.custom-range { - width: 100%; - height: calc(1rem + .4rem); - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -.custom-range:focus { - outline: 0 -} - -.custom-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-range:focus::-ms-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-range::-moz-focus-outer { - border: 0 -} - -.custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -.25rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - -webkit-appearance: none; - appearance: none -} - -@media (prefers-reduced-motion:reduce) { - .custom-range::-webkit-slider-thumb { - -webkit-transition: none; - transition: none - } - -} - -.custom-range::-webkit-slider-thumb:active { - background-color: #b3d7ff -} - -.custom-range::-webkit-slider-runnable-track { - width: 100%; - height: .5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem -} - -.custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - -moz-appearance: none; - appearance: none -} - -@media (prefers-reduced-motion:reduce) { - .custom-range::-moz-range-thumb { - -webkit-transition: none; - transition: none - } - -} - -.custom-range::-moz-range-thumb:active { - background-color: #b3d7ff -} - -.custom-range::-moz-range-track { - width: 100%; - height: .5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem -} - -.custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: .2rem; - margin-left: .2rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - appearance: none -} - -@media (prefers-reduced-motion:reduce) { - .custom-range::-ms-thumb { - -webkit-transition: none; - transition: none - } - -} - -.custom-range::-ms-thumb:active { - background-color: #b3d7ff -} - -.custom-range::-ms-track { - width: 100%; - height: .5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: .5rem -} - -.custom-range::-ms-fill-lower { - background-color: #dee2e6; - border-radius: 1rem -} - -.custom-range::-ms-fill-upper { - margin-right: 15px; - background-color: #dee2e6; - border-radius: 1rem -} - -.custom-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd -} - -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default -} - -.custom-range:disabled::-moz-range-thumb { - background-color: #adb5bd -} - -.custom-range:disabled::-moz-range-track { - cursor: default -} - -.custom-range:disabled::-ms-thumb { - background-color: #adb5bd -} - -.custom-control-label::before, -.custom-file-label, -.custom-select { - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .custom-control-label::before, - .custom-file-label, - .custom-select { - -webkit-transition: none; - transition: none - } - -} - -.nav { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none -} - -.nav-link { - display: block; - padding: .5rem 1rem -} - -.nav-link:focus, -.nav-link:hover { - text-decoration: none -} - -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6 -} - -.nav-tabs .nav-item { - margin-bottom: -1px -} - -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 2px; - border-top-right-radius: 2px -} - -.nav-tabs .nav-link:focus, -.nav-tabs .nav-link:hover { - border-color: #e9ecef #e9ecef #dee2e6 -} - -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent -} - -.nav-tabs .nav-item.show .nav-link, -.nav-tabs .nav-link.active { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.nav-pills .nav-link { - border-radius: 2px -} - -.nav-pills .nav-link.active, -.nav-pills .show>.nav-link { - color: #fff; - background-color: #007bff -} - -.nav-fill .nav-item { - -webkit-box-flex: 1; - flex: 1 1 auto; - text-align: center -} - -.nav-justified .nav-item { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - text-align: center -} - -.tab-content>.tab-pane { - display: none -} - -.tab-content>.active { - display: block -} - -.navbar { - position: relative; - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: justify; - justify-content: space-between; - padding: .5rem 1rem -} - -.navbar>.container, -.navbar>.container-fluid { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: justify; - justify-content: space-between -} - -.navbar-brand { - display: inline-block; - padding-top: .3125rem; - padding-bottom: .3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap -} - -.navbar-brand:focus, -.navbar-brand:hover { - text-decoration: none -} - -.navbar-nav { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none -} - -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0 -} - -.navbar-nav .dropdown-menu { - position: static; - float: none -} - -.navbar-text { - display: inline-block; - padding-top: .5rem; - padding-bottom: .5rem -} - -.navbar-collapse { - flex-basis: 100%; - -webkit-box-flex: 1; - flex-grow: 1; - -webkit-box-align: center; - align-items: center -} - -.navbar-toggler { - padding: .25rem .75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: .25rem -} - -.navbar-toggler:focus, -.navbar-toggler:hover { - text-decoration: none -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: '%2328a745'; - background: no-repeat center center; - background-size: 100% 100% -} - -@media (max-width:575.98px) { - .navbar-expand-sm>.container, - .navbar-expand-sm>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:576px) { - .navbar-expand-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-sm .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-sm>.container, - .navbar-expand-sm>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-sm .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-sm .navbar-toggler { - display: none - } - -} - -@media (max-width:767.98px) { - .navbar-expand-md>.container, - .navbar-expand-md>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:768px) { - .navbar-expand-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-md .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-md .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-md>.container, - .navbar-expand-md>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-md .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-md .navbar-toggler { - display: none - } - -} - -@media (max-width:991.98px) { - .navbar-expand-lg>.container, - .navbar-expand-lg>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:992px) { - .navbar-expand-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-lg .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-lg>.container, - .navbar-expand-lg>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-lg .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-lg .navbar-toggler { - display: none - } - -} - -@media (max-width:1199.98px) { - .navbar-expand-xl>.container, - .navbar-expand-xl>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:1200px) { - .navbar-expand-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-xl .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-xl>.container, - .navbar-expand-xl>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-xl .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-xl .navbar-toggler { - display: none - } - -} - -.navbar-expand { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start -} - -.navbar-expand>.container, -.navbar-expand>.container-fluid { - padding-right: 0; - padding-left: 0 -} - -.navbar-expand .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row -} - -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute -} - -.navbar-expand .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem -} - -.navbar-expand>.container, -.navbar-expand>.container-fluid { - flex-wrap: nowrap -} - -.navbar-expand .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto -} - -.navbar-expand .navbar-toggler { - display: none -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-brand:focus, -.navbar-light .navbar-brand:hover { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, .5) -} - -.navbar-light .navbar-nav .nav-link:focus, -.navbar-light .navbar-nav .nav-link:hover { - color: rgba(0, 0, 0, .7) -} - -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, .3) -} - -.navbar-light .navbar-nav .active>.nav-link, -.navbar-light .navbar-nav .nav-link.active, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .show>.nav-link { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, .5); - border-color: rgba(0, 0, 0, .1) -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") -} - -.navbar-light .navbar-text { - color: rgba(0, 0, 0, .5) -} - -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-text a:focus, -.navbar-light .navbar-text a:hover { - color: rgba(0, 0, 0, .9) -} - -.navbar-dark .navbar-brand { - color: #fff -} - -.navbar-dark .navbar-brand:focus, -.navbar-dark .navbar-brand:hover { - color: #fff -} - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, .5) -} - -.navbar-dark .navbar-nav .nav-link:focus, -.navbar-dark .navbar-nav .nav-link:hover { - color: rgba(255, 255, 255, .75) -} - -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, .25) -} - -.navbar-dark .navbar-nav .active>.nav-link, -.navbar-dark .navbar-nav .nav-link.active, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .show>.nav-link { - color: #fff -} - -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, .5); - border-color: rgba(255, 255, 255, .1) -} - -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") -} - -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, .5) -} - -.navbar-dark .navbar-text a { - color: #fff -} - -.navbar-dark .navbar-text a:focus, -.navbar-dark .navbar-text a:hover { - color: #fff -} - -.card { - position: relative; - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(238, 238, 238, .75); - border-radius: .25rem -} - -.card>hr { - margin-right: 0; - margin-left: 0 -} - -.card>.list-group:first-child .list-group-item:first-child { - border-top-left-radius: .25rem; - border-top-right-radius: .25rem -} - -.card>.list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: .25rem; - border-bottom-left-radius: .25rem -} - -.card-body { - -webkit-box-flex: 1; - flex: 1 1 auto; - padding: 1.25rem -} - -.card-title { - margin-bottom: .75rem -} - -.card-subtitle { - margin-top: -.375rem; - margin-bottom: 0 -} - -.card-text:last-child { - margin-bottom: 0 -} - -.card-link:hover { - text-decoration: none -} - -.card-link+.card-link { - margin-left: 1.25rem -} - -.card-header { - padding: .75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, .03); - border-bottom: 1px solid rgba(238, 238, 238, .75) -} - -.card-header:first-child { - border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0 -} - -.card-header+.list-group .list-group-item:first-child { - border-top: 0 -} - -.card-footer { - padding: .75rem 1.25rem; - background-color: rgba(0, 0, 0, .03); - border-top: 1px solid rgba(238, 238, 238, .75) -} - -.card-footer:last-child { - border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px) -} - -.card-header-tabs { - margin-right: -.625rem; - margin-bottom: -.75rem; - margin-left: -.625rem; - border-bottom: 0 -} - -.card-header-pills { - margin-right: -.625rem; - margin-left: -.625rem -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem -} - -.card-img { - width: 100%; - border-radius: calc(.25rem - 1px) -} - -.card-img-top { - width: 100%; - border-top-left-radius: calc(.25rem - 1px); - border-top-right-radius: calc(.25rem - 1px) -} - -.card-img-bottom { - width: 100%; - border-bottom-right-radius: calc(.25rem - 1px); - border-bottom-left-radius: calc(.25rem - 1px) -} - -.card-deck { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column -} - -.card-deck .card { - margin-bottom: 15px -} - -@media (min-width:576px) { - .card-deck { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap; - margin-right: -15px; - margin-left: -15px - } - - .card-deck .card { - display: -webkit-box; - display: flex; - -webkit-box-flex: 1; - flex: 1 0 0%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - margin-right: 15px; - margin-bottom: 0; - margin-left: 15px - } - -} - -.card-group { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column -} - -.card-group>.card { - margin-bottom: 15px -} - -@media (min-width:576px) { - .card-group { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap - } - - .card-group>.card { - -webkit-box-flex: 1; - flex: 1 0 0%; - margin-bottom: 0 - } - - .card-group>.card+.card { - margin-left: 0; - border-left: 0 - } - - .card-group>.card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 - } - - .card-group>.card:not(:last-child) .card-header, - .card-group>.card:not(:last-child) .card-img-top { - border-top-right-radius: 0 - } - - .card-group>.card:not(:last-child) .card-footer, - .card-group>.card:not(:last-child) .card-img-bottom { - border-bottom-right-radius: 0 - } - - .card-group>.card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 - } - - .card-group>.card:not(:first-child) .card-header, - .card-group>.card:not(:first-child) .card-img-top { - border-top-left-radius: 0 - } - - .card-group>.card:not(:first-child) .card-footer, - .card-group>.card:not(:first-child) .card-img-bottom { - border-bottom-left-radius: 0 - } - -} - -.card-columns .card { - margin-bottom: .75rem -} - -@media (min-width:576px) { - .card-columns { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1 - } - - .card-columns .card { - display: inline-block; - width: 100% - } - -} - -.accordion>.card { - overflow: hidden -} - -.accordion>.card:not(:first-of-type) .card-header:first-child { - border-radius: 0 -} - -.accordion>.card:not(:first-of-type):not(:last-of-type) { - border-bottom: 0; - border-radius: 0 -} - -.accordion>.card:first-of-type { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 -} - -.accordion>.card:last-of-type { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.accordion>.card .card-header { - margin-bottom: -1px -} - -.breadcrumb { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - padding: .75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #f7f9fa; - border-radius: .25rem -} - -.breadcrumb-item+.breadcrumb-item { - padding-left: .5rem -} - -.breadcrumb-item+.breadcrumb-item::before { - display: inline-block; - padding-right: .5rem; - color: #a8a9ad; - content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' -} - -.breadcrumb-item+.breadcrumb-item:hover::before { - text-decoration: underline -} - -.breadcrumb-item+.breadcrumb-item:hover::before { - text-decoration: none -} - -.breadcrumb-item.active { - color: #6c757d -} - -.pagination { - display: -webkit-box; - display: flex; - padding-left: 0; - list-style: none; - border-radius: 2px -} - -.page-link { - position: relative; - display: block; - padding: .5rem .75rem; - margin-left: -1px; - line-height: 1.25; - color: #007bff; - background-color: #fff; - border: 1px solid #dee2e6 -} - -.page-link:hover { - z-index: 2; - color: #0056b3; - text-decoration: none; - background-color: #e9ecef; - border-color: #dee2e6 -} - -.page-link:focus { - z-index: 2; - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px -} - -.page-item:last-child .page-link { - border-top-right-radius: 2px; - border-bottom-right-radius: 2px -} - -.page-item.active .page-link { - z-index: 1; - color: #fff; - background-color: #007bff; - border-color: #007bff -} - -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - cursor: auto; - background-color: #fff; - border-color: #dee2e6 -} - -.pagination-lg .page-link { - padding: .75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5 -} - -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px -} - -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px -} - -.pagination-sm .page-link { - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5 -} - -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: .2rem; - border-bottom-left-radius: .2rem -} - -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: .2rem; - border-bottom-right-radius: .2rem -} - -.badge { - display: inline-block; - padding: .45rem 1rem; - font-size: 80%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25rem; - -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .badge { - -webkit-transition: none; - transition: none - } - -} - -a.badge:focus, -a.badge:hover { - text-decoration: none -} - -.badge:empty { - display: none -} - -.btn .badge { - position: relative; - top: -1px -} - -.badge-pill { - padding-right: .5rem; - padding-left: .5rem; - border-radius: 10rem -} - -.badge-primary { - color: #fff; - background-color: #047006 -} - -a.badge-primary:focus, -a.badge-primary:hover { - color: #fff; - background-color: #023f03 -} - -a.badge-primary.focus, -a.badge-primary:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) -} - -.badge-secondary { - color: #fff; - background-color: grey -} - -a.badge-secondary:focus, -a.badge-secondary:hover { - color: #fff; - background-color: #676767 -} - -a.badge-secondary.focus, -a.badge-secondary:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) -} - -.badge-success { - color: #fff; - background-color: #00e093 -} - -a.badge-success:focus, -a.badge-success:hover { - color: #fff; - background-color: #00ad72 -} - -a.badge-success.focus, -a.badge-success:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) -} - -.badge-info { - color: #fff; - background-color: #6c61f6 -} - -a.badge-info:focus, -a.badge-info:hover { - color: #fff; - background-color: #3f31f3 -} - -a.badge-info.focus, -a.badge-info:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) -} - -.badge-warning { - color: #212529; - background-color: #f0825f -} - -a.badge-warning:focus, -a.badge-warning:hover { - color: #212529; - background-color: #ec5e30 -} - -a.badge-warning.focus, -a.badge-warning:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) -} - -.badge-danger { - color: #fff; - background-color: #ff5f66 -} - -a.badge-danger:focus, -a.badge-danger:hover { - color: #fff; - background-color: #ff2c35 -} - -a.badge-danger.focus, -a.badge-danger:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) -} - -.badge-light { - color: #212529; - background-color: #dfdfdf -} - -a.badge-light:focus, -a.badge-light:hover { - color: #212529; - background-color: #c6c6c6 -} - -a.badge-light.focus, -a.badge-light:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) -} - -.badge-dark { - color: #fff; - background-color: #74767b -} - -a.badge-dark:focus, -a.badge-dark:hover { - color: #fff; - background-color: #5b5d61 -} - -a.badge-dark.focus, -a.badge-dark:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) -} - -.badge-white { - color: #212529; - background-color: #fff -} - -a.badge-white:focus, -a.badge-white:hover { - color: #212529; - background-color: #e6e6e6 -} - -a.badge-white.focus, -a.badge-white:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) -} - -.badge-orange { - color: #212529; - background-color: #ffa600 -} - -a.badge-orange:focus, -a.badge-orange:hover { - color: #212529; - background-color: #cc8500 -} - -a.badge-orange.focus, -a.badge-orange:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5) -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 6px -} - -@media (min-width:576px) { - .jumbotron { - padding: 4rem 2rem - } - -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0 -} - -.alert { - position: relative; - padding: 1.15rem 1.15rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 2px -} - -.alert-heading { - color: inherit -} - -.alert-link { - font-weight: 700 -} - -.alert-dismissible { - padding-right: 3.8rem -} - -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - padding: 1.15rem 1.15rem; - color: inherit -} - -.alert-primary { - color: #023a03; - background-color: #cde2cd; - border-color: #b9d7b9 -} - -.alert-primary hr { - border-top-color: #a9cea9 -} - -.alert-primary .alert-link { - color: #000900 -} - -.alert-secondary { - color: #434343; - background-color: #e6e6e6; - border-color: #dbdbdb -} - -.alert-secondary hr { - border-top-color: #cecece -} - -.alert-secondary .alert-link { - color: #2a2a2a -} - -.alert-success { - color: #00744c; - background-color: #ccf9e9; - border-color: #b8f6e1 -} - -.alert-success hr { - border-top-color: #a1f3d7 -} - -.alert-success .alert-link { - color: #00412b -} - -.alert-info { - color: #383280; - background-color: #e2dffd; - border-color: #d6d3fc -} - -.alert-info hr { - border-top-color: #c0bbfa -} - -.alert-info .alert-link { - color: #28245b -} - -.alert-warning { - color: #7d4431; - background-color: #fce6df; - border-color: #fbdcd2 -} - -.alert-warning hr { - border-top-color: #f9cabb -} - -.alert-warning .alert-link { - color: #583023 -} - -.alert-danger { - color: #853135; - background-color: #ffdfe0; - border-color: #ffd2d4 -} - -.alert-danger hr { - border-top-color: #ffb9bc -} - -.alert-danger .alert-link { - color: #602326 -} - -.alert-light { - color: #747474; - background-color: #f9f9f9; - border-color: #f6f6f6 -} - -.alert-light hr { - border-top-color: #e9e9e9 -} - -.alert-light .alert-link { - color: #5b5b5b -} - -.alert-dark { - color: #3c3d40; - background-color: #e3e4e5; - border-color: #d8d9da -} - -.alert-dark hr { - border-top-color: #cbccce -} - -.alert-dark .alert-link { - color: #232426 -} - -.alert-white { - color: #858585; - background-color: #fff; - border-color: #fff -} - -.alert-white hr { - border-top-color: #f2f2f2 -} - -.alert-white .alert-link { - color: #6c6c6c -} - -.alert-orange { - color: #855600; - background-color: #ffedcc; - border-color: #ffe6b8 -} - -.alert-orange hr { - border-top-color: #ffdd9f -} - -.alert-orange .alert-link { - color: #523500 -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0 - } - - to { - background-position: 0 0 - } - -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0 - } - - to { - background-position: 0 0 - } - -} - -.progress { - display: -webkit-box; - display: flex; - height: 1rem; - overflow: hidden; - font-size: .75rem; - background-color: #f3f5f7; - border-radius: 2px -} - -.progress-bar { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-pack: center; - justify-content: center; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #007bff; - -webkit-transition: width .6s ease; - transition: width .6s ease -} - -@media (prefers-reduced-motion:reduce) { - .progress-bar { - -webkit-transition: none; - transition: none - } - -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite -} - -@media (prefers-reduced-motion:reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none - } - -} - -.media { - display: -webkit-box; - display: flex; - -webkit-box-align: start; - align-items: flex-start -} - -.media-body { - -webkit-box-flex: 1; - flex: 1 -} - -.list-group { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - padding-left: 0; - margin-bottom: 0 -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit -} - -.list-group-item-action:focus, -.list-group-item-action:hover { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa -} - -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef -} - -.list-group-item { - position: relative; - display: block; - padding: .75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, .125) -} - -.list-group-item:first-child { - border-top-left-radius: .25rem; - border-top-right-radius: .25rem -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: .25rem -} - -.list-group-item.disabled, -.list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff -} - -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #007bff; - border-color: #007bff -} - -.list-group-horizontal { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row -} - -.list-group-horizontal .list-group-item { - margin-right: -1px; - margin-bottom: 0 -} - -.list-group-horizontal .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 -} - -.list-group-horizontal .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 -} - -@media (min-width:576px) { - .list-group-horizontal-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-sm .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-sm .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-sm .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -@media (min-width:768px) { - .list-group-horizontal-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-md .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-md .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-md .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -@media (min-width:992px) { - .list-group-horizontal-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-lg .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-lg .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-lg .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -@media (min-width:1200px) { - .list-group-horizontal-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-xl .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-xl .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-xl .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -.list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0 -} - -.list-group-flush .list-group-item:last-child { - margin-bottom: -1px -} - -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0 -} - -.list-group-flush:last-child .list-group-item:last-child { - margin-bottom: 0; - border-bottom: 0 -} - -.list-group-item-primary { - color: #023a03; - background-color: #b9d7b9 -} - -.list-group-item-primary.list-group-item-action:focus, -.list-group-item-primary.list-group-item-action:hover { - color: #023a03; - background-color: #a9cea9 -} - -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #023a03; - border-color: #023a03 -} - -.list-group-item-secondary { - color: #434343; - background-color: #dbdbdb -} - -.list-group-item-secondary.list-group-item-action:focus, -.list-group-item-secondary.list-group-item-action:hover { - color: #434343; - background-color: #cecece -} - -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #434343; - border-color: #434343 -} - -.list-group-item-success { - color: #00744c; - background-color: #b8f6e1 -} - -.list-group-item-success.list-group-item-action:focus, -.list-group-item-success.list-group-item-action:hover { - color: #00744c; - background-color: #a1f3d7 -} - -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #00744c; - border-color: #00744c -} - -.list-group-item-info { - color: #383280; - background-color: #d6d3fc -} - -.list-group-item-info.list-group-item-action:focus, -.list-group-item-info.list-group-item-action:hover { - color: #383280; - background-color: #c0bbfa -} - -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #383280; - border-color: #383280 -} - -.list-group-item-warning { - color: #7d4431; - background-color: #fbdcd2 -} - -.list-group-item-warning.list-group-item-action:focus, -.list-group-item-warning.list-group-item-action:hover { - color: #7d4431; - background-color: #f9cabb -} - -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #7d4431; - border-color: #7d4431 -} - -.list-group-item-danger { - color: #853135; - background-color: #ffd2d4 -} - -.list-group-item-danger.list-group-item-action:focus, -.list-group-item-danger.list-group-item-action:hover { - color: #853135; - background-color: #ffb9bc -} - -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #853135; - border-color: #853135 -} - -.list-group-item-light { - color: #747474; - background-color: #f6f6f6 -} - -.list-group-item-light.list-group-item-action:focus, -.list-group-item-light.list-group-item-action:hover { - color: #747474; - background-color: #e9e9e9 -} - -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #747474; - border-color: #747474 -} - -.list-group-item-dark { - color: #3c3d40; - background-color: #d8d9da -} - -.list-group-item-dark.list-group-item-action:focus, -.list-group-item-dark.list-group-item-action:hover { - color: #3c3d40; - background-color: #cbccce -} - -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #3c3d40; - border-color: #3c3d40 -} - -.list-group-item-white { - color: #858585; - background-color: #fff -} - -.list-group-item-white.list-group-item-action:focus, -.list-group-item-white.list-group-item-action:hover { - color: #858585; - background-color: #f2f2f2 -} - -.list-group-item-white.list-group-item-action.active { - color: #fff; - background-color: #858585; - border-color: #858585 -} - -.list-group-item-orange { - color: #855600; - background-color: #ffe6b8 -} - -.list-group-item-orange.list-group-item-action:focus, -.list-group-item-orange.list-group-item-action:hover { - color: #855600; - background-color: #ffdd9f -} - -.list-group-item-orange.list-group-item-action.active { - color: #fff; - background-color: #855600; - border-color: #855600 -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5 -} - -.close:hover { - color: #000; - text-decoration: none -} - -.close:not(:disabled):not(.disabled):focus, -.close:not(:disabled):not(.disabled):hover { - opacity: .75 -} - -button.close { - padding: 0; - background-color: transparent; - border: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -a.close.disabled { - pointer-events: none -} - -.toast { - max-width: 350px; - overflow: hidden; - font-size: .875rem; - background-color: rgba(255, 255, 255, .85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .1); - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .1); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - opacity: 0; - border-radius: .25rem -} - -.toast:not(:last-child) { - margin-bottom: .75rem -} - -.toast.showing { - opacity: 1 -} - -.toast.show { - display: block; - opacity: 1 -} - -.toast.hide { - display: none -} - -.toast-header { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - padding: .25rem .75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, .85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, .05) -} - -.toast-body { - padding: .75rem -} - -.modal-open { - overflow: hidden -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0 -} - -.modal-dialog { - position: relative; - width: auto; - margin: .5rem; - pointer-events: none -} - -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - transition: -webkit-transform .3s ease-out; - transition: transform .3s ease-out; - transition: transform .3s ease-out, -webkit-transform .3s ease-out; - -webkit-transform: translate(0, -50px); - transform: translate(0, -50px) -} - -@media (prefers-reduced-motion:reduce) { - .modal.fade .modal-dialog { - -webkit-transition: none; - transition: none - } - -} - -.modal.show .modal-dialog { - -webkit-transform: none; - transform: none -} - -.modal-dialog-scrollable { - display: -webkit-box; - display: flex; - max-height: calc(100% - 1rem) -} - -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden -} - -.modal-dialog-scrollable .modal-footer, -.modal-dialog-scrollable .modal-header { - flex-shrink: 0 -} - -.modal-dialog-scrollable .modal-body { - overflow-y: auto -} - -.modal-dialog-centered { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - min-height: calc(100% - 1rem) -} - -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - content: 'http://www.w3.org/2000/svg' -} - -.modal-dialog-centered.modal-dialog-scrollable { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-pack: center; - justify-content: center; - height: 100% -} - -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none -} - -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none -} - -.modal-content { - position: relative; - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: .3rem; - outline: 0 -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000 -} - -.modal-backdrop.fade { - opacity: 0 -} - -.modal-backdrop.show { - opacity: .8 -} - -.modal-header { - display: -webkit-box; - display: flex; - -webkit-box-align: start; - align-items: flex-start; - -webkit-box-pack: justify; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: .3rem; - border-top-right-radius: .3rem -} - -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5 -} - -.modal-body { - position: relative; - -webkit-box-flex: 1; - flex: 1 1 auto; - padding: 1rem -} - -.modal-footer { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: end; - justify-content: flex-end; - padding: 1rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: .3rem; - border-bottom-left-radius: .3rem -} - -.modal-footer>:not(:first-child) { - margin-left: .25rem -} - -.modal-footer>:not(:last-child) { - margin-right: .25rem -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll -} - -@media (min-width:576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto - } - - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem) - } - - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem) - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem) - } - - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem) - } - - .modal-sm { - max-width: 300px - } - -} - -@media (min-width:992px) { - .modal-lg, - .modal-xl { - max-width: 800px - } - -} - -@media (min-width:1200px) { - .modal-xl { - max-width: 1140px - } - -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.7; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: .875rem; - word-wrap: break-word; - opacity: 0 -} - -.tooltip.show { - opacity: .9 -} - -.tooltip .arrow { - position: absolute; - display: block; - width: .8rem; - height: .4rem -} - -.tooltip .arrow::before { - position: absolute; - content: '%23dc3545'; - border-color: transparent; - border-style: solid -} - -.bs-tooltip-auto[x-placement^=top], -.bs-tooltip-top { - padding: .4rem 0 -} - -.bs-tooltip-auto[x-placement^=top] .arrow, -.bs-tooltip-top .arrow { - bottom: 0 -} - -.bs-tooltip-auto[x-placement^=top] .arrow::before, -.bs-tooltip-top .arrow::before { - top: 0; - border-width: .4rem .4rem 0; - border-top-color: #000 -} - -.bs-tooltip-auto[x-placement^=right], -.bs-tooltip-right { - padding: 0 .4rem -} - -.bs-tooltip-auto[x-placement^=right] .arrow, -.bs-tooltip-right .arrow { - left: 0; - width: .4rem; - height: .8rem -} - -.bs-tooltip-auto[x-placement^=right] .arrow::before, -.bs-tooltip-right .arrow::before { - right: 0; - border-width: .4rem .4rem .4rem 0; - border-right-color: #000 -} - -.bs-tooltip-auto[x-placement^=bottom], -.bs-tooltip-bottom { - padding: .4rem 0 -} - -.bs-tooltip-auto[x-placement^=bottom] .arrow, -.bs-tooltip-bottom .arrow { - top: 0 -} - -.bs-tooltip-auto[x-placement^=bottom] .arrow::before, -.bs-tooltip-bottom .arrow::before { - bottom: 0; - border-width: 0 .4rem .4rem; - border-bottom-color: #000 -} - -.bs-tooltip-auto[x-placement^=left], -.bs-tooltip-left { - padding: 0 .4rem -} - -.bs-tooltip-auto[x-placement^=left] .arrow, -.bs-tooltip-left .arrow { - right: 0; - width: .4rem; - height: .8rem -} - -.bs-tooltip-auto[x-placement^=left] .arrow::before, -.bs-tooltip-left .arrow::before { - left: 0; - border-width: .4rem 0 .4rem .4rem; - border-left-color: #000 -} - -.tooltip-inner { - max-width: 200px; - padding: .25rem .5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: .25rem -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.7; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: .875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: .3rem -} - -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: .5rem; - margin: 0 6px -} - -.popover .arrow::after, -.popover .arrow::before { - position: absolute; - display: block; - content: '-2 -2 7 7'; - border-color: transparent; - border-style: solid -} - -.bs-popover-auto[x-placement^=top], -.bs-popover-top { - margin-bottom: .5rem -} - -.bs-popover-auto[x-placement^=top]>.arrow, -.bs-popover-top>.arrow { - bottom: calc((.5rem + 1px) * -1) -} - -.bs-popover-auto[x-placement^=top]>.arrow::before, -.bs-popover-top>.arrow::before { - bottom: 0; - border-width: .5rem .5rem 0; - border-top-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=top]>.arrow::after, -.bs-popover-top>.arrow::after { - bottom: 1px; - border-width: .5rem .5rem 0; - border-top-color: #fff -} - -.bs-popover-auto[x-placement^=right], -.bs-popover-right { - margin-left: .5rem -} - -.bs-popover-auto[x-placement^=right]>.arrow, -.bs-popover-right>.arrow { - left: calc((.5rem + 1px) * -1); - width: .5rem; - height: 1rem; - margin: 6px 0 -} - -.bs-popover-auto[x-placement^=right]>.arrow::before, -.bs-popover-right>.arrow::before { - left: 0; - border-width: .5rem .5rem .5rem 0; - border-right-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=right]>.arrow::after, -.bs-popover-right>.arrow::after { - left: 1px; - border-width: .5rem .5rem .5rem 0; - border-right-color: #fff -} - -.bs-popover-auto[x-placement^=bottom], -.bs-popover-bottom { - margin-top: .5rem -} - -.bs-popover-auto[x-placement^=bottom]>.arrow, -.bs-popover-bottom>.arrow { - top: calc((.5rem + 1px) * -1) -} - -.bs-popover-auto[x-placement^=bottom]>.arrow::before, -.bs-popover-bottom>.arrow::before { - top: 0; - border-width: 0 .5rem .5rem .5rem; - border-bottom-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=bottom]>.arrow::after, -.bs-popover-bottom>.arrow::after { - top: 1px; - border-width: 0 .5rem .5rem .5rem; - border-bottom-color: #fff -} - -.bs-popover-auto[x-placement^=bottom] .popover-header::before, -.bs-popover-bottom .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -.5rem; - content: '%23dc3545'; - border-bottom: 1px solid #f7f7f7 -} - -.bs-popover-auto[x-placement^=left], -.bs-popover-left { - margin-right: .5rem -} - -.bs-popover-auto[x-placement^=left]>.arrow, -.bs-popover-left>.arrow { - right: calc((.5rem + 1px) * -1); - width: .5rem; - height: 1rem; - margin: 6px 0 -} - -.bs-popover-auto[x-placement^=left]>.arrow::before, -.bs-popover-left>.arrow::before { - right: 0; - border-width: .5rem 0 .5rem .5rem; - border-left-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=left]>.arrow::after, -.bs-popover-left>.arrow::after { - right: 1px; - border-width: .5rem 0 .5rem .5rem; - border-left-color: #fff -} - -.popover-header { - padding: .5rem .75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(6px - 1px); - border-top-right-radius: calc(6px - 1px) -} - -.popover-header:empty { - display: none -} - -.popover-body { - padding: .5rem .75rem; - color: #212529 -} - -.carousel { - position: relative -} - -.carousel.pointer-event { - touch-action: pan-y -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden -} - -.carousel-inner::after { - display: block; - clear: both; - content: 'M0 0l3 3m0-3L0 3' -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transition: -webkit-transform .6s ease-in-out; - transition: -webkit-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .carousel-item { - -webkit-transition: none; - transition: none - } - -} - -.carousel-item-next, -.carousel-item-prev, -.carousel-item.active { - display: block -} - -.active.carousel-item-right, -.carousel-item-next:not(.carousel-item-left) { - -webkit-transform: translateX(100%); - transform: translateX(100%) -} - -.active.carousel-item-left, -.carousel-item-prev:not(.carousel-item-right) { - -webkit-transform: translateX(-100%); - transform: translateX(-100%) -} - -.carousel-fade .carousel-item { - opacity: 0; - -webkit-transition-property: opacity; - transition-property: opacity; - -webkit-transform: none; - transform: none -} - -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right, -.carousel-fade .carousel-item.active { - z-index: 1; - opacity: 1 -} - -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - -webkit-transition: 0s .6s opacity; - transition: 0s .6s opacity -} - -@media (prefers-reduced-motion:reduce) { - .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-right { - -webkit-transition: none; - transition: none - } - -} - -.carousel-control-next, -.carousel-control-prev { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: .5; - -webkit-transition: opacity .15s ease; - transition: opacity .15s ease -} - -@media (prefers-reduced-motion:reduce) { - .carousel-control-next, - .carousel-control-prev { - -webkit-transition: none; - transition: none - } - -} - -.carousel-control-next:focus, -.carousel-control-next:hover, -.carousel-control-prev:focus, -.carousel-control-prev:hover { - color: #fff; - text-decoration: none; - outline: 0; - opacity: .9 -} - -.carousel-control-prev { - left: 0 -} - -.carousel-control-next { - right: 0 -} - -.carousel-control-next-icon, -.carousel-control-prev-icon { - display: inline-block; - width: 20px; - height: 20px; - background: no-repeat 50%/100% 100% -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none -} - -.carousel-indicators li { - box-sizing: content-box; - -webkit-box-flex: 0; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: .5; - -webkit-transition: opacity .6s ease; - transition: opacity .6s ease -} - -@media (prefers-reduced-motion:reduce) { - .carousel-indicators li { - -webkit-transition: none; - transition: none - } - -} - -.carousel-indicators .active { - opacity: 1 -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center -} - -@-webkit-keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } - -} - -@keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } - -} - -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - border: .25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border .75s linear infinite; - animation: spinner-border .75s linear infinite -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: .2em -} - -@-webkit-keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0) - } - - 50% { - opacity: 1 - } - -} - -@keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0) - } - - 50% { - opacity: 1 - } - -} - -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: spinner-grow .75s linear infinite; - animation: spinner-grow .75s linear infinite -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem -} - -.align-baseline { - vertical-align: baseline !important -} - -.align-top { - vertical-align: top !important -} - -.align-middle { - vertical-align: middle !important -} - -.align-bottom { - vertical-align: bottom !important -} - -.align-text-bottom { - vertical-align: text-bottom !important -} - -.align-text-top { - vertical-align: text-top !important -} - -.bg-primary { - background-color: #047006 !important -} - -a.bg-primary:focus, -a.bg-primary:hover, -button.bg-primary:focus, -button.bg-primary:hover { - background-color: #023f03 !important -} - -.bg-secondary { - background-color: grey !important -} - -a.bg-secondary:focus, -a.bg-secondary:hover, -button.bg-secondary:focus, -button.bg-secondary:hover { - background-color: #676767 !important -} - -.bg-success { - background-color: #00e093 !important -} - -a.bg-success:focus, -a.bg-success:hover, -button.bg-success:focus, -button.bg-success:hover { - background-color: #00ad72 !important -} - -.bg-info { - background-color: #6c61f6 !important -} - -a.bg-info:focus, -a.bg-info:hover, -button.bg-info:focus, -button.bg-info:hover { - background-color: #3f31f3 !important -} - -.bg-warning { - background-color: #f0825f !important -} - -a.bg-warning:focus, -a.bg-warning:hover, -button.bg-warning:focus, -button.bg-warning:hover { - background-color: #ec5e30 !important -} - -.bg-danger { - background-color: #ff5f66 !important -} - -a.bg-danger:focus, -a.bg-danger:hover, -button.bg-danger:focus, -button.bg-danger:hover { - background-color: #ff2c35 !important -} - -.bg-light { - background-color: #dfdfdf !important -} - -a.bg-light:focus, -a.bg-light:hover, -button.bg-light:focus, -button.bg-light:hover { - background-color: #c6c6c6 !important -} - -.bg-dark { - background-color: #74767b !important -} - -a.bg-dark:focus, -a.bg-dark:hover, -button.bg-dark:focus, -button.bg-dark:hover { - background-color: #5b5d61 !important -} - -.bg-white { - background-color: #fff !important -} - -a.bg-white:focus, -a.bg-white:hover, -button.bg-white:focus, -button.bg-white:hover { - background-color: #e6e6e6 !important -} - -.bg-orange { - background-color: #ffa600 !important -} - -a.bg-orange:focus, -a.bg-orange:hover, -button.bg-orange:focus, -button.bg-orange:hover { - background-color: #cc8500 !important -} - -.bg-white { - background-color: #fff !important -} - -.bg-transparent { - background-color: transparent !important -} - -.border { - border: 1px solid #f2f4f9 !important -} - -.border-top { - border-top: 1px solid #f2f4f9 !important -} - -.border-right { - border-right: 1px solid #f2f4f9 !important -} - -.border-bottom { - border-bottom: 1px solid #f2f4f9 !important -} - -.border-left { - border-left: 1px solid #f2f4f9 !important -} - -.border-0 { - border: 0 !important -} - -.border-top-0 { - border-top: 0 !important -} - -.border-right-0 { - border-right: 0 !important -} - -.border-bottom-0 { - border-bottom: 0 !important -} - -.border-left-0 { - border-left: 0 !important -} - -.border-primary { - border-color: #047006 !important -} - -.border-secondary { - border-color: grey !important -} - -.border-success { - border-color: #00e093 !important -} - -.border-info { - border-color: #6c61f6 !important -} - -.border-warning { - border-color: #f0825f !important -} - -.border-danger { - border-color: #ff5f66 !important -} - -.border-light { - border-color: #dfdfdf !important -} - -.border-dark { - border-color: #74767b !important -} - -.border-white { - border-color: #fff !important -} - -.border-orange { - border-color: #ffa600 !important -} - -.border-white { - border-color: #fff !important -} - -.rounded-sm { - border-radius: .2rem !important -} - -.rounded { - border-radius: 2px !important -} - -.rounded-top { - border-top-left-radius: 2px !important; - border-top-right-radius: 2px !important -} - -.rounded-right { - border-top-right-radius: 2px !important; - border-bottom-right-radius: 2px !important -} - -.rounded-bottom { - border-bottom-right-radius: 2px !important; - border-bottom-left-radius: 2px !important -} - -.rounded-left { - border-top-left-radius: 2px !important; - border-bottom-left-radius: 2px !important -} - -.rounded-lg { - border-radius: 6px !important -} - -.rounded-circle { - border-radius: 50% !important -} - -.rounded-pill { - border-radius: 50rem !important -} - -.rounded-0 { - border-radius: 0 !important -} - -.clearfix::after { - display: block; - clear: both; - content: '.5' -} - -.d-none { - display: none !important -} - -.d-inline { - display: inline !important -} - -.d-inline-block { - display: inline-block !important -} - -.d-block { - display: block !important -} - -.d-table { - display: table !important -} - -.d-table-row { - display: table-row !important -} - -.d-table-cell { - display: table-cell !important -} - -.d-flex { - display: -webkit-box !important; - display: flex !important -} - -.d-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important -} - -@media (min-width:576px) { - .d-sm-none { - display: none !important - } - - .d-sm-inline { - display: inline !important - } - - .d-sm-inline-block { - display: inline-block !important - } - - .d-sm-block { - display: block !important - } - - .d-sm-table { - display: table !important - } - - .d-sm-table-row { - display: table-row !important - } - - .d-sm-table-cell { - display: table-cell !important - } - - .d-sm-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-sm-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media (min-width:768px) { - .d-md-none { - display: none !important - } - - .d-md-inline { - display: inline !important - } - - .d-md-inline-block { - display: inline-block !important - } - - .d-md-block { - display: block !important - } - - .d-md-table { - display: table !important - } - - .d-md-table-row { - display: table-row !important - } - - .d-md-table-cell { - display: table-cell !important - } - - .d-md-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-md-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media (min-width:992px) { - .d-lg-none { - display: none !important - } - - .d-lg-inline { - display: inline !important - } - - .d-lg-inline-block { - display: inline-block !important - } - - .d-lg-block { - display: block !important - } - - .d-lg-table { - display: table !important - } - - .d-lg-table-row { - display: table-row !important - } - - .d-lg-table-cell { - display: table-cell !important - } - - .d-lg-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-lg-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media (min-width:1200px) { - .d-xl-none { - display: none !important - } - - .d-xl-inline { - display: inline !important - } - - .d-xl-inline-block { - display: inline-block !important - } - - .d-xl-block { - display: block !important - } - - .d-xl-table { - display: table !important - } - - .d-xl-table-row { - display: table-row !important - } - - .d-xl-table-cell { - display: table-cell !important - } - - .d-xl-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-xl-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media print { - .d-print-none { - display: none !important - } - - .d-print-inline { - display: inline !important - } - - .d-print-inline-block { - display: inline-block !important - } - - .d-print-block { - display: block !important - } - - .d-print-table { - display: table !important - } - - .d-print-table-row { - display: table-row !important - } - - .d-print-table-cell { - display: table-cell !important - } - - .d-print-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-print-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden -} - -.embed-responsive::before { - display: block; - content: '3' -} - -.embed-responsive .embed-responsive-item, -.embed-responsive embed, -.embed-responsive iframe, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0 -} - -.embed-responsive-21by9::before { - padding-top: 42.85714% -} - -.embed-responsive-16by9::before { - padding-top: 56.25% -} - -.embed-responsive-4by3::before { - padding-top: 75% -} - -.embed-responsive-1by1::before { - padding-top: 100% -} - -.embed-responsive-21by9::before { - padding-top: 42.85714% -} - -.embed-responsive-16by9::before { - padding-top: 56.25% -} - -.embed-responsive-4by3::before { - padding-top: 75% -} - -.embed-responsive-1by1::before { - padding-top: 100% -} - -.flex-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important -} - -.flex-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important -} - -.flex-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important -} - -.flex-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important -} - -.flex-wrap { - flex-wrap: wrap !important -} - -.flex-nowrap { - flex-wrap: nowrap !important -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important -} - -.flex-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important -} - -.flex-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important -} - -.flex-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important -} - -.flex-shrink-0 { - flex-shrink: 0 !important -} - -.flex-shrink-1 { - flex-shrink: 1 !important -} - -.justify-content-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important -} - -.justify-content-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important -} - -.justify-content-center { - -webkit-box-pack: center !important; - justify-content: center !important -} - -.justify-content-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important -} - -.justify-content-around { - justify-content: space-around !important -} - -.align-items-start { - -webkit-box-align: start !important; - align-items: flex-start !important -} - -.align-items-end { - -webkit-box-align: end !important; - align-items: flex-end !important -} - -.align-items-center { - -webkit-box-align: center !important; - align-items: center !important -} - -.align-items-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important -} - -.align-items-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important -} - -.align-content-start { - align-content: flex-start !important -} - -.align-content-end { - align-content: flex-end !important -} - -.align-content-center { - align-content: center !important -} - -.align-content-between { - align-content: space-between !important -} - -.align-content-around { - align-content: space-around !important -} - -.align-content-stretch { - align-content: stretch !important -} - -.align-self-auto { - align-self: auto !important -} - -.align-self-start { - align-self: flex-start !important -} - -.align-self-end { - align-self: flex-end !important -} - -.align-self-center { - align-self: center !important -} - -.align-self-baseline { - align-self: baseline !important -} - -.align-self-stretch { - align-self: stretch !important -} - -@media (min-width:576px) { - .flex-sm-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-sm-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-sm-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-sm-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-sm-wrap { - flex-wrap: wrap !important - } - - .flex-sm-nowrap { - flex-wrap: nowrap !important - } - - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-sm-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-sm-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-sm-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-sm-shrink-0 { - flex-shrink: 0 !important - } - - .flex-sm-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-sm-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-sm-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-sm-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-sm-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-sm-around { - justify-content: space-around !important - } - - .align-items-sm-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-sm-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-sm-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-sm-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-sm-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-sm-start { - align-content: flex-start !important - } - - .align-content-sm-end { - align-content: flex-end !important - } - - .align-content-sm-center { - align-content: center !important - } - - .align-content-sm-between { - align-content: space-between !important - } - - .align-content-sm-around { - align-content: space-around !important - } - - .align-content-sm-stretch { - align-content: stretch !important - } - - .align-self-sm-auto { - align-self: auto !important - } - - .align-self-sm-start { - align-self: flex-start !important - } - - .align-self-sm-end { - align-self: flex-end !important - } - - .align-self-sm-center { - align-self: center !important - } - - .align-self-sm-baseline { - align-self: baseline !important - } - - .align-self-sm-stretch { - align-self: stretch !important - } - -} - -@media (min-width:768px) { - .flex-md-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-md-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-md-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-md-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-md-wrap { - flex-wrap: wrap !important - } - - .flex-md-nowrap { - flex-wrap: nowrap !important - } - - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-md-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-md-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-md-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-md-shrink-0 { - flex-shrink: 0 !important - } - - .flex-md-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-md-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-md-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-md-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-md-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-md-around { - justify-content: space-around !important - } - - .align-items-md-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-md-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-md-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-md-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-md-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-md-start { - align-content: flex-start !important - } - - .align-content-md-end { - align-content: flex-end !important - } - - .align-content-md-center { - align-content: center !important - } - - .align-content-md-between { - align-content: space-between !important - } - - .align-content-md-around { - align-content: space-around !important - } - - .align-content-md-stretch { - align-content: stretch !important - } - - .align-self-md-auto { - align-self: auto !important - } - - .align-self-md-start { - align-self: flex-start !important - } - - .align-self-md-end { - align-self: flex-end !important - } - - .align-self-md-center { - align-self: center !important - } - - .align-self-md-baseline { - align-self: baseline !important - } - - .align-self-md-stretch { - align-self: stretch !important - } - -} - -@media (min-width:992px) { - .flex-lg-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-lg-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-lg-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-lg-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-lg-wrap { - flex-wrap: wrap !important - } - - .flex-lg-nowrap { - flex-wrap: nowrap !important - } - - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-lg-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-lg-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-lg-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-lg-shrink-0 { - flex-shrink: 0 !important - } - - .flex-lg-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-lg-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-lg-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-lg-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-lg-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-lg-around { - justify-content: space-around !important - } - - .align-items-lg-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-lg-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-lg-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-lg-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-lg-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-lg-start { - align-content: flex-start !important - } - - .align-content-lg-end { - align-content: flex-end !important - } - - .align-content-lg-center { - align-content: center !important - } - - .align-content-lg-between { - align-content: space-between !important - } - - .align-content-lg-around { - align-content: space-around !important - } - - .align-content-lg-stretch { - align-content: stretch !important - } - - .align-self-lg-auto { - align-self: auto !important - } - - .align-self-lg-start { - align-self: flex-start !important - } - - .align-self-lg-end { - align-self: flex-end !important - } - - .align-self-lg-center { - align-self: center !important - } - - .align-self-lg-baseline { - align-self: baseline !important - } - - .align-self-lg-stretch { - align-self: stretch !important - } - -} - -@media (min-width:1200px) { - .flex-xl-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-xl-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-xl-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-xl-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-xl-wrap { - flex-wrap: wrap !important - } - - .flex-xl-nowrap { - flex-wrap: nowrap !important - } - - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-xl-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-xl-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-xl-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-xl-shrink-0 { - flex-shrink: 0 !important - } - - .flex-xl-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-xl-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-xl-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-xl-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-xl-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-xl-around { - justify-content: space-around !important - } - - .align-items-xl-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-xl-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-xl-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-xl-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-xl-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-xl-start { - align-content: flex-start !important - } - - .align-content-xl-end { - align-content: flex-end !important - } - - .align-content-xl-center { - align-content: center !important - } - - .align-content-xl-between { - align-content: space-between !important - } - - .align-content-xl-around { - align-content: space-around !important - } - - .align-content-xl-stretch { - align-content: stretch !important - } - - .align-self-xl-auto { - align-self: auto !important - } - - .align-self-xl-start { - align-self: flex-start !important - } - - .align-self-xl-end { - align-self: flex-end !important - } - - .align-self-xl-center { - align-self: center !important - } - - .align-self-xl-baseline { - align-self: baseline !important - } - - .align-self-xl-stretch { - align-self: stretch !important - } - -} - -.float-left { - float: left !important -} - -.float-right { - float: right !important -} - -.float-none { - float: none !important -} - -@media (min-width:576px) { - .float-sm-left { - float: left !important - } - - .float-sm-right { - float: right !important - } - - .float-sm-none { - float: none !important - } - -} - -@media (min-width:768px) { - .float-md-left { - float: left !important - } - - .float-md-right { - float: right !important - } - - .float-md-none { - float: none !important - } - -} - -@media (min-width:992px) { - .float-lg-left { - float: left !important - } - - .float-lg-right { - float: right !important - } - - .float-lg-none { - float: none !important - } - -} - -@media (min-width:1200px) { - .float-xl-left { - float: left !important - } - - .float-xl-right { - float: right !important - } - - .float-xl-none { - float: none !important - } - -} - -.overflow-auto { - overflow: auto !important -} - -.overflow-hidden { - overflow: hidden !important -} - -.position-static { - position: static !important -} - -.position-relative { - position: relative !important -} - -.position-absolute { - position: absolute !important -} - -.position-fixed { - position: fixed !important -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030 -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030 -} - -@supports ((position:-webkit-sticky) or (position:sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020 - } - -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0 -} - -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal -} - -.shadow-sm { - box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important -} - -.shadow { - box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important -} - -.shadow-none { - box-shadow: none !important -} - -.w-25 { - width: 25% !important -} - -.w-50 { - width: 50% !important -} - -.w-75 { - width: 75% !important -} - -.w-100 { - width: 100% !important -} - -.w-auto { - width: auto !important -} - -.h-25 { - height: 25% !important -} - -.h-50 { - height: 50% !important -} - -.h-75 { - height: 75% !important -} - -.h-100 { - height: 100% !important -} - -.h-auto { - height: auto !important -} - -.mw-100 { - max-width: 100% !important -} - -.mh-100 { - max-height: 100% !important -} - -.min-vw-100 { - min-width: 100vw !important -} - -.min-vh-100 { - min-height: 100vh !important -} - -.vw-100 { - width: 100vw !important -} - -.vh-100 { - height: 100vh !important -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: '.5'; - background-color: rgba(0, 0, 0, 0) -} - -.m-0 { - margin: 0 !important -} - -.mt-0, -.my-0 { - margin-top: 0 !important -} - -.mr-0, -.mx-0 { - margin-right: 0 !important -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important -} - -.ml-0, -.mx-0 { - margin-left: 0 !important -} - -.m-1 { - margin: .25rem !important -} - -.mt-1, -.my-1 { - margin-top: .25rem !important -} - -.mr-1, -.mx-1 { - margin-right: .25rem !important -} - -.mb-1, -.my-1 { - margin-bottom: .25rem !important -} - -.ml-1, -.mx-1 { - margin-left: .25rem !important -} - -.m-2 { - margin: .5rem !important -} - -.mt-2, -.my-2 { - margin-top: .5rem !important -} - -.mr-2, -.mx-2 { - margin-right: .5rem !important -} - -.mb-2, -.my-2 { - margin-bottom: .5rem !important -} - -.ml-2, -.mx-2 { - margin-left: .5rem !important -} - -.m-3 { - margin: 1rem !important -} - -.mt-3, -.my-3 { - margin-top: 1rem !important -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important -} - -.m-4 { - margin: 1.5rem !important -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important -} - -.m-5 { - margin: 3rem !important -} - -.mt-5, -.my-5 { - margin-top: 3rem !important -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important -} - -.p-0 { - padding: 0 !important -} - -.pt-0, -.py-0 { - padding-top: 0 !important -} - -.pr-0, -.px-0 { - padding-right: 0 !important -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important -} - -.pl-0, -.px-0 { - padding-left: 0 !important -} - -.p-1 { - padding: .25rem !important -} - -.pt-1, -.py-1 { - padding-top: .25rem !important -} - -.pr-1, -.px-1 { - padding-right: .25rem !important -} - -.pb-1, -.py-1 { - padding-bottom: .25rem !important -} - -.pl-1, -.px-1 { - padding-left: .25rem !important -} - -.p-2 { - padding: .5rem !important -} - -.pt-2, -.py-2 { - padding-top: .5rem !important -} - -.pr-2, -.px-2 { - padding-right: .5rem !important -} - -.pb-2, -.py-2 { - padding-bottom: .5rem !important -} - -.pl-2, -.px-2 { - padding-left: .5rem !important -} - -.p-3 { - padding: 1rem !important -} - -.pt-3, -.py-3 { - padding-top: 1rem !important -} - -.pr-3, -.px-3 { - padding-right: 1rem !important -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important -} - -.pl-3, -.px-3 { - padding-left: 1rem !important -} - -.p-4 { - padding: 1.5rem !important -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important -} - -.p-5 { - padding: 3rem !important -} - -.pt-5, -.py-5 { - padding-top: 3rem !important -} - -.pr-5, -.px-5 { - padding-right: 3rem !important -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important -} - -.pl-5, -.px-5 { - padding-left: 3rem !important -} - -.m-n1 { - margin: -.25rem !important -} - -.mt-n1, -.my-n1 { - margin-top: -.25rem !important -} - -.mr-n1, -.mx-n1 { - margin-right: -.25rem !important -} - -.mb-n1, -.my-n1 { - margin-bottom: -.25rem !important -} - -.ml-n1, -.mx-n1 { - margin-left: -.25rem !important -} - -.m-n2 { - margin: -.5rem !important -} - -.mt-n2, -.my-n2 { - margin-top: -.5rem !important -} - -.mr-n2, -.mx-n2 { - margin-right: -.5rem !important -} - -.mb-n2, -.my-n2 { - margin-bottom: -.5rem !important -} - -.ml-n2, -.mx-n2 { - margin-left: -.5rem !important -} - -.m-n3 { - margin: -1rem !important -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important -} - -.m-n4 { - margin: -1.5rem !important -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important -} - -.m-n5 { - margin: -3rem !important -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important -} - -.m-auto { - margin: auto !important -} - -.mt-auto, -.my-auto { - margin-top: auto !important -} - -.mr-auto, -.mx-auto { - margin-right: auto !important -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important -} - -.ml-auto, -.mx-auto { - margin-left: auto !important -} - -@media (min-width:576px) { - .m-sm-0 { - margin: 0 !important - } - - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important - } - - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important - } - - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important - } - - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important - } - - .m-sm-1 { - margin: .25rem !important - } - - .mt-sm-1, - .my-sm-1 { - margin-top: .25rem !important - } - - .mr-sm-1, - .mx-sm-1 { - margin-right: .25rem !important - } - - .mb-sm-1, - .my-sm-1 { - margin-bottom: .25rem !important - } - - .ml-sm-1, - .mx-sm-1 { - margin-left: .25rem !important - } - - .m-sm-2 { - margin: .5rem !important - } - - .mt-sm-2, - .my-sm-2 { - margin-top: .5rem !important - } - - .mr-sm-2, - .mx-sm-2 { - margin-right: .5rem !important - } - - .mb-sm-2, - .my-sm-2 { - margin-bottom: .5rem !important - } - - .ml-sm-2, - .mx-sm-2 { - margin-left: .5rem !important - } - - .m-sm-3 { - margin: 1rem !important - } - - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important - } - - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important - } - - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important - } - - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important - } - - .m-sm-4 { - margin: 1.5rem !important - } - - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important - } - - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important - } - - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important - } - - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important - } - - .m-sm-5 { - margin: 3rem !important - } - - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important - } - - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important - } - - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important - } - - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important - } - - .p-sm-0 { - padding: 0 !important - } - - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important - } - - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important - } - - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important - } - - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important - } - - .p-sm-1 { - padding: .25rem !important - } - - .pt-sm-1, - .py-sm-1 { - padding-top: .25rem !important - } - - .pr-sm-1, - .px-sm-1 { - padding-right: .25rem !important - } - - .pb-sm-1, - .py-sm-1 { - padding-bottom: .25rem !important - } - - .pl-sm-1, - .px-sm-1 { - padding-left: .25rem !important - } - - .p-sm-2 { - padding: .5rem !important - } - - .pt-sm-2, - .py-sm-2 { - padding-top: .5rem !important - } - - .pr-sm-2, - .px-sm-2 { - padding-right: .5rem !important - } - - .pb-sm-2, - .py-sm-2 { - padding-bottom: .5rem !important - } - - .pl-sm-2, - .px-sm-2 { - padding-left: .5rem !important - } - - .p-sm-3 { - padding: 1rem !important - } - - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important - } - - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important - } - - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important - } - - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important - } - - .p-sm-4 { - padding: 1.5rem !important - } - - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important - } - - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important - } - - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important - } - - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important - } - - .p-sm-5 { - padding: 3rem !important - } - - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important - } - - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important - } - - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important - } - - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important - } - - .m-sm-n1 { - margin: -.25rem !important - } - - .mt-sm-n1, - .my-sm-n1 { - margin-top: -.25rem !important - } - - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -.25rem !important - } - - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -.25rem !important - } - - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -.25rem !important - } - - .m-sm-n2 { - margin: -.5rem !important - } - - .mt-sm-n2, - .my-sm-n2 { - margin-top: -.5rem !important - } - - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -.5rem !important - } - - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -.5rem !important - } - - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -.5rem !important - } - - .m-sm-n3 { - margin: -1rem !important - } - - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important - } - - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important - } - - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important - } - - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important - } - - .m-sm-n4 { - margin: -1.5rem !important - } - - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important - } - - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important - } - - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important - } - - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important - } - - .m-sm-n5 { - margin: -3rem !important - } - - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important - } - - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important - } - - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important - } - - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important - } - - .m-sm-auto { - margin: auto !important - } - - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important - } - - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important - } - - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important - } - - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important - } - -} - -@media (min-width:768px) { - .m-md-0 { - margin: 0 !important - } - - .mt-md-0, - .my-md-0 { - margin-top: 0 !important - } - - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important - } - - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important - } - - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important - } - - .m-md-1 { - margin: .25rem !important - } - - .mt-md-1, - .my-md-1 { - margin-top: .25rem !important - } - - .mr-md-1, - .mx-md-1 { - margin-right: .25rem !important - } - - .mb-md-1, - .my-md-1 { - margin-bottom: .25rem !important - } - - .ml-md-1, - .mx-md-1 { - margin-left: .25rem !important - } - - .m-md-2 { - margin: .5rem !important - } - - .mt-md-2, - .my-md-2 { - margin-top: .5rem !important - } - - .mr-md-2, - .mx-md-2 { - margin-right: .5rem !important - } - - .mb-md-2, - .my-md-2 { - margin-bottom: .5rem !important - } - - .ml-md-2, - .mx-md-2 { - margin-left: .5rem !important - } - - .m-md-3 { - margin: 1rem !important - } - - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important - } - - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important - } - - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important - } - - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important - } - - .m-md-4 { - margin: 1.5rem !important - } - - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important - } - - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important - } - - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important - } - - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important - } - - .m-md-5 { - margin: 3rem !important - } - - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important - } - - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important - } - - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important - } - - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important - } - - .p-md-0 { - padding: 0 !important - } - - .pt-md-0, - .py-md-0 { - padding-top: 0 !important - } - - .pr-md-0, - .px-md-0 { - padding-right: 0 !important - } - - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important - } - - .pl-md-0, - .px-md-0 { - padding-left: 0 !important - } - - .p-md-1 { - padding: .25rem !important - } - - .pt-md-1, - .py-md-1 { - padding-top: .25rem !important - } - - .pr-md-1, - .px-md-1 { - padding-right: .25rem !important - } - - .pb-md-1, - .py-md-1 { - padding-bottom: .25rem !important - } - - .pl-md-1, - .px-md-1 { - padding-left: .25rem !important - } - - .p-md-2 { - padding: .5rem !important - } - - .pt-md-2, - .py-md-2 { - padding-top: .5rem !important - } - - .pr-md-2, - .px-md-2 { - padding-right: .5rem !important - } - - .pb-md-2, - .py-md-2 { - padding-bottom: .5rem !important - } - - .pl-md-2, - .px-md-2 { - padding-left: .5rem !important - } - - .p-md-3 { - padding: 1rem !important - } - - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important - } - - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important - } - - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important - } - - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important - } - - .p-md-4 { - padding: 1.5rem !important - } - - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important - } - - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important - } - - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important - } - - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important - } - - .p-md-5 { - padding: 3rem !important - } - - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important - } - - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important - } - - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important - } - - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important - } - - .m-md-n1 { - margin: -.25rem !important - } - - .mt-md-n1, - .my-md-n1 { - margin-top: -.25rem !important - } - - .mr-md-n1, - .mx-md-n1 { - margin-right: -.25rem !important - } - - .mb-md-n1, - .my-md-n1 { - margin-bottom: -.25rem !important - } - - .ml-md-n1, - .mx-md-n1 { - margin-left: -.25rem !important - } - - .m-md-n2 { - margin: -.5rem !important - } - - .mt-md-n2, - .my-md-n2 { - margin-top: -.5rem !important - } - - .mr-md-n2, - .mx-md-n2 { - margin-right: -.5rem !important - } - - .mb-md-n2, - .my-md-n2 { - margin-bottom: -.5rem !important - } - - .ml-md-n2, - .mx-md-n2 { - margin-left: -.5rem !important - } - - .m-md-n3 { - margin: -1rem !important - } - - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important - } - - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important - } - - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important - } - - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important - } - - .m-md-n4 { - margin: -1.5rem !important - } - - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important - } - - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important - } - - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important - } - - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important - } - - .m-md-n5 { - margin: -3rem !important - } - - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important - } - - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important - } - - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important - } - - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important - } - - .m-md-auto { - margin: auto !important - } - - .mt-md-auto, - .my-md-auto { - margin-top: auto !important - } - - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important - } - - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important - } - - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important - } - -} - -@media (min-width:992px) { - .m-lg-0 { - margin: 0 !important - } - - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important - } - - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important - } - - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important - } - - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important - } - - .m-lg-1 { - margin: .25rem !important - } - - .mt-lg-1, - .my-lg-1 { - margin-top: .25rem !important - } - - .mr-lg-1, - .mx-lg-1 { - margin-right: .25rem !important - } - - .mb-lg-1, - .my-lg-1 { - margin-bottom: .25rem !important - } - - .ml-lg-1, - .mx-lg-1 { - margin-left: .25rem !important - } - - .m-lg-2 { - margin: .5rem !important - } - - .mt-lg-2, - .my-lg-2 { - margin-top: .5rem !important - } - - .mr-lg-2, - .mx-lg-2 { - margin-right: .5rem !important - } - - .mb-lg-2, - .my-lg-2 { - margin-bottom: .5rem !important - } - - .ml-lg-2, - .mx-lg-2 { - margin-left: .5rem !important - } - - .m-lg-3 { - margin: 1rem !important - } - - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important - } - - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important - } - - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important - } - - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important - } - - .m-lg-4 { - margin: 1.5rem !important - } - - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important - } - - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important - } - - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important - } - - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important - } - - .m-lg-5 { - margin: 3rem !important - } - - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important - } - - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important - } - - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important - } - - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important - } - - .p-lg-0 { - padding: 0 !important - } - - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important - } - - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important - } - - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important - } - - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important - } - - .p-lg-1 { - padding: .25rem !important - } - - .pt-lg-1, - .py-lg-1 { - padding-top: .25rem !important - } - - .pr-lg-1, - .px-lg-1 { - padding-right: .25rem !important - } - - .pb-lg-1, - .py-lg-1 { - padding-bottom: .25rem !important - } - - .pl-lg-1, - .px-lg-1 { - padding-left: .25rem !important - } - - .p-lg-2 { - padding: .5rem !important - } - - .pt-lg-2, - .py-lg-2 { - padding-top: .5rem !important - } - - .pr-lg-2, - .px-lg-2 { - padding-right: .5rem !important - } - - .pb-lg-2, - .py-lg-2 { - padding-bottom: .5rem !important - } - - .pl-lg-2, - .px-lg-2 { - padding-left: .5rem !important - } - - .p-lg-3 { - padding: 1rem !important - } - - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important - } - - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important - } - - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important - } - - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important - } - - .p-lg-4 { - padding: 1.5rem !important - } - - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important - } - - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important - } - - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important - } - - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important - } - - .p-lg-5 { - padding: 3rem !important - } - - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important - } - - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important - } - - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important - } - - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important - } - - .m-lg-n1 { - margin: -.25rem !important - } - - .mt-lg-n1, - .my-lg-n1 { - margin-top: -.25rem !important - } - - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -.25rem !important - } - - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -.25rem !important - } - - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -.25rem !important - } - - .m-lg-n2 { - margin: -.5rem !important - } - - .mt-lg-n2, - .my-lg-n2 { - margin-top: -.5rem !important - } - - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -.5rem !important - } - - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -.5rem !important - } - - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -.5rem !important - } - - .m-lg-n3 { - margin: -1rem !important - } - - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important - } - - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important - } - - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important - } - - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important - } - - .m-lg-n4 { - margin: -1.5rem !important - } - - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important - } - - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important - } - - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important - } - - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important - } - - .m-lg-n5 { - margin: -3rem !important - } - - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important - } - - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important - } - - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important - } - - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important - } - - .m-lg-auto { - margin: auto !important - } - - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important - } - - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important - } - - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important - } - - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important - } - -} - -@media (min-width:1200px) { - .m-xl-0 { - margin: 0 !important - } - - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important - } - - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important - } - - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important - } - - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important - } - - .m-xl-1 { - margin: .25rem !important - } - - .mt-xl-1, - .my-xl-1 { - margin-top: .25rem !important - } - - .mr-xl-1, - .mx-xl-1 { - margin-right: .25rem !important - } - - .mb-xl-1, - .my-xl-1 { - margin-bottom: .25rem !important - } - - .ml-xl-1, - .mx-xl-1 { - margin-left: .25rem !important - } - - .m-xl-2 { - margin: .5rem !important - } - - .mt-xl-2, - .my-xl-2 { - margin-top: .5rem !important - } - - .mr-xl-2, - .mx-xl-2 { - margin-right: .5rem !important - } - - .mb-xl-2, - .my-xl-2 { - margin-bottom: .5rem !important - } - - .ml-xl-2, - .mx-xl-2 { - margin-left: .5rem !important - } - - .m-xl-3 { - margin: 1rem !important - } - - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important - } - - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important - } - - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important - } - - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important - } - - .m-xl-4 { - margin: 1.5rem !important - } - - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important - } - - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important - } - - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important - } - - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important - } - - .m-xl-5 { - margin: 3rem !important - } - - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important - } - - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important - } - - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important - } - - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important - } - - .p-xl-0 { - padding: 0 !important - } - - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important - } - - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important - } - - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important - } - - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important - } - - .p-xl-1 { - padding: .25rem !important - } - - .pt-xl-1, - .py-xl-1 { - padding-top: .25rem !important - } - - .pr-xl-1, - .px-xl-1 { - padding-right: .25rem !important - } - - .pb-xl-1, - .py-xl-1 { - padding-bottom: .25rem !important - } - - .pl-xl-1, - .px-xl-1 { - padding-left: .25rem !important - } - - .p-xl-2 { - padding: .5rem !important - } - - .pt-xl-2, - .py-xl-2 { - padding-top: .5rem !important - } - - .pr-xl-2, - .px-xl-2 { - padding-right: .5rem !important - } - - .pb-xl-2, - .py-xl-2 { - padding-bottom: .5rem !important - } - - .pl-xl-2, - .px-xl-2 { - padding-left: .5rem !important - } - - .p-xl-3 { - padding: 1rem !important - } - - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important - } - - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important - } - - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important - } - - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important - } - - .p-xl-4 { - padding: 1.5rem !important - } - - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important - } - - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important - } - - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important - } - - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important - } - - .p-xl-5 { - padding: 3rem !important - } - - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important - } - - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important - } - - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important - } - - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important - } - - .m-xl-n1 { - margin: -.25rem !important - } - - .mt-xl-n1, - .my-xl-n1 { - margin-top: -.25rem !important - } - - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -.25rem !important - } - - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -.25rem !important - } - - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -.25rem !important - } - - .m-xl-n2 { - margin: -.5rem !important - } - - .mt-xl-n2, - .my-xl-n2 { - margin-top: -.5rem !important - } - - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -.5rem !important - } - - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -.5rem !important - } - - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -.5rem !important - } - - .m-xl-n3 { - margin: -1rem !important - } - - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important - } - - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important - } - - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important - } - - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important - } - - .m-xl-n4 { - margin: -1.5rem !important - } - - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important - } - - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important - } - - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important - } - - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important - } - - .m-xl-n5 { - margin: -3rem !important - } - - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important - } - - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important - } - - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important - } - - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important - } - - .m-xl-auto { - margin: auto !important - } - - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important - } - - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important - } - - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important - } - - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important - } - -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important -} - -.text-justify { - text-align: justify !important -} - -.text-wrap { - white-space: normal !important -} - -.text-nowrap { - white-space: nowrap !important -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap -} - -.text-left { - text-align: left !important -} - -.text-right { - text-align: right !important -} - -.text-center { - text-align: center !important -} - -@media (min-width:576px) { - .text-sm-left { - text-align: left !important - } - - .text-sm-right { - text-align: right !important - } - - .text-sm-center { - text-align: center !important - } - -} - -@media (min-width:768px) { - .text-md-left { - text-align: left !important - } - - .text-md-right { - text-align: right !important - } - - .text-md-center { - text-align: center !important - } - -} - -@media (min-width:992px) { - .text-lg-left { - text-align: left !important - } - - .text-lg-right { - text-align: right !important - } - - .text-lg-center { - text-align: center !important - } - -} - -@media (min-width:1200px) { - .text-xl-left { - text-align: left !important - } - - .text-xl-right { - text-align: right !important - } - - .text-xl-center { - text-align: center !important - } - -} - -.text-lowercase { - text-transform: lowercase !important -} - -.text-uppercase { - text-transform: uppercase !important -} - -.text-capitalize { - text-transform: capitalize !important -} - -.font-weight-light { - font-weight: 300 !important -} - -.font-weight-lighter { - font-weight: lighter !important -} - -.font-weight-normal { - font-weight: 400 !important -} - -.font-weight-bold { - font-weight: 700 !important -} - -.font-weight-bolder { - font-weight: bolder !important -} - -.font-italic { - font-style: italic !important -} - -.text-white { - color: #fff !important -} - -.text-primary { - color: #047006 !important -} - -a.text-primary:focus, -a.text-primary:hover { - color: #012602 !important -} - -.text-secondary { - color: grey !important -} - -a.text-secondary:focus, -a.text-secondary:hover { - color: #5a5a5a !important -} - -.text-success { - color: #00e093 !important -} - -a.text-success:focus, -a.text-success:hover { - color: #009461 !important -} - -.text-info { - color: #6c61f6 !important -} - -a.text-info:focus, -a.text-info:hover { - color: #2919f2 !important -} - -.text-warning { - color: #f0825f !important -} - -a.text-warning:focus, -a.text-warning:hover { - color: #e94b19 !important -} - -.text-danger { - color: #ff5f66 !important -} - -a.text-danger:focus, -a.text-danger:hover { - color: #ff131d !important -} - -.text-light { - color: #dfdfdf !important -} - -a.text-light:focus, -a.text-light:hover { - color: #b9b9b9 !important -} - -.text-dark { - color: #74767b !important -} - -a.text-dark:focus, -a.text-dark:hover { - color: #4f5054 !important -} - -.text-white { - color: #fff !important -} - -a.text-white:focus, -a.text-white:hover { - color: #d9d9d9 !important -} - -.text-orange { - color: #ffa600 !important -} - -a.text-orange:focus, -a.text-orange:hover { - color: #b37400 !important -} - -.text-body { - color: #212529 !important -} - -.text-muted { - color: #adb5bd !important -} - -.text-black-50 { - color: rgba(0, 0, 0, .5) !important -} - -.text-white-50 { - color: rgba(255, 255, 255, .5) !important -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0 -} - -.text-decoration-none { - text-decoration: none !important -} - -.text-break { - word-break: break-word !important; - overflow-wrap: break-word !important -} - -.text-reset { - color: inherit !important -} - -.visible { - visibility: visible !important -} - -.invisible { - visibility: hidden !important -} - -@media print { - *, - ::after, - ::before { - text-shadow: none !important; - box-shadow: none !important - } - - a:not(.btn) { - text-decoration: underline - } - - abbr[title]::after { - content: '3'attr(title) ")" - } - - pre { - white-space: pre-wrap !important - } - - blockquote, - pre { - border: 1px solid #adb5bd; - page-break-inside: avoid - } - - thead { - display: table-header-group - } - - img, - tr { - page-break-inside: avoid - } - - h2, - h3, - p { - orphans: 3; - widows: 3 - } - - h2, - h3 { - page-break-after: avoid - } - - @page { - size: a3 - } - - body { - min-width: 992px !important - } - - .container { - min-width: 992px !important - } - - .navbar { - display: none - } - - .badge { - border: 1px solid #000 - } - - .table { - border-collapse: collapse !important - } - - .table td, - .table th { - background-color: #fff !important - } - - .table-bordered td, - .table-bordered th { - border: 1px solid #dee2e6 !important - } - - .table-dark { - color: inherit - } - - .table-dark tbody+tbody, - .table-dark td, - .table-dark th, - .table-dark thead th { - border-color: #f2f4f9 - } - - .table .thead-dark th { - color: inherit; - border-color: #f2f4f9 - } - -} - -.dev-info { - position: fixed; - color: grey; - font-size: smaller; - left: 8px; - z-index: 120 -} - -.versionstring { - top: 70px; - right: 8px; - left: auto -} - -.grd-time-used { - bottom: 0 -} - -footer { - position: absolute; - bottom: 0; - left: 0; - right: 0; - padding: 2rem 2.5rem; - max-width: 1140px; - margin-left: auto; - margin-right: auto -} - -@media (max-width:991.98px) { - footer { - padding: 20px 0 30px 0 - } - -} - -footer ul { - margin-left: 0; - padding-left: 0 -} - -footer ul li { - display: inline-block; - padding: 0 10px 0 0; - line-height: 1 -} - -footer ul li:not(:last-child) { - margin-right: 10px; - border-right: 1px solid #f2f4f9 -} - -footer ul li a { - font-size: 14px; - font-family: Roboto, sans-serif; - font-weight: 400; - letter-spacing: .03rem; - color: #565656 -} - -@media (min-width:768px) and (max-width:991px) { - footer ul li a { - font-size: calc(14px + 0 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - footer ul li a { - font-size: calc(14px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - footer ul li a { - font-size: 13px - } - -} - -.alert { - border: none; - font-size: 14px; - font-family: Roboto, sans-serif; - font-weight: 400 -} - -@media (min-width:768px) and (max-width:991px) { - .alert { - font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .alert { - font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .alert { - font-size: 14px - } - -} - -.alert .alert-heading { - margin-top: 20px; - margin-bottom: 10px -} - -.alert .btn-dismmiss { - margin-top: 20px -} - -.alert.dismissible-alert { - position: relative; - padding-right: 40px -} - -.alert.dismissible-alert .alert-close { - position: absolute; - top: 0; - right: 0; - bottom: 0; - padding: 10px; - font-size: 18px; - display: -webkit-box; - display: flex; - cursor: pointer; - height: inherit; - -webkit-box-align: center; - align-items: center -} - -.alert-notification-wrapper { - position: fixed; - left: 17rem; - right: 0; - z-index: 999 -} - -@media (max-width:991.98px) { - .alert-notification-wrapper { - left: 0 - } - -} - -.alert-notification-wrapper.top { - top: 70px -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter { - border: 2px solid #55acee; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter i { - color: #55acee -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link { - background: 0 0; - color: #55acee -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link:hover { - color: #2795e9 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook { - border: 2px solid #0084ff; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook i { - color: #0084ff -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link { - background: 0 0; - color: #0084ff -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link:hover { - color: #006acc -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google { - border: 2px solid #dd4b39; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google i { - color: #dd4b39 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link { - background: 0 0; - color: #dd4b39 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link:hover { - color: #c23321 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin { - border: 2px solid #0077b5; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin i { - color: #0077b5 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link { - background: 0 0; - color: #0077b5 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link:hover { - color: #005582 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest { - border: 2px solid #bd081c; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest i { - color: #bd081c -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link { - background: 0 0; - color: #bd081c -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link:hover { - color: #8c0615 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube { - border: 2px solid #cd201f; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube i { - color: #cd201f -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link { - background: 0 0; - color: #cd201f -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link:hover { - color: #a11918 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github { - border: 2px solid #333; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github i { - color: #333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link { - background: 0 0; - color: #333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link:hover { - color: #1a1a1a -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance { - border: 2px solid #0454f6; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance i { - color: #0454f6 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link { - background: 0 0; - color: #0454f6 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link:hover { - color: #0343c4 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble { - border: 2px solid #ea4c89; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble i { - color: #ea4c89 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link { - background: 0 0; - color: #ea4c89 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link:hover { - color: #e51e6b -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit { - border: 2px solid #ed4333; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit i { - color: #ed4333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link { - background: 0 0; - color: #ed4333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link:hover { - color: #da2413 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram { - border: 2px solid #ff759b; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram i { - color: #ff759b -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link { - background: 0 0; - color: #ff759b -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link:hover { - color: #ff4276 -} - -.btn-inverse-primary { - background: rgba(4, 112, 6, .15); - color: #047006 -} - -.btn-inverse-primary i { - color: inherit -} - -.btn-inverse-primary:hover { - background: rgba(4, 112, 6, .8); - color: #fff -} - -.btn-inverse-secondary { - background: rgba(128, 128, 128, .15); - color: grey -} - -.btn-inverse-secondary i { - color: inherit -} - -.btn-inverse-secondary:hover { - background: rgba(128, 128, 128, .8); - color: #fff -} - -.btn-inverse-success { - background: rgba(0, 224, 147, .15); - color: #00e093 -} - -.btn-inverse-success i { - color: inherit -} - -.btn-inverse-success:hover { - background: rgba(0, 224, 147, .8); - color: #fff -} - -.btn-inverse-info { - background: rgba(108, 97, 246, .15); - color: #6c61f6 -} - -.btn-inverse-info i { - color: inherit -} - -.btn-inverse-info:hover { - background: rgba(108, 97, 246, .8); - color: #fff -} - -.btn-inverse-warning { - background: rgba(240, 130, 95, .15); - color: #f0825f -} - -.btn-inverse-warning i { - color: inherit -} - -.btn-inverse-warning:hover { - background: rgba(240, 130, 95, .8); - color: #fff -} - -.btn-inverse-danger { - background: rgba(255, 95, 102, .15); - color: #ff5f66 -} - -.btn-inverse-danger i { - color: inherit -} - -.btn-inverse-danger:hover { - background: rgba(255, 95, 102, .8); - color: #fff -} - -.btn-inverse-light { - background: rgba(223, 223, 223, .15); - color: #dfdfdf -} - -.btn-inverse-light i { - color: inherit -} - -.btn-inverse-light:hover { - background: rgba(223, 223, 223, .8); - color: #fff -} - -.btn-inverse-dark { - background: rgba(116, 118, 123, .15); - color: #74767b -} - -.btn-inverse-dark i { - color: inherit -} - -.btn-inverse-dark:hover { - background: rgba(116, 118, 123, .8); - color: #fff -} - -.btn-inverse-white { - background: rgba(255, 255, 255, .15); - color: #fff -} - -.btn-inverse-white i { - color: inherit -} - -.btn-inverse-white:hover { - background: rgba(255, 255, 255, .8); - color: #fff -} - -.btn-inverse-orange { - background: rgba(255, 166, 0, .15); - color: #ffa600 -} - -.btn-inverse-orange i { - color: inherit -} - -.btn-inverse-orange:hover { - background: rgba(255, 166, 0, .8); - color: #fff -} - -.btn:not(.social-btn-outlined).btn-twitter { - background: #55acee; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-twitter:hover { - background: #2795e9 -} - -.btn:not(.social-btn-outlined).btn-twitter.btn-link { - background: 0 0; - color: #55acee -} - -.btn:not(.social-btn-outlined).btn-twitter.btn-link:hover { - color: #2795e9 -} - -.btn:not(.social-btn-outlined).btn-facebook { - background: #0084ff; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-facebook:hover { - background: #006acc -} - -.btn:not(.social-btn-outlined).btn-facebook.btn-link { - background: 0 0; - color: #0084ff -} - -.btn:not(.social-btn-outlined).btn-facebook.btn-link:hover { - color: #006acc -} - -.btn:not(.social-btn-outlined).btn-google { - background: #dd4b39; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-google:hover { - background: #c23321 -} - -.btn:not(.social-btn-outlined).btn-google.btn-link { - background: 0 0; - color: #dd4b39 -} - -.btn:not(.social-btn-outlined).btn-google.btn-link:hover { - color: #c23321 -} - -.btn:not(.social-btn-outlined).btn-linkedin { - background: #0077b5; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-linkedin:hover { - background: #005582 -} - -.btn:not(.social-btn-outlined).btn-linkedin.btn-link { - background: 0 0; - color: #0077b5 -} - -.btn:not(.social-btn-outlined).btn-linkedin.btn-link:hover { - color: #005582 -} - -.btn:not(.social-btn-outlined).btn-pinterest { - background: #bd081c; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-pinterest:hover { - background: #8c0615 -} - -.btn:not(.social-btn-outlined).btn-pinterest.btn-link { - background: 0 0; - color: #bd081c -} - -.btn:not(.social-btn-outlined).btn-pinterest.btn-link:hover { - color: #8c0615 -} - -.btn:not(.social-btn-outlined).btn-youtube { - background: #cd201f; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-youtube:hover { - background: #a11918 -} - -.btn:not(.social-btn-outlined).btn-youtube.btn-link { - background: 0 0; - color: #cd201f -} - -.btn:not(.social-btn-outlined).btn-youtube.btn-link:hover { - color: #a11918 -} - -.btn:not(.social-btn-outlined).btn-github { - background: #333; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-github:hover { - background: #1a1a1a -} - -.btn:not(.social-btn-outlined).btn-github.btn-link { - background: 0 0; - color: #333 -} - -.btn:not(.social-btn-outlined).btn-github.btn-link:hover { - color: #1a1a1a -} - -.btn:not(.social-btn-outlined).btn-behance { - background: #0454f6; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-behance:hover { - background: #0343c4 -} - -.btn:not(.social-btn-outlined).btn-behance.btn-link { - background: 0 0; - color: #0454f6 -} - -.btn:not(.social-btn-outlined).btn-behance.btn-link:hover { - color: #0343c4 -} - -.btn:not(.social-btn-outlined).btn-dribbble { - background: #ea4c89; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-dribbble:hover { - background: #e51e6b -} - -.btn:not(.social-btn-outlined).btn-dribbble.btn-link { - background: 0 0; - color: #ea4c89 -} - -.btn:not(.social-btn-outlined).btn-dribbble.btn-link:hover { - color: #e51e6b -} - -.btn:not(.social-btn-outlined).btn-reddit { - background: #ed4333; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-reddit:hover { - background: #da2413 -} - -.btn:not(.social-btn-outlined).btn-reddit.btn-link { - background: 0 0; - color: #ed4333 -} - -.btn:not(.social-btn-outlined).btn-reddit.btn-link:hover { - color: #da2413 -} - -.btn:not(.social-btn-outlined).btn-instagram { - background: #ff759b; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-instagram:hover { - background: #ff4276 -} - -.btn:not(.social-btn-outlined).btn-instagram.btn-link { - background: 0 0; - color: #ff759b -} - -.btn:not(.social-btn-outlined).btn-instagram.btn-link:hover { - color: #ff4276 -} - -.btn-group label.btn.btn-primary:not(:disabled):not(.disabled).active { - background: #000e01 -} - -.btn-group label.btn.btn-secondary:not(:disabled):not(.disabled).active { - background: #4d4d4d -} - -.btn-group label.btn.btn-success:not(:disabled):not(.disabled).active { - background: #007a50 -} - -.btn-group label.btn.btn-info:not(:disabled):not(.disabled).active { - background: #1d0de4 -} - -.btn-group label.btn.btn-warning:not(:disabled):not(.disabled).active { - background: #d54314 -} - -.btn-group label.btn.btn-danger:not(:disabled):not(.disabled).active { - background: #f8000b -} - -.btn-group label.btn.btn-light:not(:disabled):not(.disabled).active { - background: #acacac -} - -.btn-group label.btn.btn-dark:not(:disabled):not(.disabled).active { - background: #424447 -} - -.btn-group label.btn.btn-white:not(:disabled):not(.disabled).active { - background: #ccc -} - -.btn-group label.btn.btn-orange:not(:disabled):not(.disabled).active { - background: #996400 -} - -.btn-outline-primary { - border: 2px solid #047006 -} - -.btn-outline-secondary { - border: 2px solid grey -} - -.btn-outline-success { - border: 2px solid #00e093 -} - -.btn-outline-info { - border: 2px solid #6c61f6 -} - -.btn-outline-warning { - border: 2px solid #f0825f -} - -.btn-outline-danger { - border: 2px solid #ff5f66 -} - -.btn-outline-light { - border: 2px solid #dfdfdf -} - -.btn-outline-dark { - border: 2px solid #74767b -} - -.btn-outline-white { - border: 2px solid #fff -} - -.btn-outline-orange { - border: 2px solid #ffa600 -} - -.btn-group label.btn input { - display: none -} - -.btn { - display: -webkit-inline-box; - display: inline-flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - -webkit-transition: .3s ease; - transition: .3s ease; - -webkit-transition-property: background, color; - transition-property: background, color; - font-size: .875rem; - font-family: Roboto, sans-serif; - font-weight: 600; - letter-spacing: .03rem -} - -.btn:not([class*=btn-inverse]):not(.component-flat) { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) -} - -.btn i { - font-size: 1.25rem -} - -.btn-group-lg>.btn, -.btn.btn-lg { - height: 55px; - max-height: 55px; - padding: 15px 30px; - font-size: 1.125rem -} - -.btn-group-sm>.btn, -.btn.btn-sm { - height: 35px; - max-height: 35px; - padding: 4px 15px; - font-size: .875rem -} - -.btn.btn-xs { - height: 25px; - max-height: 25px; - padding: 0 10px; - line-height: 1; - font-size: .75rem -} - -.btn.btn-xs.has-icon i, -.btn.btn-xs.has-icon span { - font-size: .8125rem; - margin-right: 5px -} - -.btn { - height: 40px; - max-height: 40px; - padding: 5px 20px -} - -.btn.active { - box-shadow: none -} - -.btn.social-icon-btn { - height: 40px; - width: 40px -} - -.btn.social-btn i { - margin-right: 10px -} - -.btn.social-btn-outlined i { - margin-right: 10px -} - -.btn.has-icon i, -.btn.has-icon span { - font-size: 1.25rem; - margin-right: 10px; - line-height: 1 -} - -.btn.btn-outline-secondary { - color: #1a1a1a; - border-color: #676767 -} - -.btn.btn-info, -.btn.btn-warning { - color: #fff -} - -.btn.btn-light { - background: #fff; - color: #000 -} - -.btn.dropdown-dotted-list { - background: #fff -} - -.btn.dropdown-toggle-split { - padding: 0 8px -} - -.btn.action-btn { - display: -webkit-inline-box; - display: inline-flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - padding: 0; - height: 40px; - width: 40px -} - -.btn.action-btn i { - font-size: 1.25rem; - width: 26px; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - line-height: 23px; - vertical-align: middle; - font-size: 1.25rem -} - -.btn.action-btn i:before { - width: inherit; - height: inherit; - line-height: inherit; - font-size: inherit -} - -.btn.action-btn.btn-xs { - height: 30px; - width: 30px -} - -.btn-group-sm>.btn.action-btn, -.btn.action-btn.btn-sm { - height: 35px; - width: 35px -} - -.btn-group-lg>.btn.action-btn, -.btn.action-btn.btn-lg { - height: 50px; - width: 50px -} - -.btn-group-lg>.btn.action-btn i, -.btn.action-btn.btn-lg i { - font-size: 1.875rem; - line-height: 24px -} - -.btn.action-btn.btn-refresh.clicked i { - color: #047006; - -webkit-animation: rotate360 .8s linear infinite; - animation: rotate360 .8s linear infinite -} - -.btn.action-btn.btn-like.clicked i { - color: #ff5f66; - -webkit-animation: bounceIn .8s linear 1; - animation: bounceIn .8s linear 1 -} - -.btn.action-btn.btn-like.clicked:hover i { - color: #fff -} - -.btn.btn-rounded { - border-radius: 50px -} - -.flag-germany { - width: 40px; - height: 28px; - background: red; - border-top: 9px solid #000; - border-bottom: 9px solid #fc0; - display: block -} - -.flag-england { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); - background-size: cover; - width: 40px; - height: 28px; - display: block -} - -.language-active { - background-color: #f9fafb; - padding: 2px -} - -.language-inactive { - padding: 2px; - background-color: transparent -} - -.is-invalid .form-control { - background-color: rgba(240, 130, 95, .2); - border: none -} - -.is-invalid .invalid-feedback { - display: block -} - -.is-valid .form-control { - background-color: rgba(4, 112, 6, .2); - border: none -} - -.form-control { - padding-left: 20px; - padding-right: 20px; - color: rgba(16, 16, 16, .8) -} - -.form-control.placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control:-moz-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control::-moz-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control:-ms-input-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control::-webkit-input-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control.is-invalid { - background-color: rgba(240, 130, 95, .2); - border: none -} - -.form-control.is-valid { - background-color: rgba(4, 112, 6, .2); - border: none -} - -.input-group-text { - background-color: #f6f7f9; - color: #101010; - border-color: #f2f4f9; - padding: 0 10px; - font-size: 17px -} - -.is-valid .input-group-text { - background-color: rgba(4, 112, 6, .2); - color: #047006 -} - -.is-invalid .input-group-text { - background-color: rgba(240, 130, 95, .2); - color: #f0825f -} - -.form-group { - margin-bottom: 20px -} - -.form-group.input-rounded .form-control { - border-radius: 25px -} - -.custom-file .custom-file-label { - padding: 8px .75rem; - height: 41px -} - -.custom-file .custom-file-label:after { - padding: 1.45rem .8rem; - line-height: 0 -} - -.custom-select, -.custom-select[multiple] { - background: #f6f7f9; - border-color: #f0f2f5; - color: rgba(16, 16, 16, .8) -} - -.custom-select option, -.custom-select[multiple] option { - background: #f6f7f9; - color: rgba(16, 16, 16, .8); - display: block; - border-bottom: 1px solid #f2f4f9; - padding: 5px 10px -} - -.custom-select option:checked, -.custom-select[multiple] option:checked { - background: #f6f7f9 -} - -.custom-select option[selected], -.custom-select[multiple] option[selected] { - background: #f6f7f9; - display: block -} - -.custom-select[multiple] { - padding: 0; - border-radius: 2px -} - -.custom-control-input:focus~.custom-control-label::before { - box-shadow: none -} - -.custom-switch .custom-control-label::after { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); - background: #047006 -} - -.checkbox, -.radio { - position: relative; - display: block; - margin-top: 2px; - margin-bottom: 20px -} - -.checkbox label, -.radio label { - display: block; - padding-left: 30px; - line-height: 1.42857143; - font-size: .875rem -} - -.checkbox label input, -.radio label input { - position: absolute; - margin-left: -20px; - margin-top: 4px\9; - top: 0; - left: 0; - margin-left: 0 !important; - z-index: 1; - cursor: pointer; - opacity: 0; - filter: alpha(opacity=0); - margin-top: 0 -} - -.checkbox label input:checked+.input-frame:before, -.radio label input:checked+.input-frame:before { - background-color: #fff -} - -.checkbox label input:checked+.input-frame:after, -.radio label input:checked+.input-frame:after { - color: #047006; - opacity: 1; - line-height: 1.5; - filter: alpha(opacity=100); - -webkit-transform: scale(1); - transform: scale(1) -} - -.checkbox label input:disabled+.input-frame:before, -.radio label input:disabled+.input-frame:before { - border-color: #fff -} - -.checkbox label input:disabled:checked+.input-frame:before, -.radio label input:disabled:checked+.input-frame:before { - background: #047006 -} - -.checkbox label .input-frame:before, -.radio label .input-frame:before { - position: absolute; - content: '.5'; - top: 0; - width: 19px; - height: 19px; - border-radius: 2px; - left: 0; - border: 2px solid #f2f4f9; - -webkit-transition: all; - transition: all; - -webkit-transition-duration: 250ms; - transition-duration: 250ms -} - -.checkbox label .input-frame:after, -.radio label .input-frame:after { - line-height: 1.5; - -webkit-transition: all; - transition: all; - -webkit-transition-duration: 250ms; - transition-duration: 250ms; - font-family: Material Design Icons; - opacity: 0; - filter: alpha(opacity=0); - -webkit-transform: scale(0); - transform: scale(0); - content: '3'; - position: absolute; - font-size: .9375rem; - left: 1px; - top: -2px; - color: #fff -} - -.checkbox label { - font-size: 16; - line-height: 1.5; - padding-left: 30px -} - -.checkbox label input:checked+.input-helper:before { - background-color: #fff -} - -.checkbox label input:checked+.input-helper:after { - width: 18px; - opacity: 1; - line-height: 18px; - filter: alpha(opacity=100); - -webkit-transform: scale(1); - transform: scale(1) -} - -.checkbox label input:disabled+.input-helper:before { - border-color: #f2f4f9 -} - -.checkbox label input:disabled:checked+.input-helper:after { - color: #f2f4f9 -} - -.checkbox label .input-frame:before { - position: absolute; - content: '3'; - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - width: 18px; - height: 18px; - border-radius: 2px; - left: 0; - border: 2px solid #f2f4f9; - -webkit-transition: all; - transition: all; - transition-duration: 0s; - -webkit-transition-duration: 250ms; - transition-duration: 250ms -} - -.rtl .checkbox label .input-frame:before { - left: auto; - right: 0 -} - -.checkbox label .input-frame:after { - -webkit-transition: all; - transition: all; - transition-duration: 0s; - -webkit-transition-duration: 250ms; - transition-duration: 250ms; - font-family: Material Design Icons; - opacity: 0; - filter: alpha(opacity=0); - -webkit-transform: scale(0); - transform: scale(0); - content: '.5'; - position: absolute; - font-size: 15px; - font-weight: 700; - left: 0; - top: 0; - -webkit-transform: translateY(-14%); - transform: translateY(-14%); - color: #047006 -} - -.rtl .checkbox label .input-frame:after { - left: auto; - right: 0 -} - -.radio label input:checked+.input-frame:before { - background-color: #fff -} - -.radio label input:checked:disabled+.input-frame:before { - background-color: #fff; - border-color: #fff -} - -.radio label input:checked:disabled+.input-frame:after { - background-color: #047006 -} - -.radio label .input-frame:before { - border-radius: 50% -} - -.radio label .input-frame:after { - content: 'http://www.w3.org/2000/svg'; - width: 9px; - height: 9px; - background: #047006; - border-radius: 50%; - top: 5px; - left: 5px; - -webkit-transform: scale(0); - transform: scale(0) -} - -.form-inline .checkbox, -.form-inline .radio { - margin-right: 30px -} - -.form-inline .checkbox:last-child, -.form-inline .radio:last-child { - margin-right: 0 -} - -.form-inline .form-check-input { - display: none -} - -.bootstrap-tagsinput { - background: #f6f7f9; - border-color: #f0f2f5; - box-shadow: none; - min-width: 100%; - width: 100%; - max-width: 100% -} - -.bootstrap-tagsinput .tag { - display: inline-block; - background: #047006; - color: #fff; - padding: 2px 9px; - border-radius: 2px; - margin-bottom: 5px -} - -.bootstrap-tagsinput .tag:nth-child(5n+1) { - background: #047006 -} - -.bootstrap-tagsinput .tag:nth-child(5n+2) { - background: #00e093 -} - -.bootstrap-tagsinput .tag:nth-child(5n+3) { - background: #6c61f6 -} - -.bootstrap-tagsinput .tag:nth-child(5n+4) { - background: #f0825f -} - -.bootstrap-tagsinput .tag:nth-child(5n+5) { - background: #ff5f66 -} - -.page-body { - background: #fff -} - -.page-content-wrapper { - background: #f9fafb; - border-left: 1px solid #f2f4f9 -} - -@media (min-width:992px) { - .t-header .t-header-content-wrapper { - border-left: 1px solid #f2f4f9 - } - -} - -@media (min-width:768px) { - .page-body { - position: relative; - display: grid; - max-width: 100%; - grid-template-columns: 17rem calc(100vw - 17rem); - -webkit-transition: .3s; - transition: .3s - } - - .page-body .page-content-wrapper { - position: relative; - width: 100%; - min-height: 100vh; - padding: 1.5rem 2.5rem calc(90px + 1.5rem); - margin-top: 70px - } - - .page-body .page-content-wrapper .page-content-wrapper-inner { - max-width: 1140px; - margin-left: auto; - margin-right: auto - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header { - position: -webkit-sticky; - position: sticky; - top: 70px; - background: #f9fafb; - z-index: 99 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb { - padding: 1rem 1rem 1rem 21px; - margin-left: -20px; - margin-right: -20px; - background: #f9fafb - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item { - color: #565656; - letter-spacing: .03rem; - font-family: Roboto, sans-serif; - font-weight: 500 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item a { - color: inherit - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item.active { - color: #047006 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-title-heading { - color: #565656; - font-size: 1.5rem; - font-family: Roboto, sans-serif; - font-weight: 500; - margin-bottom: 0 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-description { - opacity: .7; - margin-top: 15px - } - - body.sidebar-minimized .t-header .t-header-brand-wrapper { - background: #f9fafb - } - - body.sidebar-minimized .t-header .t-header-content-wrapper { - border-left: #f9fafb - } - - body.sidebar-minimized .page-body { - grid-template-columns: 0 100% - } - - body.sidebar-minimized .page-body .sidebar .sidebar_footer { - left: -17rem - } - - body.sidebar-minimized .page-body .sidebar .nav-category-divider { - position: initial - } - -} - -@media (max-width:991.98px) { - .t-header { - width: 100vw - } - - .t-header .t-header-brand-wrapper { - background: #f9fafb; - width: 4rem; - min-width: 4rem; - max-width: 4rem - } - - .t-header .t-header-brand-wrapper a .logo { - -webkit-animation-name: menuItemFadeIn; - animation-name: menuItemFadeIn; - -webkit-animation-duration: .25s; - animation-duration: .25s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - display: none - } - - @-webkit-keyframes menuItemFadeIn { - from { - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - display: none; - opacity: 0 - } - - to { - display: block; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1 - } - - } - - @keyframes menuItemFadeIn { - from { - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - display: none; - opacity: 0 - } - - to { - display: block; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1 - } - - } - - .t-header .t-header-brand-wrapper a .logo-mini { - display: block - } - - .page-body { - display: -webkit-box; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - overflow: hidden; - max-width: 100% - } - - .page-body .sidebar { - position: relative; - left: 0; - z-index: 99; - width: 15rem; - min-width: 15rem; - max-width: 15rem; - margin-left: -15rem; - -webkit-transition-duration: .2s; - transition-duration: .2s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - -webkit-transition-property: margin-left, width; - transition-property: margin-left, width - } - - .page-body .sidebar .sidebar_footer { - -webkit-transition-duration: .2s; - transition-duration: .2s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - -webkit-transition-property: left; - transition-property: left; - left: -15rem - } - - .page-body .page-content-wrapper { - padding: 20px 20px; - min-width: 100vw; - margin-left: 0; - -webkit-transition-duration: .2s; - transition-duration: .2s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - -webkit-transition-property: margin-left; - transition-property: margin-left - } - - .page-body .page-content-wrapper .viewport-header .breadcrumb { - background: 0 0; - padding-left: 0 - } - - .page-body .page-content-wrapper footer { - position: relative - } - - .page-body.sidebar-collpased .sidebar { - margin-left: 0; - min-width: 15rem - } - - .page-body.sidebar-collpased .sidebar .sidebar_footer { - left: 0 - } - -} - -@media (max-width:767.98px) { - .page-body .page-content-wrapper { - padding: 80px 20px 0 20px - } - -} - -.logo { - display: block; - margin: 0 auto; - width: 280px -} - -.logo img { - width: 100% -} - -.grid { - background: #fff; - border-radius: 6px; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); - margin-bottom: 1.5rem; - border: 1px solid rgba(238, 238, 238, .75) -} - -.grid-header { - padding: 15px 20px; - margin-bottom: 15px; - font-family: Roboto, sans-serif; - font-weight: 500; - font-size: 14px; - letter-spacing: .03rem; - background: #f9fafb; - border-left: 3px solid #047006; - border-radius: 0 6px 0 0 -} - -@media (min-width:768px) and (max-width:991px) { - .grid-header { - font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .grid-header { - font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .grid-header { - font-size: 14px - } - -} - -.grid-title { - opacity: .9; - margin-bottom: 25px -} - -.close { - color: #101010 -} - -.split-header { - display: -webkit-box; - display: flex; - -webkit-box-pack: justify; - justify-content: space-between; - -webkit-box-align: center; - align-items: center -} - -.split-header .content-wrapper { - display: -webkit-box; - display: flex -} - -.split-header .content-wrapper a i, -.split-header .content-wrapper span i { - font-size: 20px; - color: #adb5bd; - -webkit-transition: .3s ease color; - transition: .3s ease color -} - -.split-header .content-wrapper a i:hover, -.split-header .content-wrapper span i:hover { - color: #047006 -} - -.split-header .content-wrapper.v-centered { - -webkit-box-align: center; - align-items: center -} - -.split-header .content-wrapper.h-centered { - -webkit-box-pack: center; - justify-content: center -} - -.grid-body { - padding: 20px 25px 20px -} - -.card-title { - font-size: 14px; - font-family: Roboto, sans-serif; - font-weight: 500; - color: #313131; - margin-bottom: 0 -} - -@media (min-width:768px) and (max-width:991px) { - .card-title { - font-size: calc(14px + 1 * ((100vw - 768px)/ 223)) - } - -} - -@media (min-width:991px) and (max-width:1200px) { - .card-title { - font-size: calc(15px + -1 * ((100vw - 991px)/ 209)) - } - -} - -@media (min-width:1200px) { - .card-title { - font-size: 14px - } - -} - -.equel-grid { - display: -webkit-box; - display: flex; - -webkit-box-align: stretch; - align-items: stretch -} - -.equel-grid .grid { - width: 100%; - min-width: 100% -} - -.showcase_row_area { - margin-bottom: 20px -} - -.showcase_row_area .showcase_text_area { - text-align: right -} - -@media (max-width:767.98px) { - .showcase_row_area .showcase_text_area { - text-align: left - } - -} - -.showcase_row_area .showcase_content_area { - margin-bottom: -10px -} - -.showcase_row_area .showcase_content_area .btn { - margin-right: 5px; - margin-bottom: 10px -} - -.showcase_row_area:last-child { - margin-bottom: 0 -} - -.content-preview { - width: 45px; - height: 45px -} - -.content-preview.rounded { - border-radius: 100% -} - -.btn:not(.disabled),.cursor_pointer,a { - cursor: pointer -} - -.grd-positive-currency { - color: #047006 -} - -.grd-negative-currency { - color: red -} - -.color-success { - color: var(--success) -} - -.color-danger { - color: var(--danger) -} - -.color-warning { - color: var(--warning) -} - -.color-primary { - color: var(--primary) -} - -.btn-gradido-orange { - color: #fff; - background-color: #ffa600; - border-color: #ffa600 -} - -.visible-modal { - display: block -} - -.margin-top-10 { - margin-top: 10px -} - -.pull-right { - float: right -} - -.pull-right-row { - display: block; - margin-right: 10px -} - -.display-block { - display: block -} - -p.grd_small { - margin-top: 2px; - margin-bottom: 2px -} - -ul.grd-no-style { - list-style-type: none -} - -.center-ul-container ul { - padding-left: 0; - margin-bottom: 0; - text-align: center -} - -.center-ul-container ul .grd-error { - margin-top: 5px; - color: #8b0000 -} - -.grd-alert-color { - color: #ff5f66 !important -} - -.grd-success-color { - color: #047006 !important -} - -.grd-orange-color { - color: #ffa600 -} - -.hidden { - display: none -} - -.alert { - cursor: pointer -} - -.table.table-auto-break td, -.table.table-auto-break th { - white-space: pre-line -} - -.grd-passphrase-words { - cursor: pointer -} - -.authentication-theme .reset-pwd-link, -.authentication-theme .signup-link { - margin: 20px auto 0 auto; - text-align: center; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center -} - -.authentication-theme .reset-pwd-link a, -.authentication-theme .signup-link a { - display: inline-block; - margin-left: 10px -} - -.authentication-theme .auth_footer { - margin-top: 30px -} - -.authentication-theme.auth-style_1 { - min-height: 100vh; - width: 100%; - background: #f9fafb; - padding: 10% 0 2px 0 -} - -.authentication-theme.auth-style_1 .logo-section { - margin-bottom: 50px -} - -.authentication-theme.auth-style_1 .grid-body { - padding: 60px 15px; - padding-bottom: 80px; - position: relative -} - -.authentication-theme.auth-style_1 .grid-body .form-wrapper { - position: unset -} - -.authentication-theme.auth-style_1 .grid-body-small { - padding: 15px 5px; - position: relative -} - -.authentication-theme.auth-style_1 .signup-link { - position: absolute; - bottom: 25px; - left: 0; - right: 0 -} - -.authentication-theme.auth-style_1 .reset-pwd-link { - position: absolute; - bottom: 20px; - left: 0; - right: 0 -} - -.authentication-theme.auth-style_2 { - display: -webkit-box; - display: flex; - -webkit-box-align: stretch; - align-items: stretch; - -webkit-box-pack: center; - justify-content: center; - min-height: 100vh -} - -.authentication-theme.auth-style_2 .inner-wrapper { - width: 100% -} - -.authentication-theme.auth-style_2 .banner-section { - background: url(http://www.placehold.it/1200x800) no-repeat center; - background-size: 60%; - background-color: #fff; - display: -webkit-box; - display: flex; - -webkit-box-align: end; - align-items: flex-end -} - -.authentication-theme.auth-style_2 .banner-section .auth_footer { - padding: 20px 20px -} - -@media (max-width:767.98px) { - .authentication-theme.auth-style_2 .banner-section { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 0 - } - -} - -.authentication-theme.auth-style_2 .form-section { - background-color: #fff; - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center -} - -.authentication-theme.auth-style_2 .form-section .logo-section { - margin: 0 auto 50px auto -} - -.authentication-theme.auth-style_2 .form-section form { - width: 100%; - max-width: 350px; - margin: 0 auto -} - -@media (max-width:767.98px) { - .authentication-theme.auth-style_2 .form-section { - background: rgba(255, 255, 255, .96) - } - -} - -.authentication-theme.auth-style_3 { - background: url(http://www.placehold.it/1200x800) no-repeat center; - background-size: cover; - background-color: #fff; - min-height: 100vh; - height: 100%; - display: -webkit-box; - display: flex; - -webkit-box-align: stretch; - align-items: stretch; - -webkit-box-pack: center; - justify-content: center -} - -.authentication-theme.auth-style_3 .inner-wrapper { - width: 100% -} - -.authentication-theme.auth-style_3 .logo-section { - margin: 0 auto 50px auto -} - -.authentication-theme.auth-style_3 .form-section { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center -} - -.authentication-theme.auth-style_3 .form-section form { - width: 100%; - max-width: 400px; - margin: 0 auto -} - -@media (max-width:767.98px) { - .authentication-theme.auth-style_3 .form-section form { - max-width: 300px - } - -} diff --git a/community_server/webroot/css/main.css b/community_server/webroot/css/main.css deleted file mode 100644 index 3e16f1164..000000000 --- a/community_server/webroot/css/main.css +++ /dev/null @@ -1,25 +0,0 @@ -@charset "UTF-8"; -/* ============================================================ - - Common CSS file, importing other files. - - Datei : main.css - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ - -@import url(normalize.css); -@import url(grd_styles.css); - -/*! debug.css v0.0.3 | MIT License | https://gist.github.com/zaydek/6b2e55258734deabbd2b4a284321d6f6 */ -[debug], -[debug] * { - color: hsla(210, 100%, 100%, 0.9) !important; - background: hsla(210, 100%, 50%, 0.5) !important; - outline: solid 0.25rem hsla(210, 100%, 100%, 0.5) !important; - - box-shadow: none !important; - filter: none !important; -} diff --git a/community_server/webroot/css/materialdesignicons.min.css b/community_server/webroot/css/materialdesignicons.min.css deleted file mode 100644 index bbdcbc816..000000000 --- a/community_server/webroot/css/materialdesignicons.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* MaterialDesignIcons.com */@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=3.5.95");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=3.5.95") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=3.5.95") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=3.5.95") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=3.5.95") format("truetype"),url("../fonts/materialdesignicons-webfont.svg?v=3.5.95#materialdesigniconsregular") format("svg");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-access-point-network-off:before{content:"\FBBD"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-alert-outline:before{content:"\FB2C"}.mdi-account-arrow-left:before{content:"\FB2D"}.mdi-account-arrow-left-outline:before{content:"\FB2E"}.mdi-account-arrow-right:before{content:"\FB2F"}.mdi-account-arrow-right-outline:before{content:"\FB30"}.mdi-account-badge:before{content:"\FD83"}.mdi-account-badge-alert:before{content:"\FD84"}.mdi-account-badge-alert-outline:before{content:"\FD85"}.mdi-account-badge-outline:before{content:"\FD86"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-multiple:before{content:"\F933"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-card-details-outline:before{content:"\FD87"}.mdi-account-check:before{content:"\F008"}.mdi-account-check-outline:before{content:"\FBBE"}.mdi-account-child:before{content:"\FA88"}.mdi-account-child-circle:before{content:"\FA89"}.mdi-account-circle:before{content:"\F009"}.mdi-account-circle-outline:before{content:"\FB31"}.mdi-account-clock:before{content:"\FB32"}.mdi-account-clock-outline:before{content:"\FB33"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-details:before{content:"\F631"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-group:before{content:"\F848"}.mdi-account-group-outline:before{content:"\FB34"}.mdi-account-heart:before{content:"\F898"}.mdi-account-heart-outline:before{content:"\FBBF"}.mdi-account-key:before{content:"\F00B"}.mdi-account-key-outline:before{content:"\FBC0"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-minus-outline:before{content:"\FAEB"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-check:before{content:"\F8C4"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-minus-outline:before{content:"\FBC1"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-multiple-plus-outline:before{content:"\F7FF"}.mdi-account-network:before{content:"\F011"}.mdi-account-network-outline:before{content:"\FBC2"}.mdi-account-off:before{content:"\F012"}.mdi-account-off-outline:before{content:"\FBC3"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-plus-outline:before{content:"\F800"}.mdi-account-question:before{content:"\FB35"}.mdi-account-question-outline:before{content:"\FB36"}.mdi-account-remove:before{content:"\F015"}.mdi-account-remove-outline:before{content:"\FAEC"}.mdi-account-search:before{content:"\F016"}.mdi-account-search-outline:before{content:"\F934"}.mdi-account-settings:before{content:"\F630"}.mdi-account-star:before{content:"\F017"}.mdi-account-star-outline:before{content:"\FBC4"}.mdi-account-supervisor:before{content:"\FA8A"}.mdi-account-supervisor-circle:before{content:"\FA8B"}.mdi-account-switch:before{content:"\F019"}.mdi-account-tie:before{content:"\FCBF"}.mdi-accusoft:before{content:"\F849"}.mdi-adchoices:before{content:"\FD1E"}.mdi-adjust:before{content:"\F01A"}.mdi-adobe:before{content:"\F935"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-air-filter:before{content:"\FD1F"}.mdi-air-horn:before{content:"\FD88"}.mdi-air-purifier:before{content:"\FD20"}.mdi-airbag:before{content:"\FBC5"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-airport:before{content:"\F84A"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-bell:before{content:"\F78D"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-light:before{content:"\F78E"}.mdi-alarm-light-outline:before{content:"\FBC6"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-box-outline:before{content:"\FCC0"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-decagram-outline:before{content:"\FCC1"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagon-outline:before{content:"\FCC2"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-octagram-outline:before{content:"\FCC3"}.mdi-alert-outline:before{content:"\F02A"}.mdi-alien:before{content:"\F899"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alpha-a:before{content:"\41"}.mdi-alpha-a-box:before{content:"\FAED"}.mdi-alpha-a-box-outline:before{content:"\FBC7"}.mdi-alpha-a-circle:before{content:"\FBC8"}.mdi-alpha-a-circle-outline:before{content:"\FBC9"}.mdi-alpha-b:before{content:"\42"}.mdi-alpha-b-box:before{content:"\FAEE"}.mdi-alpha-b-box-outline:before{content:"\FBCA"}.mdi-alpha-b-circle:before{content:"\FBCB"}.mdi-alpha-b-circle-outline:before{content:"\FBCC"}.mdi-alpha-c:before{content:"\43"}.mdi-alpha-c-box:before{content:"\FAEF"}.mdi-alpha-c-box-outline:before{content:"\FBCD"}.mdi-alpha-c-circle:before{content:"\FBCE"}.mdi-alpha-c-circle-outline:before{content:"\FBCF"}.mdi-alpha-d:before{content:"\44"}.mdi-alpha-d-box:before{content:"\FAF0"}.mdi-alpha-d-box-outline:before{content:"\FBD0"}.mdi-alpha-d-circle:before{content:"\FBD1"}.mdi-alpha-d-circle-outline:before{content:"\FBD2"}.mdi-alpha-e:before{content:"\45"}.mdi-alpha-e-box:before{content:"\FAF1"}.mdi-alpha-e-box-outline:before{content:"\FBD3"}.mdi-alpha-e-circle:before{content:"\FBD4"}.mdi-alpha-e-circle-outline:before{content:"\FBD5"}.mdi-alpha-f:before{content:"\46"}.mdi-alpha-f-box:before{content:"\FAF2"}.mdi-alpha-f-box-outline:before{content:"\FBD6"}.mdi-alpha-f-circle:before{content:"\FBD7"}.mdi-alpha-f-circle-outline:before{content:"\FBD8"}.mdi-alpha-g:before{content:"\47"}.mdi-alpha-g-box:before{content:"\FAF3"}.mdi-alpha-g-box-outline:before{content:"\FBD9"}.mdi-alpha-g-circle:before{content:"\FBDA"}.mdi-alpha-g-circle-outline:before{content:"\FBDB"}.mdi-alpha-h:before{content:"\48"}.mdi-alpha-h-box:before{content:"\FAF4"}.mdi-alpha-h-box-outline:before{content:"\FBDC"}.mdi-alpha-h-circle:before{content:"\FBDD"}.mdi-alpha-h-circle-outline:before{content:"\FBDE"}.mdi-alpha-i:before{content:"\49"}.mdi-alpha-i-box:before{content:"\FAF5"}.mdi-alpha-i-box-outline:before{content:"\FBDF"}.mdi-alpha-i-circle:before{content:"\FBE0"}.mdi-alpha-i-circle-outline:before{content:"\FBE1"}.mdi-alpha-j:before{content:"\4A"}.mdi-alpha-j-box:before{content:"\FAF6"}.mdi-alpha-j-box-outline:before{content:"\FBE2"}.mdi-alpha-j-circle:before{content:"\FBE3"}.mdi-alpha-j-circle-outline:before{content:"\FBE4"}.mdi-alpha-k:before{content:"\4B"}.mdi-alpha-k-box:before{content:"\FAF7"}.mdi-alpha-k-box-outline:before{content:"\FBE5"}.mdi-alpha-k-circle:before{content:"\FBE6"}.mdi-alpha-k-circle-outline:before{content:"\FBE7"}.mdi-alpha-l:before{content:"\4C"}.mdi-alpha-l-box:before{content:"\FAF8"}.mdi-alpha-l-box-outline:before{content:"\FBE8"}.mdi-alpha-l-circle:before{content:"\FBE9"}.mdi-alpha-l-circle-outline:before{content:"\FBEA"}.mdi-alpha-m:before{content:"\4D"}.mdi-alpha-m-box:before{content:"\FAF9"}.mdi-alpha-m-box-outline:before{content:"\FBEB"}.mdi-alpha-m-circle:before{content:"\FBEC"}.mdi-alpha-m-circle-outline:before{content:"\FBED"}.mdi-alpha-n:before{content:"\4E"}.mdi-alpha-n-box:before{content:"\FAFA"}.mdi-alpha-n-box-outline:before{content:"\FBEE"}.mdi-alpha-n-circle:before{content:"\FBEF"}.mdi-alpha-n-circle-outline:before{content:"\FBF0"}.mdi-alpha-o:before{content:"\4F"}.mdi-alpha-o-box:before{content:"\FAFB"}.mdi-alpha-o-box-outline:before{content:"\FBF1"}.mdi-alpha-o-circle:before{content:"\FBF2"}.mdi-alpha-o-circle-outline:before{content:"\FBF3"}.mdi-alpha-p:before{content:"\50"}.mdi-alpha-p-box:before{content:"\FAFC"}.mdi-alpha-p-box-outline:before{content:"\FBF4"}.mdi-alpha-p-circle:before{content:"\FBF5"}.mdi-alpha-p-circle-outline:before{content:"\FBF6"}.mdi-alpha-q:before{content:"\51"}.mdi-alpha-q-box:before{content:"\FAFD"}.mdi-alpha-q-box-outline:before{content:"\FBF7"}.mdi-alpha-q-circle:before{content:"\FBF8"}.mdi-alpha-q-circle-outline:before{content:"\FBF9"}.mdi-alpha-r:before{content:"\52"}.mdi-alpha-r-box:before{content:"\FAFE"}.mdi-alpha-r-box-outline:before{content:"\FBFA"}.mdi-alpha-r-circle:before{content:"\FBFB"}.mdi-alpha-r-circle-outline:before{content:"\FBFC"}.mdi-alpha-s:before{content:"\53"}.mdi-alpha-s-box:before{content:"\FAFF"}.mdi-alpha-s-box-outline:before{content:"\FBFD"}.mdi-alpha-s-circle:before{content:"\FBFE"}.mdi-alpha-s-circle-outline:before{content:"\FBFF"}.mdi-alpha-t:before{content:"\54"}.mdi-alpha-t-box:before{content:"\FB00"}.mdi-alpha-t-box-outline:before{content:"\FC00"}.mdi-alpha-t-circle:before{content:"\FC01"}.mdi-alpha-t-circle-outline:before{content:"\FC02"}.mdi-alpha-u:before{content:"\55"}.mdi-alpha-u-box:before{content:"\FB01"}.mdi-alpha-u-box-outline:before{content:"\FC03"}.mdi-alpha-u-circle:before{content:"\FC04"}.mdi-alpha-u-circle-outline:before{content:"\FC05"}.mdi-alpha-v:before{content:"\56"}.mdi-alpha-v-box:before{content:"\FB02"}.mdi-alpha-v-box-outline:before{content:"\FC06"}.mdi-alpha-v-circle:before{content:"\FC07"}.mdi-alpha-v-circle-outline:before{content:"\FC08"}.mdi-alpha-w:before{content:"\57"}.mdi-alpha-w-box:before{content:"\FB03"}.mdi-alpha-w-box-outline:before{content:"\FC09"}.mdi-alpha-w-circle:before{content:"\FC0A"}.mdi-alpha-w-circle-outline:before{content:"\FC0B"}.mdi-alpha-x:before{content:"\58"}.mdi-alpha-x-box:before{content:"\FB04"}.mdi-alpha-x-box-outline:before{content:"\FC0C"}.mdi-alpha-x-circle:before{content:"\FC0D"}.mdi-alpha-x-circle-outline:before{content:"\FC0E"}.mdi-alpha-y:before{content:"\59"}.mdi-alpha-y-box:before{content:"\FB05"}.mdi-alpha-y-box-outline:before{content:"\FC0F"}.mdi-alpha-y-circle:before{content:"\FC10"}.mdi-alpha-y-circle-outline:before{content:"\FC11"}.mdi-alpha-z:before{content:"\5A"}.mdi-alpha-z-box:before{content:"\FB06"}.mdi-alpha-z-box-outline:before{content:"\FC12"}.mdi-alpha-z-circle:before{content:"\FC13"}.mdi-alpha-z-circle-outline:before{content:"\FC14"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-alexa:before{content:"\F8C5"}.mdi-amazon-drive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-ammunition:before{content:"\FCC4"}.mdi-ampersand:before{content:"\FA8C"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-auto:before{content:"\FA8D"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-head:before{content:"\F78F"}.mdi-android-messages:before{content:"\FD21"}.mdi-android-studio:before{content:"\F034"}.mdi-angle-acute:before{content:"\F936"}.mdi-angle-obtuse:before{content:"\F937"}.mdi-angle-right:before{content:"\F938"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-animation-outline:before{content:"\FA8E"}.mdi-animation-play:before{content:"\F939"}.mdi-animation-play-outline:before{content:"\FA8F"}.mdi-anvil:before{content:"\F89A"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-icloud:before{content:"\F038"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-application-export:before{content:"\FD89"}.mdi-application-import:before{content:"\FD8A"}.mdi-apps:before{content:"\F03B"}.mdi-apps-box:before{content:"\FD22"}.mdi-arch:before{content:"\F8C6"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-left-bold-outline:before{content:"\F9B6"}.mdi-arrow-bottom-left-thick:before{content:"\F9B7"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-bottom-right-bold-outline:before{content:"\F9B8"}.mdi-arrow-bottom-right-thick:before{content:"\F9B9"}.mdi-arrow-collapse:before{content:"\F615"}.mdi-arrow-collapse-all:before{content:"\F044"}.mdi-arrow-collapse-down:before{content:"\F791"}.mdi-arrow-collapse-horizontal:before{content:"\F84B"}.mdi-arrow-collapse-left:before{content:"\F792"}.mdi-arrow-collapse-right:before{content:"\F793"}.mdi-arrow-collapse-up:before{content:"\F794"}.mdi-arrow-collapse-vertical:before{content:"\F84C"}.mdi-arrow-decision:before{content:"\F9BA"}.mdi-arrow-decision-auto:before{content:"\F9BB"}.mdi-arrow-decision-auto-outline:before{content:"\F9BC"}.mdi-arrow-decision-outline:before{content:"\F9BD"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-bold-outline:before{content:"\F9BE"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-circle:before{content:"\FCB7"}.mdi-arrow-down-circle-outline:before{content:"\FCB8"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-expand-down:before{content:"\F795"}.mdi-arrow-expand-horizontal:before{content:"\F84D"}.mdi-arrow-expand-left:before{content:"\F796"}.mdi-arrow-expand-right:before{content:"\F797"}.mdi-arrow-expand-up:before{content:"\F798"}.mdi-arrow-expand-vertical:before{content:"\F84E"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-bold-outline:before{content:"\F9BF"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-circle:before{content:"\FCB9"}.mdi-arrow-left-circle-outline:before{content:"\FCBA"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-right-bold-outline:before{content:"\F9C0"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-bold-outline:before{content:"\F9C1"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-circle:before{content:"\FCBB"}.mdi-arrow-right-circle-outline:before{content:"\FCBC"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-split-horizontal:before{content:"\F93A"}.mdi-arrow-split-vertical:before{content:"\F93B"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-left-bold-outline:before{content:"\F9C2"}.mdi-arrow-top-left-thick:before{content:"\F9C3"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-top-right-bold-outline:before{content:"\F9C4"}.mdi-arrow-top-right-thick:before{content:"\F9C5"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-bold-outline:before{content:"\F9C6"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-circle:before{content:"\FCBD"}.mdi-arrow-up-circle-outline:before{content:"\FCBE"}.mdi-arrow-up-down-bold-outline:before{content:"\F9C7"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-artist:before{content:"\F802"}.mdi-artist-outline:before{content:"\FCC5"}.mdi-artstation:before{content:"\FB37"}.mdi-aspect-ratio:before{content:"\FA23"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atlassian:before{content:"\F803"}.mdi-atm:before{content:"\FD23"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audio-video:before{content:"\F93C"}.mdi-audiobook:before{content:"\F067"}.mdi-augmented-reality:before{content:"\F84F"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-axe:before{content:"\F8C7"}.mdi-axis:before{content:"\FD24"}.mdi-axis-arrow:before{content:"\FD25"}.mdi-axis-arrow-lock:before{content:"\FD26"}.mdi-axis-lock:before{content:"\FD27"}.mdi-axis-x-arrow:before{content:"\FD28"}.mdi-axis-x-arrow-lock:before{content:"\FD29"}.mdi-axis-x-rotate-clockwise:before{content:"\FD2A"}.mdi-axis-x-rotate-counterclockwise:before{content:"\FD2B"}.mdi-axis-x-y-arrow-lock:before{content:"\FD2C"}.mdi-axis-y-arrow:before{content:"\FD2D"}.mdi-axis-y-arrow-lock:before{content:"\FD2E"}.mdi-axis-y-rotate-clockwise:before{content:"\FD2F"}.mdi-axis-y-rotate-counterclockwise:before{content:"\FD30"}.mdi-axis-z-arrow:before{content:"\FD31"}.mdi-axis-z-arrow-lock:before{content:"\FD32"}.mdi-axis-z-rotate-clockwise:before{content:"\FD33"}.mdi-axis-z-rotate-counterclockwise:before{content:"\FD34"}.mdi-azure:before{content:"\F804"}.mdi-babel:before{content:"\FA24"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backspace-outline:before{content:"\FB38"}.mdi-backup-restore:before{content:"\F06F"}.mdi-badminton:before{content:"\F850"}.mdi-balloon:before{content:"\FA25"}.mdi-ballot:before{content:"\F9C8"}.mdi-ballot-outline:before{content:"\F9C9"}.mdi-ballot-recount:before{content:"\FC15"}.mdi-ballot-recount-outline:before{content:"\FC16"}.mdi-bandage:before{content:"\FD8B"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-bank-minus:before{content:"\FD8C"}.mdi-bank-plus:before{content:"\FD8D"}.mdi-bank-remove:before{content:"\FD8E"}.mdi-bank-transfer:before{content:"\FA26"}.mdi-bank-transfer-in:before{content:"\FA27"}.mdi-bank-transfer-out:before{content:"\FA28"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barley-off:before{content:"\FB39"}.mdi-barn:before{content:"\FB3A"}.mdi-barrel:before{content:"\F074"}.mdi-baseball:before{content:"\F851"}.mdi-baseball-bat:before{content:"\F852"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-basketball:before{content:"\F805"}.mdi-basketball-hoop:before{content:"\FC17"}.mdi-basketball-hoop-outline:before{content:"\FC18"}.mdi-bat:before{content:"\FB3B"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-10-bluetooth:before{content:"\F93D"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-20-bluetooth:before{content:"\F93E"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-30-bluetooth:before{content:"\F93F"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-40-bluetooth:before{content:"\F940"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-50-bluetooth:before{content:"\F941"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-60-bluetooth:before{content:"\F942"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-70-bluetooth:before{content:"\F943"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-80-bluetooth:before{content:"\F944"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-90-bluetooth:before{content:"\F945"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-alert-bluetooth:before{content:"\F946"}.mdi-battery-bluetooth:before{content:"\F947"}.mdi-battery-bluetooth-variant:before{content:"\F948"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-10:before{content:"\F89B"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-50:before{content:"\F89C"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-70:before{content:"\F89D"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-charging-outline:before{content:"\F89E"}.mdi-battery-charging-wireless:before{content:"\F806"}.mdi-battery-charging-wireless-10:before{content:"\F807"}.mdi-battery-charging-wireless-20:before{content:"\F808"}.mdi-battery-charging-wireless-30:before{content:"\F809"}.mdi-battery-charging-wireless-40:before{content:"\F80A"}.mdi-battery-charging-wireless-50:before{content:"\F80B"}.mdi-battery-charging-wireless-60:before{content:"\F80C"}.mdi-battery-charging-wireless-70:before{content:"\F80D"}.mdi-battery-charging-wireless-80:before{content:"\F80E"}.mdi-battery-charging-wireless-90:before{content:"\F80F"}.mdi-battery-charging-wireless-alert:before{content:"\F810"}.mdi-battery-charging-wireless-outline:before{content:"\F811"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-battery-unknown-bluetooth:before{content:"\F949"}.mdi-battlenet:before{content:"\FB3C"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\FCC6"}.mdi-beaker-outline:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-bed-empty:before{content:"\F89F"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-alert:before{content:"\FD35"}.mdi-bell-circle:before{content:"\FD36"}.mdi-bell-circle-outline:before{content:"\FD37"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-off-outline:before{content:"\FA90"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-plus-outline:before{content:"\FA91"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-bell-sleep-outline:before{content:"\FA92"}.mdi-beta:before{content:"\F0A1"}.mdi-betamax:before{content:"\F9CA"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-billiards:before{content:"\FB3D"}.mdi-billiards-rack:before{content:"\FB3E"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-bitcoin:before{content:"\F812"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\FCC7"}.mdi-blender-software:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-blood-bag:before{content:"\FCC8"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bolnisi-cross:before{content:"\FCC9"}.mdi-bolt:before{content:"\FD8F"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-lock:before{content:"\F799"}.mdi-book-lock-open:before{content:"\F79A"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-minus:before{content:"\FA93"}.mdi-book-multiple-plus:before{content:"\FA94"}.mdi-book-multiple-remove:before{content:"\FA95"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-outline:before{content:"\FB3F"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-outline:before{content:"\FB40"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-remove:before{content:"\FA96"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-minus:before{content:"\F9CB"}.mdi-bookmark-minus-outline:before{content:"\F9CC"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-off:before{content:"\F9CD"}.mdi-bookmark-off-outline:before{content:"\F9CE"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-all-variant:before{content:"\F8A0"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-bottom-variant:before{content:"\F8A1"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-left-variant:before{content:"\F8A2"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-none-variant:before{content:"\F8A3"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-right-variant:before{content:"\F8A4"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-top-variant:before{content:"\F8A5"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bottle-wine:before{content:"\F853"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-boxing-glove:before{content:"\FB41"}.mdi-braille:before{content:"\F9CF"}.mdi-brain:before{content:"\F9D0"}.mdi-bread-slice:before{content:"\FCCA"}.mdi-bread-slice-outline:before{content:"\FCCB"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-account:before{content:"\FCCC"}.mdi-briefcase-account-outline:before{content:"\FCCD"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-download-outline:before{content:"\FC19"}.mdi-briefcase-edit:before{content:"\FA97"}.mdi-briefcase-edit-outline:before{content:"\FC1A"}.mdi-briefcase-minus:before{content:"\FA29"}.mdi-briefcase-minus-outline:before{content:"\FC1B"}.mdi-briefcase-outline:before{content:"\F813"}.mdi-briefcase-plus:before{content:"\FA2A"}.mdi-briefcase-plus-outline:before{content:"\FC1C"}.mdi-briefcase-remove:before{content:"\FA2B"}.mdi-briefcase-remove-outline:before{content:"\FC1D"}.mdi-briefcase-search:before{content:"\FA2C"}.mdi-briefcase-search-outline:before{content:"\FC1E"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-briefcase-upload-outline:before{content:"\FC1F"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-brightness-percent:before{content:"\FCCE"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buddhism:before{content:"\F94A"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bug-check:before{content:"\FA2D"}.mdi-bug-check-outline:before{content:"\FA2E"}.mdi-bug-outline:before{content:"\FA2F"}.mdi-bugle:before{content:"\FD90"}.mdi-bulldozer:before{content:"\FB07"}.mdi-bullet:before{content:"\FCCF"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullhorn-outline:before{content:"\FB08"}.mdi-bullseye:before{content:"\F5DD"}.mdi-bullseye-arrow:before{content:"\F8C8"}.mdi-bus:before{content:"\F0E7"}.mdi-bus-alert:before{content:"\FA98"}.mdi-bus-articulated-end:before{content:"\F79B"}.mdi-bus-articulated-front:before{content:"\F79C"}.mdi-bus-clock:before{content:"\F8C9"}.mdi-bus-double-decker:before{content:"\F79D"}.mdi-bus-school:before{content:"\F79E"}.mdi-bus-side:before{content:"\F79F"}.mdi-cached:before{content:"\F0E8"}.mdi-cactus:before{content:"\FD91"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calculator-variant:before{content:"\FA99"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-alert:before{content:"\FA30"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-blank-outline:before{content:"\FB42"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-check-outline:before{content:"\FC20"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-edit:before{content:"\F8A6"}.mdi-calendar-export:before{content:"\FB09"}.mdi-calendar-heart:before{content:"\F9D1"}.mdi-calendar-import:before{content:"\FB0A"}.mdi-calendar-minus:before{content:"\FD38"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-multiselect:before{content:"\FA31"}.mdi-calendar-outline:before{content:"\FB43"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-range-outline:before{content:"\FB44"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-remove-outline:before{content:"\FC21"}.mdi-calendar-search:before{content:"\F94B"}.mdi-calendar-star:before{content:"\F9D2"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-text-outline:before{content:"\FC22"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-calendar-week:before{content:"\FA32"}.mdi-calendar-week-begin:before{content:"\FA33"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-account:before{content:"\F8CA"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-control:before{content:"\FB45"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-enhance-outline:before{content:"\FB46"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-gopro:before{content:"\F7A0"}.mdi-camera-image:before{content:"\F8CB"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-metering-center:before{content:"\F7A1"}.mdi-camera-metering-matrix:before{content:"\F7A2"}.mdi-camera-metering-partial:before{content:"\F7A3"}.mdi-camera-metering-spot:before{content:"\F7A4"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-outline:before{content:"\FD39"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-camera-wireless:before{content:"\FD92"}.mdi-camera-wireless-outline:before{content:"\FD93"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-cannabis:before{content:"\F7A5"}.mdi-caps-lock:before{content:"\FA9A"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-brake-abs:before{content:"\FC23"}.mdi-car-brake-alert:before{content:"\FC24"}.mdi-car-brake-hold:before{content:"\FD3A"}.mdi-car-brake-parking:before{content:"\FD3B"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-convertible:before{content:"\F7A6"}.mdi-car-cruise-control:before{content:"\FD3C"}.mdi-car-defrost-front:before{content:"\FD3D"}.mdi-car-defrost-rear:before{content:"\FD3E"}.mdi-car-door:before{content:"\FB47"}.mdi-car-electric:before{content:"\FB48"}.mdi-car-esp:before{content:"\FC25"}.mdi-car-estate:before{content:"\F7A7"}.mdi-car-hatchback:before{content:"\F7A8"}.mdi-car-key:before{content:"\FB49"}.mdi-car-light-dimmed:before{content:"\FC26"}.mdi-car-light-fog:before{content:"\FC27"}.mdi-car-light-high:before{content:"\FC28"}.mdi-car-limousine:before{content:"\F8CC"}.mdi-car-multiple:before{content:"\FB4A"}.mdi-car-parking-lights:before{content:"\FD3F"}.mdi-car-pickup:before{content:"\F7A9"}.mdi-car-side:before{content:"\F7AA"}.mdi-car-sports:before{content:"\F7AB"}.mdi-car-tire-alert:before{content:"\FC29"}.mdi-car-traction-control:before{content:"\FD40"}.mdi-car-wash:before{content:"\F10E"}.mdi-caravan:before{content:"\F7AC"}.mdi-card:before{content:"\FB4B"}.mdi-card-bulleted:before{content:"\FB4C"}.mdi-card-bulleted-off:before{content:"\FB4D"}.mdi-card-bulleted-off-outline:before{content:"\FB4E"}.mdi-card-bulleted-outline:before{content:"\FB4F"}.mdi-card-bulleted-settings:before{content:"\FB50"}.mdi-card-bulleted-settings-outline:before{content:"\FB51"}.mdi-card-outline:before{content:"\FB52"}.mdi-card-text:before{content:"\FB53"}.mdi-card-text-outline:before{content:"\FB54"}.mdi-cards:before{content:"\F638"}.mdi-cards-club:before{content:"\F8CD"}.mdi-cards-diamond:before{content:"\F8CE"}.mdi-cards-heart:before{content:"\F8CF"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-spade:before{content:"\F8D0"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-carry-on-bag-check:before{content:"\FD41"}.mdi-cart:before{content:"\F110"}.mdi-cart-arrow-down:before{content:"\FD42"}.mdi-cart-arrow-right:before{content:"\FC2A"}.mdi-cart-arrow-up:before{content:"\FD43"}.mdi-cart-minus:before{content:"\FD44"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-cart-remove:before{content:"\FD45"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-marker:before{content:"\FD94"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-refund:before{content:"\FA9B"}.mdi-cash-register:before{content:"\FCD0"}.mdi-cash-usd:before{content:"\F117"}.mdi-cassette:before{content:"\F9D3"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-cctv:before{content:"\F7AD"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-arrow-down:before{content:"\F9D4"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-erase:before{content:"\F94C"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-key:before{content:"\F94D"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-lock:before{content:"\F94E"}.mdi-cellphone-message:before{content:"\F8D2"}.mdi-cellphone-off:before{content:"\F94F"}.mdi-cellphone-screenshot:before{content:"\FA34"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-cellphone-settings-variant:before{content:"\F950"}.mdi-cellphone-sound:before{content:"\F951"}.mdi-cellphone-text:before{content:"\F8D1"}.mdi-cellphone-wireless:before{content:"\F814"}.mdi-celtic-cross:before{content:"\FCD1"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-charity:before{content:"\FC2B"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bell-curve:before{content:"\FC2C"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-donut:before{content:"\F7AE"}.mdi-chart-donut-variant:before{content:"\F7AF"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-line-variant:before{content:"\F7B0"}.mdi-chart-multiline:before{content:"\F8D3"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-chat:before{content:"\FB55"}.mdi-chat-alert:before{content:"\FB56"}.mdi-chat-processing:before{content:"\FB57"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-box-multiple-outline:before{content:"\FC2D"}.mdi-check-box-outline:before{content:"\FC2E"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-check-decagram:before{content:"\F790"}.mdi-check-network:before{content:"\FC2F"}.mdi-check-network-outline:before{content:"\FC30"}.mdi-check-outline:before{content:"\F854"}.mdi-checkbook:before{content:"\FA9C"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-intermediate:before{content:"\F855"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chef-hat:before{content:"\FB58"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chess-bishop:before{content:"\F85B"}.mdi-chess-king:before{content:"\F856"}.mdi-chess-knight:before{content:"\F857"}.mdi-chess-pawn:before{content:"\F858"}.mdi-chess-queen:before{content:"\F859"}.mdi-chess-rook:before{content:"\F85A"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-down-box:before{content:"\F9D5"}.mdi-chevron-down-box-outline:before{content:"\F9D6"}.mdi-chevron-down-circle:before{content:"\FB0B"}.mdi-chevron-down-circle-outline:before{content:"\FB0C"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-left-box:before{content:"\F9D7"}.mdi-chevron-left-box-outline:before{content:"\F9D8"}.mdi-chevron-left-circle:before{content:"\FB0D"}.mdi-chevron-left-circle-outline:before{content:"\FB0E"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-right-box:before{content:"\F9D9"}.mdi-chevron-right-box-outline:before{content:"\F9DA"}.mdi-chevron-right-circle:before{content:"\FB0F"}.mdi-chevron-right-circle-outline:before{content:"\FB10"}.mdi-chevron-triple-down:before{content:"\FD95"}.mdi-chevron-triple-left:before{content:"\FD96"}.mdi-chevron-triple-right:before{content:"\FD97"}.mdi-chevron-triple-up:before{content:"\FD98"}.mdi-chevron-up:before{content:"\F143"}.mdi-chevron-up-box:before{content:"\F9DB"}.mdi-chevron-up-box-outline:before{content:"\F9DC"}.mdi-chevron-up-circle:before{content:"\FB11"}.mdi-chevron-up-circle-outline:before{content:"\FB12"}.mdi-chili-hot:before{content:"\F7B1"}.mdi-chili-medium:before{content:"\F7B2"}.mdi-chili-mild:before{content:"\F7B3"}.mdi-chip:before{content:"\F61A"}.mdi-christianity:before{content:"\F952"}.mdi-christianity-outline:before{content:"\FCD2"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-edit-outline:before{content:"\F8D4"}.mdi-circle-medium:before{content:"\F9DD"}.mdi-circle-outline:before{content:"\F765"}.mdi-circle-slice-1:before{content:"\FA9D"}.mdi-circle-slice-2:before{content:"\FA9E"}.mdi-circle-slice-3:before{content:"\FA9F"}.mdi-circle-slice-4:before{content:"\FAA0"}.mdi-circle-slice-5:before{content:"\FAA1"}.mdi-circle-slice-6:before{content:"\FAA2"}.mdi-circle-slice-7:before{content:"\FAA3"}.mdi-circle-slice-8:before{content:"\FAA4"}.mdi-circle-small:before{content:"\F9DE"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-city-variant:before{content:"\FA35"}.mdi-city-variant-outline:before{content:"\FA36"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-account-outline:before{content:"\FC31"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-alert-outline:before{content:"\FCD3"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-down-outline:before{content:"\FC32"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-arrow-left-outline:before{content:"\FCD4"}.mdi-clipboard-arrow-right:before{content:"\FCD5"}.mdi-clipboard-arrow-right-outline:before{content:"\FCD6"}.mdi-clipboard-arrow-up:before{content:"\FC33"}.mdi-clipboard-arrow-up-outline:before{content:"\FC34"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-check-outline:before{content:"\F8A7"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-play:before{content:"\FC35"}.mdi-clipboard-play-outline:before{content:"\FC36"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-pulse:before{content:"\F85C"}.mdi-clipboard-pulse-outline:before{content:"\F85D"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clipboard-text-outline:before{content:"\FA37"}.mdi-clipboard-text-play:before{content:"\FC37"}.mdi-clipboard-text-play-outline:before{content:"\FC38"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F953"}.mdi-clock-alert:before{content:"\F954"}.mdi-clock-alert-outline:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-outline:before{content:"\F150"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-multiple:before{content:"\FC39"}.mdi-close-box-multiple-outline:before{content:"\FC3A"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-network-outline:before{content:"\FC3B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-closed-caption-outline:before{content:"\FD99"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-alert:before{content:"\F9DF"}.mdi-cloud-braces:before{content:"\F7B4"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-download-outline:before{content:"\FB59"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-question:before{content:"\FA38"}.mdi-cloud-search:before{content:"\F955"}.mdi-cloud-search-outline:before{content:"\F956"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-tags:before{content:"\F7B5"}.mdi-cloud-upload:before{content:"\F167"}.mdi-cloud-upload-outline:before{content:"\FB5A"}.mdi-clover:before{content:"\F815"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coffin:before{content:"\FB5B"}.mdi-cogs:before{content:"\F8D5"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-collapse-all:before{content:"\FAA5"}.mdi-collapse-all-outline:before{content:"\FAA6"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-arrow-left:before{content:"\F9E0"}.mdi-comment-arrow-left-outline:before{content:"\F9E1"}.mdi-comment-arrow-right:before{content:"\F9E2"}.mdi-comment-arrow-right-outline:before{content:"\F9E3"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-eye:before{content:"\FA39"}.mdi-comment-eye-outline:before{content:"\FA3A"}.mdi-comment-multiple:before{content:"\F85E"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus:before{content:"\F9E4"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question:before{content:"\F816"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove:before{content:"\F5DE"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-search:before{content:"\FA3B"}.mdi-comment-search-outline:before{content:"\FA3C"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-multiple:before{content:"\F85F"}.mdi-comment-text-multiple-outline:before{content:"\F860"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-off:before{content:"\FB5C"}.mdi-compass-off-outline:before{content:"\FB5D"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-console-line:before{content:"\F7B6"}.mdi-console-network:before{content:"\F8A8"}.mdi-console-network-outline:before{content:"\FC3C"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contactless-payment:before{content:"\FD46"}.mdi-contacts:before{content:"\F6CA"}.mdi-contain:before{content:"\FA3D"}.mdi-contain-end:before{content:"\FA3E"}.mdi-contain-start:before{content:"\FA3F"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-edit:before{content:"\FCD7"}.mdi-content-save-edit-outline:before{content:"\FCD8"}.mdi-content-save-outline:before{content:"\F817"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-content-save-settings-outline:before{content:"\FB13"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-controller-classic:before{content:"\FB5E"}.mdi-controller-classic-outline:before{content:"\FB5F"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-cordova:before{content:"\F957"}.mdi-corn:before{content:"\F7B7"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-crane:before{content:"\F861"}.mdi-creation:before{content:"\F1C9"}.mdi-creative-commons:before{content:"\FD47"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-marker:before{content:"\FD9A"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-refund:before{content:"\FAA7"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-credit-card-settings:before{content:"\F8D6"}.mdi-credit-card-wireless:before{content:"\FD48"}.mdi-cricket:before{content:"\FD49"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cryengine:before{content:"\F958"}.mdi-crystal-ball:before{content:"\FB14"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-scan:before{content:"\FB60"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-cupcake:before{content:"\F959"}.mdi-curling:before{content:"\F862"}.mdi-currency-bdt:before{content:"\F863"}.mdi-currency-brl:before{content:"\FB61"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-chf:before{content:"\F7B8"}.mdi-currency-cny:before{content:"\F7B9"}.mdi-currency-eth:before{content:"\F7BA"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-ils:before{content:"\FC3D"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-jpy:before{content:"\F7BB"}.mdi-currency-krw:before{content:"\F7BC"}.mdi-currency-kzt:before{content:"\F864"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-php:before{content:"\F9E5"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-sign:before{content:"\F7BD"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-twd:before{content:"\F7BE"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-current-ac:before{content:"\F95A"}.mdi-current-dc:before{content:"\F95B"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-click:before{content:"\FCD9"}.mdi-cursor-default-click-outline:before{content:"\FCDA"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-check:before{content:"\FAA8"}.mdi-database-edit:before{content:"\FB62"}.mdi-database-export:before{content:"\F95D"}.mdi-database-import:before{content:"\F95C"}.mdi-database-lock:before{content:"\FAA9"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-database-refresh:before{content:"\FCDB"}.mdi-database-remove:before{content:"\FCDC"}.mdi-database-search:before{content:"\F865"}.mdi-database-settings:before{content:"\FCDD"}.mdi-death-star:before{content:"\F8D7"}.mdi-death-star-variant:before{content:"\F8D8"}.mdi-deathly-hallows:before{content:"\FB63"}.mdi-debian:before{content:"\F8D9"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-circle-outline:before{content:"\FB64"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-forever-outline:before{content:"\FB65"}.mdi-delete-outline:before{content:"\F9E6"}.mdi-delete-restore:before{content:"\F818"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-sweep-outline:before{content:"\FC3E"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-desk-lamp:before{content:"\F95E"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-classic:before{content:"\F7BF"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-mac-dashboard:before{content:"\F9E7"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-desktop-tower-monitor:before{content:"\FAAA"}.mdi-details:before{content:"\F1C6"}.mdi-dev-to:before{content:"\FD4A"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diameter:before{content:"\FC3F"}.mdi-diameter-outline:before{content:"\FC40"}.mdi-diameter-variant:before{content:"\FC41"}.mdi-diamond:before{content:"\FB66"}.mdi-diamond-outline:before{content:"\FB67"}.mdi-diamond-stone:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d12:before{content:"\F866"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-dip-switch:before{content:"\F7C0"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-disc:before{content:"\F5EE"}.mdi-disc-alert:before{content:"\F1D1"}.mdi-disc-player:before{content:"\F95F"}.mdi-discord:before{content:"\F66F"}.mdi-dishwasher:before{content:"\FAAB"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-diving-flippers:before{content:"\FD9B"}.mdi-diving-helmet:before{content:"\FD9C"}.mdi-diving-scuba:before{content:"\FD9D"}.mdi-diving-scuba-flag:before{content:"\FD9E"}.mdi-diving-scuba-tank:before{content:"\FD9F"}.mdi-diving-scuba-tank-multiple:before{content:"\FDA0"}.mdi-diving-snorkel:before{content:"\FDA1"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dlna:before{content:"\FA40"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-dns-outline:before{content:"\FB68"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-docker:before{content:"\F867"}.mdi-doctor:before{content:"\FA41"}.mdi-dog:before{content:"\FA42"}.mdi-dog-service:before{content:"\FAAC"}.mdi-dog-side:before{content:"\FA43"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-domain-off:before{content:"\FD4B"}.mdi-donkey:before{content:"\F7C1"}.mdi-door:before{content:"\F819"}.mdi-door-closed:before{content:"\F81A"}.mdi-door-open:before{content:"\F81B"}.mdi-doorbell-video:before{content:"\F868"}.mdi-dot-net:before{content:"\FAAD"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-horizontal-circle:before{content:"\F7C2"}.mdi-dots-horizontal-circle-outline:before{content:"\FB69"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-dots-vertical-circle:before{content:"\F7C3"}.mdi-dots-vertical-circle-outline:before{content:"\FB6A"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-multiple:before{content:"\F9E8"}.mdi-download-network:before{content:"\F6F3"}.mdi-download-network-outline:before{content:"\FC42"}.mdi-download-outline:before{content:"\FB6B"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-variant:before{content:"\FB6C"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drama-masks:before{content:"\FCDE"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-dump-truck:before{content:"\FC43"}.mdi-ear-hearing:before{content:"\F7C4"}.mdi-ear-hearing-off:before{content:"\FA44"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-egg:before{content:"\FAAE"}.mdi-egg-easter:before{content:"\FAAF"}.mdi-eight-track:before{content:"\F9E9"}.mdi-eject:before{content:"\F1EA"}.mdi-eject-outline:before{content:"\FB6D"}.mdi-elephant:before{content:"\F7C5"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-box:before{content:"\FCDF"}.mdi-email-check:before{content:"\FAB0"}.mdi-email-check-outline:before{content:"\FAB1"}.mdi-email-lock:before{content:"\F1F1"}.mdi-email-mark-as-unread:before{content:"\FB6E"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-plus:before{content:"\F9EA"}.mdi-email-plus-outline:before{content:"\F9EB"}.mdi-email-search:before{content:"\F960"}.mdi-email-search-outline:before{content:"\F961"}.mdi-email-variant:before{content:"\F5F0"}.mdi-ember:before{content:"\FB15"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\FC44"}.mdi-emoticon-angry:before{content:"\FC45"}.mdi-emoticon-angry-outline:before{content:"\FC46"}.mdi-emoticon-cool:before{content:"\FC47"}.mdi-emoticon-cool-outline:before{content:"\F1F3"}.mdi-emoticon-cry:before{content:"\FC48"}.mdi-emoticon-cry-outline:before{content:"\FC49"}.mdi-emoticon-dead:before{content:"\FC4A"}.mdi-emoticon-dead-outline:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\FC4B"}.mdi-emoticon-devil-outline:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\FC4C"}.mdi-emoticon-excited-outline:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\FC4D"}.mdi-emoticon-happy-outline:before{content:"\F1F5"}.mdi-emoticon-kiss:before{content:"\FC4E"}.mdi-emoticon-kiss-outline:before{content:"\FC4F"}.mdi-emoticon-neutral:before{content:"\FC50"}.mdi-emoticon-neutral-outline:before{content:"\F1F6"}.mdi-emoticon-outline:before{content:"\F1F2"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-poop-outline:before{content:"\FC51"}.mdi-emoticon-sad:before{content:"\FC52"}.mdi-emoticon-sad-outline:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-emoticon-tongue-outline:before{content:"\FC53"}.mdi-emoticon-wink:before{content:"\FC54"}.mdi-emoticon-wink-outline:before{content:"\FC55"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-off:before{content:"\FA45"}.mdi-engine-off-outline:before{content:"\FA46"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-eslint:before{content:"\FC56"}.mdi-et:before{content:"\FAB2"}.mdi-ethereum:before{content:"\F869"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-eventbrite:before{content:"\F7C6"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-run:before{content:"\FA47"}.mdi-exit-to-app:before{content:"\F206"}.mdi-expand-all:before{content:"\FAB3"}.mdi-expand-all-outline:before{content:"\FAB4"}.mdi-exponent:before{content:"\F962"}.mdi-exponent-box:before{content:"\F963"}.mdi-export:before{content:"\F207"}.mdi-export-variant:before{content:"\FB6F"}.mdi-eye:before{content:"\F208"}.mdi-eye-check:before{content:"\FCE0"}.mdi-eye-check-outline:before{content:"\FCE1"}.mdi-eye-circle:before{content:"\FB70"}.mdi-eye-circle-outline:before{content:"\FB71"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eye-plus:before{content:"\F86A"}.mdi-eye-plus-outline:before{content:"\F86B"}.mdi-eye-settings:before{content:"\F86C"}.mdi-eye-settings-outline:before{content:"\F86D"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-agent:before{content:"\FD4C"}.mdi-face-outline:before{content:"\FB72"}.mdi-face-profile:before{content:"\F644"}.mdi-face-recognition:before{content:"\FC57"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-facebook-workplace:before{content:"\FB16"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fan-off:before{content:"\F81C"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-10:before{content:"\FD4D"}.mdi-fast-forward-30:before{content:"\FCE2"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-feature-search:before{content:"\FA48"}.mdi-feature-search-outline:before{content:"\FA49"}.mdi-fedora:before{content:"\F8DA"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-alert:before{content:"\FA4A"}.mdi-file-alert-outline:before{content:"\FA4B"}.mdi-file-cabinet:before{content:"\FAB5"}.mdi-file-cancel:before{content:"\FDA2"}.mdi-file-cancel-outline:before{content:"\FDA3"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-compare:before{content:"\F8A9"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-document-box-multiple:before{content:"\FAB6"}.mdi-file-document-box-multiple-outline:before{content:"\FAB7"}.mdi-file-document-box-outline:before{content:"\F9EC"}.mdi-file-document-edit:before{content:"\FDA4"}.mdi-file-document-edit-outline:before{content:"\FDA5"}.mdi-file-document-outline:before{content:"\F9ED"}.mdi-file-download:before{content:"\F964"}.mdi-file-download-outline:before{content:"\F965"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-eye:before{content:"\FDA6"}.mdi-file-eye-outline:before{content:"\FDA7"}.mdi-file-find:before{content:"\F21E"}.mdi-file-find-outline:before{content:"\FB73"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-move:before{content:"\FAB8"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-percent:before{content:"\F81D"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-question:before{content:"\F86E"}.mdi-file-remove:before{content:"\FB74"}.mdi-file-replace:before{content:"\FB17"}.mdi-file-replace-outline:before{content:"\FB18"}.mdi-file-restore:before{content:"\F670"}.mdi-file-search:before{content:"\FC58"}.mdi-file-search-outline:before{content:"\FC59"}.mdi-file-send:before{content:"\F22A"}.mdi-file-table:before{content:"\FC5A"}.mdi-file-table-outline:before{content:"\FC5B"}.mdi-file-tree:before{content:"\F645"}.mdi-file-undo:before{content:"\F8DB"}.mdi-file-upload:before{content:"\FA4C"}.mdi-file-upload-outline:before{content:"\FA4D"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-finance:before{content:"\F81E"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-fire-truck:before{content:"\F8AA"}.mdi-firebase:before{content:"\F966"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-minus:before{content:"\FB75"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-plus:before{content:"\FB76"}.mdi-flag-remove:before{content:"\FB77"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flag-variant-outline:before{content:"\F23E"}.mdi-flare:before{content:"\FD4E"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-circle:before{content:"\F81F"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flickr:before{content:"\FCE3"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floor-lamp:before{content:"\F8DC"}.mdi-floor-plan:before{content:"\F820"}.mdi-floppy:before{content:"\F249"}.mdi-floppy-variant:before{content:"\F9EE"}.mdi-flower:before{content:"\F24A"}.mdi-flower-outline:before{content:"\F9EF"}.mdi-flower-poppy:before{content:"\FCE4"}.mdi-flower-tulip:before{content:"\F9F0"}.mdi-flower-tulip-outline:before{content:"\F9F1"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-account-outline:before{content:"\FB78"}.mdi-folder-alert:before{content:"\FDA8"}.mdi-folder-alert-outline:before{content:"\FDA9"}.mdi-folder-clock:before{content:"\FAB9"}.mdi-folder-clock-outline:before{content:"\FABA"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-edit:before{content:"\F8DD"}.mdi-folder-edit-outline:before{content:"\FDAA"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-key:before{content:"\F8AB"}.mdi-folder-key-network:before{content:"\F8AC"}.mdi-folder-key-network-outline:before{content:"\FC5C"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-network:before{content:"\F86F"}.mdi-folder-network-outline:before{content:"\FC5D"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-open-outline:before{content:"\FDAB"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-plus-outline:before{content:"\FB79"}.mdi-folder-pound:before{content:"\FCE5"}.mdi-folder-pound-outline:before{content:"\FCE6"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-remove-outline:before{content:"\FB7A"}.mdi-folder-search:before{content:"\F967"}.mdi-folder-search-outline:before{content:"\F968"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-star-outline:before{content:"\FB7B"}.mdi-folder-sync:before{content:"\FCE7"}.mdi-folder-sync-outline:before{content:"\FCE8"}.mdi-folder-text:before{content:"\FC5E"}.mdi-folder-text-outline:before{content:"\FC5F"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-apple-outline:before{content:"\FC60"}.mdi-food-croissant:before{content:"\F7C7"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-forklift:before{content:"\F7C8"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-minus:before{content:"\FABB"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-columns:before{content:"\F8DE"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-font-size-decrease:before{content:"\F9F2"}.mdi-format-font-size-increase:before{content:"\F9F3"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-letter-case:before{content:"\FB19"}.mdi-format-letter-case-lower:before{content:"\FB1A"}.mdi-format-letter-case-upper:before{content:"\FB1B"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-square:before{content:"\FDAC"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checkbox:before{content:"\F969"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbered:before{content:"\F27B"}.mdi-format-list-numbered-rtl:before{content:"\FCE9"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-text-rotation-down:before{content:"\FD4F"}.mdi-format-text-rotation-none:before{content:"\FD50"}.mdi-format-text-wrapping-clip:before{content:"\FCEA"}.mdi-format-text-wrapping-overflow:before{content:"\FCEB"}.mdi-format-text-wrapping-wrap:before{content:"\FCEC"}.mdi-format-textbox:before{content:"\FCED"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forum-outline:before{content:"\F821"}.mdi-forward:before{content:"\F28D"}.mdi-forwardburger:before{content:"\FD51"}.mdi-fountain:before{content:"\F96A"}.mdi-fountain-pen:before{content:"\FCEE"}.mdi-fountain-pen-tip:before{content:"\FCEF"}.mdi-foursquare:before{content:"\F28E"}.mdi-freebsd:before{content:"\F8DF"}.mdi-fridge:before{content:"\F290"}.mdi-fridge-bottom:before{content:"\F292"}.mdi-fridge-outline:before{content:"\F28F"}.mdi-fridge-top:before{content:"\F291"}.mdi-fuel:before{content:"\F7C9"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-function-variant:before{content:"\F870"}.mdi-fuse:before{content:"\FC61"}.mdi-fuse-blade:before{content:"\FC62"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-gantry-crane:before{content:"\FDAD"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-alert:before{content:"\F871"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gate-and:before{content:"\F8E0"}.mdi-gate-nand:before{content:"\F8E1"}.mdi-gate-nor:before{content:"\F8E2"}.mdi-gate-not:before{content:"\F8E3"}.mdi-gate-or:before{content:"\F8E4"}.mdi-gate-xnor:before{content:"\F8E5"}.mdi-gate-xor:before{content:"\F8E6"}.mdi-gauge:before{content:"\F29A"}.mdi-gauge-empty:before{content:"\F872"}.mdi-gauge-full:before{content:"\F873"}.mdi-gauge-low:before{content:"\F874"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gentoo:before{content:"\F8E7"}.mdi-gesture:before{content:"\F7CA"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-pinch:before{content:"\FABC"}.mdi-gesture-spread:before{content:"\FABD"}.mdi-gesture-swipe:before{content:"\FD52"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-horizontal:before{content:"\FABE"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-swipe-vertical:before{content:"\FABF"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-tap-hold:before{content:"\FD53"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-ghost-off:before{content:"\F9F4"}.mdi-gif:before{content:"\FD54"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-gitlab:before{content:"\FB7C"}.mdi-glass-cocktail:before{content:"\F356"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glass-wine:before{content:"\F875"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-globe-model:before{content:"\F8E8"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-go-kart:before{content:"\FD55"}.mdi-go-kart-track:before{content:"\FD56"}.mdi-gog:before{content:"\FB7D"}.mdi-golf:before{content:"\F822"}.mdi-gondola:before{content:"\F685"}.mdi-goodreads:before{content:"\FD57"}.mdi-google:before{content:"\F2AD"}.mdi-google-adwords:before{content:"\FC63"}.mdi-google-allo:before{content:"\F801"}.mdi-google-analytics:before{content:"\F7CB"}.mdi-google-assistant:before{content:"\F7CC"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-classroom:before{content:"\F2C0"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-fit:before{content:"\F96B"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-hangouts:before{content:"\F2C9"}.mdi-google-home:before{content:"\F823"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-lens:before{content:"\F9F5"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-spreadsheet:before{content:"\F9F6"}.mdi-google-street-view:before{content:"\FC64"}.mdi-google-translate:before{content:"\F2BF"}.mdi-gpu:before{content:"\F8AD"}.mdi-gradient:before{content:"\F69F"}.mdi-grain:before{content:"\FD58"}.mdi-graphql:before{content:"\F876"}.mdi-grave-stone:before{content:"\FB7E"}.mdi-grease-pencil:before{content:"\F648"}.mdi-greater-than:before{content:"\F96C"}.mdi-greater-than-or-equal:before{content:"\F96D"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-guy-fawkes-mask:before{content:"\F824"}.mdi-hackernews:before{content:"\F624"}.mdi-hail:before{content:"\FAC0"}.mdi-halloween:before{content:"\FB7F"}.mdi-hamburger:before{content:"\F684"}.mdi-hammer:before{content:"\F8E9"}.mdi-hand:before{content:"\FA4E"}.mdi-hand-okay:before{content:"\FA4F"}.mdi-hand-peace:before{content:"\FA50"}.mdi-hand-peace-variant:before{content:"\FA51"}.mdi-hand-pointing-down:before{content:"\FA52"}.mdi-hand-pointing-left:before{content:"\FA53"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hand-pointing-up:before{content:"\FA54"}.mdi-hanger:before{content:"\F2C8"}.mdi-hard-hat:before{content:"\F96E"}.mdi-harddisk:before{content:"\F2CA"}.mdi-hat-fedora:before{content:"\FB80"}.mdi-hazard-lights:before{content:"\FC65"}.mdi-hdr:before{content:"\FD59"}.mdi-hdr-off:before{content:"\FD5A"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-bluetooth:before{content:"\F96F"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-off:before{content:"\F7CD"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-broken-outline:before{content:"\FCF0"}.mdi-heart-circle:before{content:"\F970"}.mdi-heart-circle-outline:before{content:"\F971"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-multiple:before{content:"\FA55"}.mdi-heart-multiple-outline:before{content:"\FA56"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-helicopter:before{content:"\FAC1"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-help-network-outline:before{content:"\FC66"}.mdi-help-rhombus:before{content:"\FB81"}.mdi-help-rhombus-outline:before{content:"\FB82"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-hexagon-slice-1:before{content:"\FAC2"}.mdi-hexagon-slice-2:before{content:"\FAC3"}.mdi-hexagon-slice-3:before{content:"\FAC4"}.mdi-hexagon-slice-4:before{content:"\FAC5"}.mdi-hexagon-slice-5:before{content:"\FAC6"}.mdi-hexagon-slice-6:before{content:"\FAC7"}.mdi-hexagram:before{content:"\FAC8"}.mdi-hexagram-outline:before{content:"\FAC9"}.mdi-high-definition:before{content:"\F7CE"}.mdi-high-definition-box:before{content:"\F877"}.mdi-highway:before{content:"\F5F7"}.mdi-hiking:before{content:"\FD5B"}.mdi-hinduism:before{content:"\F972"}.mdi-history:before{content:"\F2DA"}.mdi-hockey-puck:before{content:"\F878"}.mdi-hockey-sticks:before{content:"\F879"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-account:before{content:"\F825"}.mdi-home-alert:before{content:"\F87A"}.mdi-home-assistant:before{content:"\F7CF"}.mdi-home-automation:before{content:"\F7D0"}.mdi-home-circle:before{content:"\F7D1"}.mdi-home-city:before{content:"\FCF1"}.mdi-home-city-outline:before{content:"\FCF2"}.mdi-home-currency-usd:before{content:"\F8AE"}.mdi-home-floor-0:before{content:"\FDAE"}.mdi-home-floor-1:before{content:"\FD5C"}.mdi-home-floor-2:before{content:"\FD5D"}.mdi-home-floor-3:before{content:"\FD5E"}.mdi-home-floor-a:before{content:"\FD5F"}.mdi-home-floor-b:before{content:"\FD60"}.mdi-home-floor-g:before{content:"\FD61"}.mdi-home-floor-l:before{content:"\FD62"}.mdi-home-floor-negative-1:before{content:"\FDAF"}.mdi-home-group:before{content:"\FDB0"}.mdi-home-heart:before{content:"\F826"}.mdi-home-lock:before{content:"\F8EA"}.mdi-home-lock-open:before{content:"\F8EB"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-minus:before{content:"\F973"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-plus:before{content:"\F974"}.mdi-home-variant:before{content:"\F2DE"}.mdi-home-variant-outline:before{content:"\FB83"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-horseshoe:before{content:"\FA57"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hot-tub:before{content:"\F827"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-hubspot:before{content:"\FCF3"}.mdi-hulu:before{content:"\F828"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-female-boy:before{content:"\FA58"}.mdi-human-female-female:before{content:"\FA59"}.mdi-human-female-girl:before{content:"\FA5A"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-boy:before{content:"\FA5B"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-male-girl:before{content:"\FA5C"}.mdi-human-male-male:before{content:"\FA5D"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-ice-cream:before{content:"\F829"}.mdi-iframe:before{content:"\FC67"}.mdi-iframe-outline:before{content:"\FC68"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-move:before{content:"\F9F7"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-image-off:before{content:"\F82A"}.mdi-image-outline:before{content:"\F975"}.mdi-image-plus:before{content:"\F87B"}.mdi-image-search:before{content:"\F976"}.mdi-image-search-outline:before{content:"\F977"}.mdi-image-size-select-actual:before{content:"\FC69"}.mdi-image-size-select-large:before{content:"\FC6A"}.mdi-image-size-select-small:before{content:"\FC6B"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-inbox-multiple:before{content:"\F8AF"}.mdi-inbox-multiple-outline:before{content:"\FB84"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-ip:before{content:"\FA5E"}.mdi-ip-network:before{content:"\FA5F"}.mdi-ip-network-outline:before{content:"\FC6C"}.mdi-ipod:before{content:"\FC6D"}.mdi-islam:before{content:"\F978"}.mdi-itunes:before{content:"\F676"}.mdi-jabber:before{content:"\FDB1"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jquery:before{content:"\F87C"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-judaism:before{content:"\F979"}.mdi-kabaddi:before{content:"\FD63"}.mdi-karate:before{content:"\F82B"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-outline:before{content:"\FDB2"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-outline:before{content:"\F97A"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-settings:before{content:"\F9F8"}.mdi-keyboard-settings-outline:before{content:"\F9F9"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-knife:before{content:"\F9FA"}.mdi-knife-military:before{content:"\F9FB"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-off:before{content:"\FACA"}.mdi-label-off-outline:before{content:"\FACB"}.mdi-label-outline:before{content:"\F316"}.mdi-label-variant:before{content:"\FACC"}.mdi-label-variant-outline:before{content:"\FACD"}.mdi-ladybug:before{content:"\F82C"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-go:before{content:"\F7D2"}.mdi-language-haskell:before{content:"\FC6E"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-java:before{content:"\FB1C"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-lua:before{content:"\F8B0"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-r:before{content:"\F7D3"}.mdi-language-ruby-on-rails:before{content:"\FACE"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-laravel:before{content:"\FACF"}.mdi-lastfm:before{content:"\F326"}.mdi-lastpass:before{content:"\F446"}.mdi-launch:before{content:"\F327"}.mdi-lava-lamp:before{content:"\F7D4"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-layers-off-outline:before{content:"\F9FC"}.mdi-layers-outline:before{content:"\F9FD"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-leaf-maple:before{content:"\FC6F"}.mdi-leak:before{content:"\FDB3"}.mdi-leak-off:before{content:"\FDB4"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-strip:before{content:"\F7D5"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-less-than:before{content:"\F97B"}.mdi-less-than-or-equal:before{content:"\F97C"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-movie:before{content:"\FCF4"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-library-shelves:before{content:"\FB85"}.mdi-library-video:before{content:"\FCF5"}.mdi-lifebuoy:before{content:"\F87D"}.mdi-light-switch:before{content:"\F97D"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-lighthouse:before{content:"\F9FE"}.mdi-lighthouse-on:before{content:"\F9FF"}.mdi-link:before{content:"\F337"}.mdi-link-box:before{content:"\FCF6"}.mdi-link-box-outline:before{content:"\FCF7"}.mdi-link-box-variant:before{content:"\FCF8"}.mdi-link-box-variant-outline:before{content:"\FCF9"}.mdi-link-off:before{content:"\F338"}.mdi-link-plus:before{content:"\FC70"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-linux-mint:before{content:"\F8EC"}.mdi-litecoin:before{content:"\FA60"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-alert:before{content:"\F8ED"}.mdi-lock-clock:before{content:"\F97E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-question:before{content:"\F8EE"}.mdi-lock-reset:before{content:"\F772"}.mdi-lock-smart:before{content:"\F8B1"}.mdi-locker:before{content:"\F7D6"}.mdi-locker-multiple:before{content:"\F7D7"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-lyft:before{content:"\FB1D"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-close:before{content:"\F97F"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-cursor:before{content:"\FA61"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-cursor:before{content:"\FA62"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-mailbox-open:before{content:"\FD64"}.mdi-mailbox-open-outline:before{content:"\FD65"}.mdi-mailbox-open-up:before{content:"\FD66"}.mdi-mailbox-open-up-outline:before{content:"\FD67"}.mdi-mailbox-outline:before{content:"\FD68"}.mdi-mailbox-up:before{content:"\FD69"}.mdi-mailbox-up-outline:before{content:"\FD6A"}.mdi-map:before{content:"\F34D"}.mdi-map-clock:before{content:"\FCFA"}.mdi-map-clock-outline:before{content:"\FCFB"}.mdi-map-legend:before{content:"\FA00"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-check:before{content:"\FC71"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-distance:before{content:"\F8EF"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-outline:before{content:"\F7D8"}.mdi-map-marker-path:before{content:"\FCFC"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-map-minus:before{content:"\F980"}.mdi-map-outline:before{content:"\F981"}.mdi-map-plus:before{content:"\F982"}.mdi-map-search:before{content:"\F983"}.mdi-map-search-outline:before{content:"\F984"}.mdi-mapbox:before{content:"\FB86"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-cancel:before{content:"\FDB5"}.mdi-marker-check:before{content:"\F355"}.mdi-mastodon:before{content:"\FAD0"}.mdi-mastodon-variant:before{content:"\FAD1"}.mdi-material-design:before{content:"\F985"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-math-cos:before{content:"\FC72"}.mdi-math-sin:before{content:"\FC73"}.mdi-math-tan:before{content:"\FC74"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medal:before{content:"\F986"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-meetup:before{content:"\FAD2"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-left-outline:before{content:"\FA01"}.mdi-menu-open:before{content:"\FB87"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-right-outline:before{content:"\FA02"}.mdi-menu-swap:before{content:"\FA63"}.mdi-menu-swap-outline:before{content:"\FA64"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-alert-outline:before{content:"\FA03"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-metronome:before{content:"\F7D9"}.mdi-metronome-tick:before{content:"\F7DA"}.mdi-micro-sd:before{content:"\F7DB"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-minus:before{content:"\F8B2"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-plus:before{content:"\F8B3"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-microsoft-dynamics:before{content:"\F987"}.mdi-microwave:before{content:"\FC75"}.mdi-midi:before{content:"\F8F0"}.mdi-midi-port:before{content:"\F8F1"}.mdi-mine:before{content:"\FDB6"}.mdi-minecraft:before{content:"\F373"}.mdi-mini-sd:before{content:"\FA04"}.mdi-minidisc:before{content:"\FA05"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-minus-network-outline:before{content:"\FC76"}.mdi-mixcloud:before{content:"\F62A"}.mdi-mixed-martial-arts:before{content:"\FD6B"}.mdi-mixed-reality:before{content:"\F87E"}.mdi-mixer:before{content:"\F7DC"}.mdi-molecule:before{content:"\FB88"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-cellphone:before{content:"\F988"}.mdi-monitor-cellphone-star:before{content:"\F989"}.mdi-monitor-dashboard:before{content:"\FA06"}.mdi-monitor-lock:before{content:"\FDB7"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-monitor-off:before{content:"\FD6C"}.mdi-monitor-star:before{content:"\FDB8"}.mdi-more:before{content:"\F37B"}.mdi-mother-nurse:before{content:"\FCFD"}.mdi-motion-sensor:before{content:"\FD6D"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-bluetooth:before{content:"\F98A"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-movie-outline:before{content:"\FDB9"}.mdi-movie-roll:before{content:"\F7DD"}.mdi-muffin:before{content:"\F98B"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-mushroom:before{content:"\F7DE"}.mdi-mushroom-outline:before{content:"\F7DF"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-circle-outline:before{content:"\FAD3"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-plus:before{content:"\FDBA"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nail:before{content:"\FDBB"}.mdi-nas:before{content:"\F8F2"}.mdi-nativescript:before{content:"\F87F"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-network-off:before{content:"\FC77"}.mdi-network-off-outline:before{content:"\FC78"}.mdi-network-outline:before{content:"\FC79"}.mdi-network-strength-1:before{content:"\F8F3"}.mdi-network-strength-1-alert:before{content:"\F8F4"}.mdi-network-strength-2:before{content:"\F8F5"}.mdi-network-strength-2-alert:before{content:"\F8F6"}.mdi-network-strength-3:before{content:"\F8F7"}.mdi-network-strength-3-alert:before{content:"\F8F8"}.mdi-network-strength-4:before{content:"\F8F9"}.mdi-network-strength-4-alert:before{content:"\F8FA"}.mdi-network-strength-off:before{content:"\F8FB"}.mdi-network-strength-off-outline:before{content:"\F8FC"}.mdi-network-strength-outline:before{content:"\F8FD"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nintendo-switch:before{content:"\F7E0"}.mdi-nodejs:before{content:"\F399"}.mdi-not-equal:before{content:"\F98C"}.mdi-not-equal-variant:before{content:"\F98D"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notebook:before{content:"\F82D"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-npm-variant:before{content:"\F98E"}.mdi-npm-variant-outline:before{content:"\F98F"}.mdi-nuke:before{content:"\F6A3"}.mdi-null:before{content:"\F7E1"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0:before{content:"\30"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-0-circle:before{content:"\FC7A"}.mdi-numeric-0-circle-outline:before{content:"\FC7B"}.mdi-numeric-1:before{content:"\31"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-1-circle:before{content:"\FC7C"}.mdi-numeric-1-circle-outline:before{content:"\FC7D"}.mdi-numeric-2:before{content:"\32"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-2-circle:before{content:"\FC7E"}.mdi-numeric-2-circle-outline:before{content:"\FC7F"}.mdi-numeric-3:before{content:"\33"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-3-circle:before{content:"\FC80"}.mdi-numeric-3-circle-outline:before{content:"\FC81"}.mdi-numeric-4:before{content:"\34"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-4-circle:before{content:"\FC82"}.mdi-numeric-4-circle-outline:before{content:"\FC83"}.mdi-numeric-5:before{content:"\35"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-5-circle:before{content:"\FC84"}.mdi-numeric-5-circle-outline:before{content:"\FC85"}.mdi-numeric-6:before{content:"\36"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-6-circle:before{content:"\FC86"}.mdi-numeric-6-circle-outline:before{content:"\FC87"}.mdi-numeric-7:before{content:"\37"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-7-circle:before{content:"\FC88"}.mdi-numeric-7-circle-outline:before{content:"\FC89"}.mdi-numeric-8:before{content:"\38"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-8-circle:before{content:"\FC8A"}.mdi-numeric-8-circle-outline:before{content:"\FC8B"}.mdi-numeric-9:before{content:"\39"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-circle:before{content:"\FC8C"}.mdi-numeric-9-circle-outline:before{content:"\FC8D"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-numeric-9-plus-circle:before{content:"\FC8E"}.mdi-numeric-9-plus-circle-outline:before{content:"\FC8F"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-ocarina:before{content:"\FDBC"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-office-building:before{content:"\F990"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-one-up:before{content:"\FB89"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-onepassword:before{content:"\F880"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-open-source-initiative:before{content:"\FB8A"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-origin:before{content:"\FB2B"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-outlook:before{content:"\FCFE"}.mdi-owl:before{content:"\F3D2"}.mdi-pac-man:before{content:"\FB8B"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-page-next:before{content:"\FB8C"}.mdi-page-next-outline:before{content:"\FB8D"}.mdi-page-previous:before{content:"\FB8E"}.mdi-page-previous-outline:before{content:"\FB8F"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-palette-outline:before{content:"\FDE8"}.mdi-palette-swatch:before{content:"\F8B4"}.mdi-pan:before{content:"\FB90"}.mdi-pan-bottom-left:before{content:"\FB91"}.mdi-pan-bottom-right:before{content:"\FB92"}.mdi-pan-down:before{content:"\FB93"}.mdi-pan-horizontal:before{content:"\FB94"}.mdi-pan-left:before{content:"\FB95"}.mdi-pan-right:before{content:"\FB96"}.mdi-pan-top-left:before{content:"\FB97"}.mdi-pan-top-right:before{content:"\FB98"}.mdi-pan-up:before{content:"\FB99"}.mdi-pan-vertical:before{content:"\FB9A"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parachute:before{content:"\FC90"}.mdi-parachute-outline:before{content:"\FC91"}.mdi-parking:before{content:"\F3E3"}.mdi-passport:before{content:"\F7E2"}.mdi-passport-biometric:before{content:"\FDBD"}.mdi-patreon:before{content:"\F881"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-paypal:before{content:"\F882"}.mdi-peace:before{content:"\F883"}.mdi-pen:before{content:"\F3EA"}.mdi-pen-lock:before{content:"\FDBE"}.mdi-pen-minus:before{content:"\FDBF"}.mdi-pen-off:before{content:"\FDC0"}.mdi-pen-plus:before{content:"\FDC1"}.mdi-pen-remove:before{content:"\FDC2"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-lock-outline:before{content:"\FDC3"}.mdi-pencil-minus:before{content:"\FDC4"}.mdi-pencil-minus-outline:before{content:"\FDC5"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pencil-off-outline:before{content:"\FDC6"}.mdi-pencil-outline:before{content:"\FC92"}.mdi-pencil-plus:before{content:"\FDC7"}.mdi-pencil-plus-outline:before{content:"\FDC8"}.mdi-pencil-remove:before{content:"\FDC9"}.mdi-pencil-remove-outline:before{content:"\FDCA"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periodic-table:before{content:"\F8B5"}.mdi-periodic-table-co2:before{content:"\F7E3"}.mdi-periscope:before{content:"\F747"}.mdi-perspective-less:before{content:"\FCFF"}.mdi-perspective-more:before{content:"\FD00"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-lock:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-off:before{content:"\FDCB"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-outline:before{content:"\FDCC"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-return:before{content:"\F82E"}.mdi-phone-rotate-landscape:before{content:"\F884"}.mdi-phone-rotate-portrait:before{content:"\F885"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-pi-hole:before{content:"\FDCD"}.mdi-piano:before{content:"\F67C"}.mdi-pickaxe:before{content:"\F8B6"}.mdi-pier:before{content:"\F886"}.mdi-pier-crane:before{content:"\F887"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pin-off-outline:before{content:"\F92F"}.mdi-pin-outline:before{content:"\F930"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pinwheel:before{content:"\FAD4"}.mdi-pinwheel-outline:before{content:"\FAD5"}.mdi-pipe:before{content:"\F7E4"}.mdi-pipe-disconnected:before{content:"\F7E5"}.mdi-pipe-leak:before{content:"\F888"}.mdi-pirate:before{content:"\FA07"}.mdi-pistol:before{content:"\F702"}.mdi-piston:before{content:"\F889"}.mdi-pizza:before{content:"\F409"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-network:before{content:"\F88A"}.mdi-play-network-outline:before{content:"\FC93"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-play-speed:before{content:"\F8FE"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-edit:before{content:"\F8FF"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-music:before{content:"\FC94"}.mdi-playlist-music-outline:before{content:"\FC95"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playlist-star:before{content:"\FDCE"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-minus:before{content:"\F991"}.mdi-plus-minus-box:before{content:"\F992"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-network-outline:before{content:"\FC96"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-podcast:before{content:"\F993"}.mdi-podium:before{content:"\FD01"}.mdi-podium-bronze:before{content:"\FD02"}.mdi-podium-gold:before{content:"\FD03"}.mdi-podium-silver:before{content:"\FD04"}.mdi-point-of-sale:before{content:"\FD6E"}.mdi-pokeball:before{content:"\F41D"}.mdi-pokemon-go:before{content:"\FA08"}.mdi-poker-chip:before{content:"\F82F"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-postage-stamp:before{content:"\FC97"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-cycle:before{content:"\F900"}.mdi-power-off:before{content:"\F901"}.mdi-power-on:before{content:"\F902"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-sleep:before{content:"\F903"}.mdi-power-socket:before{content:"\F427"}.mdi-power-socket-au:before{content:"\F904"}.mdi-power-socket-eu:before{content:"\F7E6"}.mdi-power-socket-uk:before{content:"\F7E7"}.mdi-power-socket-us:before{content:"\F7E8"}.mdi-power-standby:before{content:"\F905"}.mdi-powershell:before{content:"\FA09"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-printer-wireless:before{content:"\FA0A"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-progress-alert:before{content:"\FC98"}.mdi-progress-check:before{content:"\F994"}.mdi-progress-clock:before{content:"\F995"}.mdi-progress-download:before{content:"\F996"}.mdi-progress-upload:before{content:"\F997"}.mdi-progress-wrench:before{content:"\FC99"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-pumpkin:before{content:"\FB9B"}.mdi-puzzle:before{content:"\F431"}.mdi-puzzle-outline:before{content:"\FA65"}.mdi-qi:before{content:"\F998"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-edit:before{content:"\F8B7"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quality-low:before{content:"\FA0B"}.mdi-quality-medium:before{content:"\FA0C"}.mdi-quicktime:before{content:"\F436"}.mdi-quora:before{content:"\FD05"}.mdi-rabbit:before{content:"\F906"}.mdi-racing-helmet:before{content:"\FD6F"}.mdi-racquetball:before{content:"\FD70"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radiator-disabled:before{content:"\FAD6"}.mdi-radiator-off:before{content:"\FAD7"}.mdi-radio:before{content:"\F439"}.mdi-radio-am:before{content:"\FC9A"}.mdi-radio-fm:before{content:"\FC9B"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-radius:before{content:"\FC9C"}.mdi-radius-outline:before{content:"\FC9D"}.mdi-raspberry-pi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-player:before{content:"\F999"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-reflect-horizontal:before{content:"\FA0D"}.mdi-reflect-vertical:before{content:"\FA0E"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-registered-trademark:before{content:"\FA66"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-reminder:before{content:"\F88B"}.mdi-remote:before{content:"\F454"}.mdi-remote-desktop:before{content:"\F8B8"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resistor:before{content:"\FB1F"}.mdi-resistor-nodes:before{content:"\FB20"}.mdi-resize:before{content:"\FA67"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restart-off:before{content:"\FD71"}.mdi-restore:before{content:"\F99A"}.mdi-restore-clock:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-10:before{content:"\FD06"}.mdi-rewind-30:before{content:"\FD72"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-medium:before{content:"\FA0F"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-rhombus-split:before{content:"\FA10"}.mdi-ribbon:before{content:"\F460"}.mdi-rice:before{content:"\F7E9"}.mdi-ring:before{content:"\F7EA"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-robot-industrial:before{content:"\FB21"}.mdi-robot-vacuum:before{content:"\F70C"}.mdi-robot-vacuum-variant:before{content:"\F907"}.mdi-rocket:before{content:"\F463"}.mdi-roller-skate:before{content:"\FD07"}.mdi-rollerblade:before{content:"\FD08"}.mdi-rollupjs:before{content:"\FB9C"}.mdi-room-service:before{content:"\F88C"}.mdi-room-service-outline:before{content:"\FD73"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-orbit:before{content:"\FD74"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-router-wireless-settings:before{content:"\FA68"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruby:before{content:"\FD09"}.mdi-rugby:before{content:"\FD75"}.mdi-ruler:before{content:"\F46D"}.mdi-ruler-square:before{content:"\FC9E"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sack:before{content:"\FD0A"}.mdi-sack-percent:before{content:"\FD0B"}.mdi-safe:before{content:"\FA69"}.mdi-safety-goggles:before{content:"\FD0C"}.mdi-sale:before{content:"\F46F"}.mdi-salesforce:before{content:"\F88D"}.mdi-sass:before{content:"\F7EB"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-uplink:before{content:"\F908"}.mdi-satellite-variant:before{content:"\F471"}.mdi-sausage:before{content:"\F8B9"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-scanner-off:before{content:"\F909"}.mdi-school:before{content:"\F474"}.mdi-scissors-cutting:before{content:"\FA6A"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screw-flat-top:before{content:"\FDCF"}.mdi-screw-lag:before{content:"\FDD0"}.mdi-screw-machine-flat-top:before{content:"\FDD1"}.mdi-screw-machine-round-top:before{content:"\FDD2"}.mdi-screw-round-top:before{content:"\FDD3"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\FB9D"}.mdi-script-outline:before{content:"\F478"}.mdi-script-text:before{content:"\FB9E"}.mdi-script-text-outline:before{content:"\FB9F"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat:before{content:"\FC9F"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-outline:before{content:"\FCA0"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-seatbelt:before{content:"\FCA1"}.mdi-security:before{content:"\F483"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-color:before{content:"\FD0D"}.mdi-select-compare:before{content:"\FAD8"}.mdi-select-drag:before{content:"\FA6B"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-drag:before{content:"\FA6C"}.mdi-selection-ellipse:before{content:"\FD0E"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-send-circle:before{content:"\FDD4"}.mdi-send-circle-outline:before{content:"\FDD5"}.mdi-send-lock:before{content:"\F7EC"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-set-top-box:before{content:"\F99E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-settings-helper:before{content:"\FA6D"}.mdi-settings-outline:before{content:"\F8BA"}.mdi-shape:before{content:"\F830"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-outline:before{content:"\F831"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-outline:before{content:"\F931"}.mdi-share-variant:before{content:"\F497"}.mdi-sheep:before{content:"\FCA2"}.mdi-shield:before{content:"\F498"}.mdi-shield-account:before{content:"\F88E"}.mdi-shield-account-outline:before{content:"\FA11"}.mdi-shield-airplane:before{content:"\F6BA"}.mdi-shield-airplane-outline:before{content:"\FCA3"}.mdi-shield-check:before{content:"\F565"}.mdi-shield-check-outline:before{content:"\FCA4"}.mdi-shield-cross:before{content:"\FCA5"}.mdi-shield-cross-outline:before{content:"\FCA6"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-home:before{content:"\F689"}.mdi-shield-home-outline:before{content:"\FCA7"}.mdi-shield-key:before{content:"\FBA0"}.mdi-shield-key-outline:before{content:"\FBA1"}.mdi-shield-link-variant:before{content:"\FD0F"}.mdi-shield-link-variant-outline:before{content:"\FD10"}.mdi-shield-lock:before{content:"\F99C"}.mdi-shield-lock-outline:before{content:"\FCA8"}.mdi-shield-off:before{content:"\F99D"}.mdi-shield-off-outline:before{content:"\F99B"}.mdi-shield-outline:before{content:"\F499"}.mdi-shield-plus:before{content:"\FAD9"}.mdi-shield-plus-outline:before{content:"\FADA"}.mdi-shield-remove:before{content:"\FADB"}.mdi-shield-remove-outline:before{content:"\FADC"}.mdi-shield-search:before{content:"\FD76"}.mdi-ship-wheel:before{content:"\F832"}.mdi-shoe-formal:before{content:"\FB22"}.mdi-shoe-heel:before{content:"\FB23"}.mdi-shoe-print:before{content:"\FDD6"}.mdi-shopify:before{content:"\FADD"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shower:before{content:"\F99F"}.mdi-shower-head:before{content:"\F9A0"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-5g:before{content:"\FA6E"}.mdi-signal-cellular-1:before{content:"\F8BB"}.mdi-signal-cellular-2:before{content:"\F8BC"}.mdi-signal-cellular-3:before{content:"\F8BD"}.mdi-signal-cellular-outline:before{content:"\F8BE"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-signature:before{content:"\FDD7"}.mdi-signature-freehand:before{content:"\FDD8"}.mdi-signature-image:before{content:"\FDD9"}.mdi-signature-text:before{content:"\FDDA"}.mdi-silo:before{content:"\FB24"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-fork-knife:before{content:"\FA6F"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sina-weibo:before{content:"\FADE"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skate:before{content:"\FD11"}.mdi-skew-less:before{content:"\FD12"}.mdi-skew-more:before{content:"\FD13"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skull-crossbones:before{content:"\FBA2"}.mdi-skull-crossbones-outline:before{content:"\FBA3"}.mdi-skull-outline:before{content:"\FBA4"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-slackware:before{content:"\F90A"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-slope-downhill:before{content:"\FDDB"}.mdi-slope-uphill:before{content:"\FDDC"}.mdi-smog:before{content:"\FA70"}.mdi-smoke-detector:before{content:"\F392"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-soccer-field:before{content:"\F833"}.mdi-sofa:before{content:"\F4B9"}.mdi-solar-panel:before{content:"\FD77"}.mdi-solar-panel-large:before{content:"\FD78"}.mdi-solar-power:before{content:"\FA71"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-sort-variant-lock:before{content:"\FCA9"}.mdi-sort-variant-lock-open:before{content:"\FCAA"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-source-repository:before{content:"\FCAB"}.mdi-source-repository-multiple:before{content:"\FCAC"}.mdi-soy-sauce:before{content:"\F7ED"}.mdi-spa:before{content:"\FCAD"}.mdi-spa-outline:before{content:"\FCAE"}.mdi-space-invaders:before{content:"\FBA5"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-bluetooth:before{content:"\F9A1"}.mdi-speaker-multiple:before{content:"\FD14"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spider-web:before{content:"\FBA6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-spray-bottle:before{content:"\FADF"}.mdi-square:before{content:"\F763"}.mdi-square-edit-outline:before{content:"\F90B"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-medium:before{content:"\FA12"}.mdi-square-medium-outline:before{content:"\FA13"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-square-root-box:before{content:"\F9A2"}.mdi-square-small:before{content:"\FA14"}.mdi-squeegee:before{content:"\FAE0"}.mdi-ssh:before{content:"\F8BF"}.mdi-stack-exchange:before{content:"\F60B"}.mdi-stack-overflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-stamper:before{content:"\FD15"}.mdi-standard-definition:before{content:"\F7EE"}.mdi-star:before{content:"\F4CE"}.mdi-star-box:before{content:"\FA72"}.mdi-star-box-outline:before{content:"\FA73"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-circle-outline:before{content:"\F9A3"}.mdi-star-face:before{content:"\F9A4"}.mdi-star-four-points:before{content:"\FAE1"}.mdi-star-four-points-outline:before{content:"\FAE2"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-star-three-points:before{content:"\FAE3"}.mdi-star-three-points-outline:before{content:"\FAE4"}.mdi-steam:before{content:"\F4D3"}.mdi-steam-box:before{content:"\F90C"}.mdi-steering:before{content:"\F4D4"}.mdi-steering-off:before{content:"\F90D"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-strava:before{content:"\FB25"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subtitles:before{content:"\FA15"}.mdi-subtitles-outline:before{content:"\FA16"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-alert-variant:before{content:"\FD79"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-surround-sound-2-0:before{content:"\F7EF"}.mdi-surround-sound-3-1:before{content:"\F7F0"}.mdi-surround-sound-5-1:before{content:"\F7F1"}.mdi-surround-sound-7-1:before{content:"\F7F2"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-horizontal-bold:before{content:"\FBA9"}.mdi-swap-horizontal-variant:before{content:"\F8C0"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swap-vertical-bold:before{content:"\FBAA"}.mdi-swap-vertical-variant:before{content:"\F8C1"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-symfony:before{content:"\FAE5"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-minus:before{content:"\FB26"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-remove:before{content:"\FB27"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-border:before{content:"\FA17"}.mdi-table-column:before{content:"\F834"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-merge-cells:before{content:"\F9A5"}.mdi-table-of-contents:before{content:"\F835"}.mdi-table-plus:before{content:"\FA74"}.mdi-table-remove:before{content:"\FA75"}.mdi-table-row:before{content:"\F836"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-table-search:before{content:"\F90E"}.mdi-table-settings:before{content:"\F837"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-cellphone:before{content:"\F9A6"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-heart-outline:before{content:"\FBAB"}.mdi-tag-minus:before{content:"\F90F"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-tank:before{content:"\FD16"}.mdi-tape-measure:before{content:"\FB28"}.mdi-target:before{content:"\F4FE"}.mdi-target-account:before{content:"\FBAC"}.mdi-target-variant:before{content:"\FA76"}.mdi-taxi:before{content:"\F4FF"}.mdi-tea:before{content:"\FD7A"}.mdi-tea-outline:before{content:"\FD7B"}.mdi-teach:before{content:"\F88F"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-telescope:before{content:"\FB29"}.mdi-television:before{content:"\F502"}.mdi-television-box:before{content:"\F838"}.mdi-television-classic:before{content:"\F7F3"}.mdi-television-classic-off:before{content:"\F839"}.mdi-television-guide:before{content:"\F503"}.mdi-television-off:before{content:"\F83A"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\FD7C"}.mdi-tennis-ball:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-test-tube-empty:before{content:"\F910"}.mdi-test-tube-off:before{content:"\F911"}.mdi-text:before{content:"\F9A7"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-short:before{content:"\F9A8"}.mdi-text-subject:before{content:"\F9A9"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-textbox-password:before{content:"\F7F4"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-alert:before{content:"\FDDD"}.mdi-thermometer-chevron-down:before{content:"\FDDE"}.mdi-thermometer-chevron-up:before{content:"\FDDF"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thermometer-minus:before{content:"\FDE0"}.mdi-thermometer-plus:before{content:"\FDE1"}.mdi-thermostat:before{content:"\F393"}.mdi-thermostat-box:before{content:"\F890"}.mdi-thought-bubble:before{content:"\F7F5"}.mdi-thought-bubble-outline:before{content:"\F7F6"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-outline:before{content:"\F912"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timeline:before{content:"\FBAD"}.mdi-timeline-outline:before{content:"\FBAE"}.mdi-timeline-text:before{content:"\FBAF"}.mdi-timeline-text-outline:before{content:"\FBB0"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toaster-oven:before{content:"\FCAF"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-toggle-switch-off-outline:before{content:"\FA18"}.mdi-toggle-switch-outline:before{content:"\FA19"}.mdi-toilet:before{content:"\F9AA"}.mdi-toolbox:before{content:"\F9AB"}.mdi-toolbox-outline:before{content:"\F9AC"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-account:before{content:"\F00C"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-image-outline:before{content:"\FBB1"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-plus:before{content:"\FBB2"}.mdi-tooltip-plus-outline:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooltip-text-outline:before{content:"\FBB3"}.mdi-tooth:before{content:"\F8C2"}.mdi-tooth-outline:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tortoise:before{content:"\FD17"}.mdi-tournament:before{content:"\F9AD"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-towing:before{content:"\F83B"}.mdi-track-light:before{content:"\F913"}.mdi-trackpad:before{content:"\F7F7"}.mdi-trackpad-lock:before{content:"\F932"}.mdi-tractor:before{content:"\F891"}.mdi-trademark:before{content:"\FA77"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-train-car:before{content:"\FBB4"}.mdi-train-variant:before{content:"\F8C3"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer-down:before{content:"\FD7D"}.mdi-transfer-left:before{content:"\FD7E"}.mdi-transfer-right:before{content:"\F530"}.mdi-transfer-up:before{content:"\FD7F"}.mdi-transit-connection:before{content:"\FD18"}.mdi-transit-connection-variant:before{content:"\FD19"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-transition:before{content:"\F914"}.mdi-transition-masked:before{content:"\F915"}.mdi-translate:before{content:"\F5CA"}.mdi-translate-off:before{content:"\FDE2"}.mdi-transmission-tower:before{content:"\FD1A"}.mdi-trash-can:before{content:"\FA78"}.mdi-trash-can-outline:before{content:"\FA79"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-triforce:before{content:"\FBB5"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-broken:before{content:"\FD80"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-check:before{content:"\FCB0"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\FA7A"}.mdi-tshirt-crew-outline:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\FA7B"}.mdi-tshirt-v-outline:before{content:"\F540"}.mdi-tumble-dryer:before{content:"\F916"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-box:before{content:"\F917"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-turnstile:before{content:"\FCB1"}.mdi-turnstile-outline:before{content:"\FCB2"}.mdi-turtle:before{content:"\FCB3"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-two-factor-authentication:before{content:"\F9AE"}.mdi-uber:before{content:"\F748"}.mdi-ubisoft:before{content:"\FBB6"}.mdi-ubuntu:before{content:"\F548"}.mdi-ultra-high-definition:before{content:"\F7F8"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-closed:before{content:"\F9AF"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-unreal:before{content:"\F9B0"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-multiple:before{content:"\F83C"}.mdi-upload-network:before{content:"\F6F5"}.mdi-upload-network-outline:before{content:"\FCB4"}.mdi-upload-outline:before{content:"\FDE3"}.mdi-usb:before{content:"\F553"}.mdi-van-passenger:before{content:"\F7F9"}.mdi-van-utility:before{content:"\F7FA"}.mdi-vanish:before{content:"\F7FB"}.mdi-variable:before{content:"\FAE6"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-bezier:before{content:"\FAE7"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-ellipse:before{content:"\F892"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-venmo:before{content:"\F578"}.mdi-vhs:before{content:"\FA1A"}.mdi-vibrate:before{content:"\F566"}.mdi-vibrate-off:before{content:"\FCB5"}.mdi-video:before{content:"\F567"}.mdi-video-3d:before{content:"\F7FC"}.mdi-video-4k-box:before{content:"\F83D"}.mdi-video-account:before{content:"\F918"}.mdi-video-image:before{content:"\F919"}.mdi-video-input-antenna:before{content:"\F83E"}.mdi-video-input-component:before{content:"\F83F"}.mdi-video-input-hdmi:before{content:"\F840"}.mdi-video-input-svideo:before{content:"\F841"}.mdi-video-minus:before{content:"\F9B1"}.mdi-video-off:before{content:"\F568"}.mdi-video-off-outline:before{content:"\FBB7"}.mdi-video-outline:before{content:"\FBB8"}.mdi-video-plus:before{content:"\F9B2"}.mdi-video-stabilization:before{content:"\F91A"}.mdi-video-switch:before{content:"\F569"}.mdi-video-vintage:before{content:"\FA1B"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-dashboard-outline:before{content:"\FA1C"}.mdi-view-dashboard-variant:before{content:"\F842"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-split-horizontal:before{content:"\FBA7"}.mdi-view-split-vertical:before{content:"\FBA8"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-violin:before{content:"\F60F"}.mdi-virtual-reality:before{content:"\F893"}.mdi-visual-studio:before{content:"\F610"}.mdi-visual-studio-code:before{content:"\FA1D"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volleyball:before{content:"\F9B3"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-volume-variant-off:before{content:"\FDE4"}.mdi-vote:before{content:"\FA1E"}.mdi-vote-outline:before{content:"\FA1F"}.mdi-vpn:before{content:"\F582"}.mdi-vuejs:before{content:"\F843"}.mdi-walk:before{content:"\F583"}.mdi-wall:before{content:"\F7FD"}.mdi-wall-sconce:before{content:"\F91B"}.mdi-wall-sconce-flat:before{content:"\F91C"}.mdi-wall-sconce-variant:before{content:"\F91D"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-outline:before{content:"\FBB9"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wallpaper:before{content:"\FDE5"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-export-variant:before{content:"\F894"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-import-variant:before{content:"\F895"}.mdi-watch-variant:before{content:"\F896"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-watch-vibrate-off:before{content:"\FCB6"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-outline:before{content:"\FDE6"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-waze:before{content:"\FBBA"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-hurricane:before{content:"\F897"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-gram:before{content:"\FD1B"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-weight-pound:before{content:"\F9B4"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-whistle:before{content:"\F9B5"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wifi-star:before{content:"\FDE7"}.mdi-wifi-strength-1:before{content:"\F91E"}.mdi-wifi-strength-1-alert:before{content:"\F91F"}.mdi-wifi-strength-1-lock:before{content:"\F920"}.mdi-wifi-strength-2:before{content:"\F921"}.mdi-wifi-strength-2-alert:before{content:"\F922"}.mdi-wifi-strength-2-lock:before{content:"\F923"}.mdi-wifi-strength-3:before{content:"\F924"}.mdi-wifi-strength-3-alert:before{content:"\F925"}.mdi-wifi-strength-3-lock:before{content:"\F926"}.mdi-wifi-strength-4:before{content:"\F927"}.mdi-wifi-strength-4-alert:before{content:"\F928"}.mdi-wifi-strength-4-lock:before{content:"\F929"}.mdi-wifi-strength-alert-outline:before{content:"\F92A"}.mdi-wifi-strength-lock-outline:before{content:"\F92B"}.mdi-wifi-strength-off:before{content:"\F92C"}.mdi-wifi-strength-off-outline:before{content:"\F92D"}.mdi-wifi-strength-outline:before{content:"\F92E"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-wind-turbine:before{content:"\FD81"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-windows-classic:before{content:"\FA20"}.mdi-wiper:before{content:"\FAE8"}.mdi-wiper-wash:before{content:"\FD82"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrap-disabled:before{content:"\FBBB"}.mdi-wrench:before{content:"\F5B7"}.mdi-wrench-outline:before{content:"\FBBC"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xamarin:before{content:"\F844"}.mdi-xamarin-outline:before{content:"\F845"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-charging:before{content:"\FA21"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-xmpp:before{content:"\F7FE"}.mdi-yahoo:before{content:"\FB2A"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube:before{content:"\F5C3"}.mdi-youtube-creator-studio:before{content:"\F846"}.mdi-youtube-gaming:before{content:"\F847"}.mdi-youtube-subscription:before{content:"\FD1C"}.mdi-youtube-tv:before{content:"\F448"}.mdi-z-wave:before{content:"\FAE9"}.mdi-zend:before{content:"\FAEA"}.mdi-zigbee:before{content:"\FD1D"}.mdi-zip-box:before{content:"\F5C4"}.mdi-zip-disk:before{content:"\FA22"}.mdi-zodiac-aquarius:before{content:"\FA7C"}.mdi-zodiac-aries:before{content:"\FA7D"}.mdi-zodiac-cancer:before{content:"\FA7E"}.mdi-zodiac-capricorn:before{content:"\FA7F"}.mdi-zodiac-gemini:before{content:"\FA80"}.mdi-zodiac-leo:before{content:"\FA81"}.mdi-zodiac-libra:before{content:"\FA82"}.mdi-zodiac-pisces:before{content:"\FA83"}.mdi-zodiac-sagittarius:before{content:"\FA84"}.mdi-zodiac-scorpio:before{content:"\FA85"}.mdi-zodiac-taurus:before{content:"\FA86"}.mdi-zodiac-virgo:before{content:"\FA87"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} -/*# sourceMappingURL=materialdesignicons.min.css.map */ diff --git a/community_server/webroot/css/normalize.css b/community_server/webroot/css/normalize.css deleted file mode 100644 index b0c1902dc..000000000 --- a/community_server/webroot/css/normalize.css +++ /dev/null @@ -1,349 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Render the `main` element consistently in IE. - */ - -main { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} \ No newline at end of file diff --git a/community_server/webroot/css/rippleUI/style.css b/community_server/webroot/css/rippleUI/style.css deleted file mode 100644 index 8ba93da24..000000000 --- a/community_server/webroot/css/rippleUI/style.css +++ /dev/null @@ -1,14705 +0,0 @@ -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both -} - -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite -} - -@-webkit-keyframes fadeIn { - from { - opacity: 0 - } - - to { - opacity: 1 - } - -} - -@keyframes fadeIn { - from { - opacity: 0 - } - - to { - opacity: 1 - } - -} - -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn -} - -@-webkit-keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0) - } - - to { - opacity: 1; - -webkit-transform: none; - transform: none - } - -} - -@keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0) - } - - to { - opacity: 1; - -webkit-transform: none; - transform: none - } - -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown -} - -@-webkit-keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0) - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0) - } - -} - -@keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0) - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0) - } - -} - -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp -} - -@-webkit-keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 50% { - opacity: 1 - } - -} - -@keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 50% { - opacity: 1 - } - -} - -.zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn -} - -@keyframes bounceIn { - 20%, - 40%, - 60%, - 80%, - from, - to { - -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); - animation-timing-function: cubic-bezier(.215, .61, .355, 1) - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 20% { - -webkit-transform: scale3d(1.4, 1.4, 1.4); - transform: scale3d(1.4, 1.4, 1.4) - } - - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9) - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03) - } - - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97) - } - - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1) - } - -} - -@-webkit-keyframes rotate360 { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - -webkit-transform-origin: center; - transform-origin: center - } - -} - -@keyframes rotate360 { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - -webkit-transform-origin: center; - transform-origin: center - } - -} - -@-webkit-keyframes bounceIn { - 20%, - 40%, - 60%, - 80%, - from, - to { - -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1); - animation-timing-function: cubic-bezier(.215, .61, .355, 1) - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3) - } - - 20% { - -webkit-transform: scale3d(1.4, 1.4, 1.4); - transform: scale3d(1.4, 1.4, 1.4) - } - - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9) - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03) - } - - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97) - } - - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1) - } - -} - -@-webkit-keyframes ripple { - 0%, - 35% { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 1 - } - - 50% { - -webkit-transform: scale(.6); - transform: scale(.6); - opacity: .8 - } - - 100% { - opacity: 0; - -webkit-transform: scale(1.2); - transform: scale(1.2) - } - -} - -@keyframes ripple { - 0%, - 35% { - -webkit-transform: scale(0); - transform: scale(0); - opacity: 1 - } - - 50% { - -webkit-transform: scale(.6); - transform: scale(.6); - opacity: .8 - } - - 100% { - opacity: 0; - -webkit-transform: scale(1.2); - transform: scale(1.2) - } - -} - -@font-face { - font-family: Roboto; - src: url(../../fonts/Roboto/Roboto-Thin.ttf); - font-weight: 100 -} - -@font-face { - font-family: Roboto; - src: url(../../fonts/Roboto/Roboto-Light.ttf); - font-weight: 300 -} - -@font-face { - font-family: Roboto; - src: url(../../fonts/Roboto/Roboto-Regular.ttf); - font-weight: 400 -} - -@font-face { - font-family: Roboto; - src: url(../../fonts/Roboto/Roboto-Medium.ttf); - font-weight: 500 -} - -@font-face { - font-family: Roboto; - src: url(../../fonts/Roboto/Roboto-Bold.ttf); - font-weight: 700 -} - -.bg-inverse-primary { - background: rgba(4, 112, 6, .2) -} - -.bg-inverse-secondary { - background: rgba(128, 128, 128, .2) -} - -.bg-inverse-success { - background: rgba(0, 224, 147, .2) -} - -.bg-inverse-info { - background: rgba(108, 97, 246, .2) -} - -.bg-inverse-warning { - background: rgba(240, 130, 95, .2) -} - -.bg-inverse-danger { - background: rgba(255, 95, 102, .2) -} - -.bg-inverse-light { - background: rgba(223, 223, 223, .2) -} - -.bg-inverse-dark { - background: rgba(116, 118, 123, .2) -} - -.bg-inverse-white { - background: rgba(255, 255, 255, .2) -} - -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -:root { - --blue: #007bff; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #dc3545; - --orange: #fd7e14; - --yellow: #ffc107; - --green: #28a745; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #6c757d; - --gray-dark: #343a40; - --primary: #047006; - --secondary: grey; - --success: #047006; - --info: #6c61f6; - --warning: #f0825f; - --danger: #ff5f66; - --light: #dfdfdf; - --dark: #74767b; - --white: #fff; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace -} - -*, -::after, -::before { - box-sizing: border-box -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0) -} - -article, -aside, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section { - display: block -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.7; - color: #212529; - text-align: left; - background-color: #fff -} - -[tabindex="-1"]:focus { - outline: 0 !important -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - margin-bottom: .5rem -} - -p { - margin-top: 0; - margin-bottom: 1rem -} - -abbr[data-original-title], -abbr[title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - text-decoration-skip-ink: none -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit -} - -dl, -ol, -ul { - margin-top: 0; - margin-bottom: 1rem -} - -ol ol, -ol ul, -ul ol, -ul ul { - margin-bottom: 0 -} - -dt { - font-weight: 700 -} - -dd { - margin-bottom: .5rem; - margin-left: 0 -} - -blockquote { - margin: 0 0 1rem -} - -b, -strong { - font-weight: bolder -} - -small { - font-size: 80% -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline -} - -sub { - bottom: -.25em -} - -sup { - top: -.5em -} - -a { - color: #047006; - text-decoration: none; - background-color: transparent -} - -a:hover { - color: #012602; - text-decoration: underline -} - -a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none -} - -a:not([href]):not([tabindex]):focus, -a:not([href]):not([tabindex]):hover { - color: inherit; - text-decoration: none -} - -a:not([href]):not([tabindex]):focus { - outline: 0 -} - -code, -kbd, -pre, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto -} - -figure { - margin: 0 0 1rem -} - -img { - vertical-align: middle; - border-style: none -} - -svg { - overflow: hidden; - vertical-align: middle -} - -table { - border-collapse: collapse -} - -caption { - padding-top: 10px 15px; - padding-bottom: 10px 15px; - color: #6c757d; - text-align: left; - caption-side: bottom -} - -th { - text-align: inherit -} - -label { - display: inline-block; - margin-bottom: .5rem -} - -button { - border-radius: 0 -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color -} - -button, -input, -optgroup, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit -} - -button, -input { - overflow: visible -} - -button, -select { - text-transform: none -} - -select { - word-wrap: normal -} - -[type=button], -[type=reset], -[type=submit], -button { - -webkit-appearance: button -} - -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled), -button:not(:disabled) { - cursor: pointer -} - -[type=button]::-moz-focus-inner, -[type=reset]::-moz-focus-inner, -[type=submit]::-moz-focus-inner, -button::-moz-focus-inner { - padding: 0; - border-style: none -} - -input[type=checkbox], -input[type=radio] { - box-sizing: border-box; - padding: 0 -} - -input[type=date], -input[type=datetime-local], -input[type=month], -input[type=time] { - -webkit-appearance: listbox -} - -textarea { - overflow: auto; - resize: vertical -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0 -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal -} - -progress { - vertical-align: baseline -} - -[type=number]::-webkit-inner-spin-button, -[type=number]::-webkit-outer-spin-button { - height: auto -} - -[type=search] { - outline-offset: -2px; - -webkit-appearance: none -} - -[type=search]::-webkit-search-decoration { - -webkit-appearance: none -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button -} - -output { - display: inline-block -} - -summary { - display: list-item; - cursor: pointer -} - -template { - display: none -} - -[hidden] { - display: none !important -} - -.h1, -.h2, -.h3, -.h4, -.h5, -.h6, -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: .5rem; - font-weight: 500; - line-height: 1.2 -} - -.h1, -h1 { - font-size: 2.5rem -} - -.h2, -h2 { - font-size: 2rem -} - -.h3, -h3 { - font-size: 1.75rem -} - -.h4, -h4 { - font-size: 1.5rem -} - -.h5, -h5 { - font-size: 1.25rem -} - -.h6, -h6 { - font-size: 1rem -} - -.lead { - font-size: 1.25rem; - font-weight: 300 -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2 -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2 -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2 -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2 -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, .1) -} - -.small, -small { - font-size: 80%; - font-weight: 400 -} - -.mark, -mark { - padding: .2em; - background-color: #fcf8e3 -} - -.list-unstyled { - padding-left: 0; - list-style: none -} - -.list-inline { - padding-left: 0; - list-style: none -} - -.list-inline-item { - display: inline-block -} - -.list-inline-item:not(:last-child) { - margin-right: .5rem -} - -.initialism { - font-size: 90%; - text-transform: uppercase -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #6c757d -} - -.blockquote-footer::before { - content: "\2014\00A0" -} - -.img-fluid { - max-width: 100%; - height: auto -} - -.img-thumbnail { - padding: .25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: .25rem; - max-width: 100%; - height: auto -} - -.figure { - display: inline-block -} - -.figure-img { - margin-bottom: .5rem; - line-height: 1 -} - -.figure-caption { - font-size: 90%; - color: #6c757d -} - -code { - font-size: 90%; - color: #bd4147; - word-break: break-word -} - -a>code { - color: inherit -} - -kbd { - padding: .2rem .4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: .2rem -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700 -} - -pre { - display: block; - font-size: 90%; - color: #212529 -} - -pre code { - font-size: inherit; - color: inherit; - word-break: normal -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll -} - -.container { - width: 100%; - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto -} - -@media (min-width:576px) { - .container { - max-width: 540px - } - -} - -@media (min-width:768px) { - .container { - max-width: 720px - } - -} - -@media (min-width:992px) { - .container { - max-width: 960px - } - -} - -@media (min-width:1200px) { - .container { - max-width: 1140px - } - -} - -.container-fluid { - width: 100%; - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto -} - -.row { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - margin-right: -10px; - margin-left: -10px -} - -.no-gutters { - margin-right: 0; - margin-left: 0 -} - -.no-gutters>.col, -.no-gutters>[class*=col-] { - padding-right: 0; - padding-left: 0 -} - -.col, -.col-1, -.col-10, -.col-11, -.col-12, -.col-2, -.col-3, -.col-4, -.col-5, -.col-6, -.col-7, -.col-8, -.col-9, -.col-auto, -.col-lg, -.col-lg-1, -.col-lg-10, -.col-lg-11, -.col-lg-12, -.col-lg-2, -.col-lg-3, -.col-lg-4, -.col-lg-5, -.col-lg-6, -.col-lg-7, -.col-lg-8, -.col-lg-9, -.col-lg-auto, -.col-md, -.col-md-1, -.col-md-10, -.col-md-11, -.col-md-12, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9, -.col-md-auto, -.col-sm, -.col-sm-1, -.col-sm-10, -.col-sm-11, -.col-sm-12, -.col-sm-2, -.col-sm-3, -.col-sm-4, -.col-sm-5, -.col-sm-6, -.col-sm-7, -.col-sm-8, -.col-sm-9, -.col-sm-auto, -.col-xl, -.col-xl-1, -.col-xl-10, -.col-xl-11, -.col-xl-12, -.col-xl-2, -.col-xl-3, -.col-xl-4, -.col-xl-5, -.col-xl-6, -.col-xl-7, -.col-xl-8, -.col-xl-9, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 10px; - padding-left: 10px -} - -.col { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% -} - -.col-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% -} - -.col-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% -} - -.col-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% -} - -.col-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% -} - -.col-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% -} - -.col-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% -} - -.col-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% -} - -.col-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% -} - -.col-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% -} - -.col-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% -} - -.col-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% -} - -.col-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% -} - -.col-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% -} - -.order-first { - -webkit-box-ordinal-group: 0; - order: -1 -} - -.order-last { - -webkit-box-ordinal-group: 14; - order: 13 -} - -.order-0 { - -webkit-box-ordinal-group: 1; - order: 0 -} - -.order-1 { - -webkit-box-ordinal-group: 2; - order: 1 -} - -.order-2 { - -webkit-box-ordinal-group: 3; - order: 2 -} - -.order-3 { - -webkit-box-ordinal-group: 4; - order: 3 -} - -.order-4 { - -webkit-box-ordinal-group: 5; - order: 4 -} - -.order-5 { - -webkit-box-ordinal-group: 6; - order: 5 -} - -.order-6 { - -webkit-box-ordinal-group: 7; - order: 6 -} - -.order-7 { - -webkit-box-ordinal-group: 8; - order: 7 -} - -.order-8 { - -webkit-box-ordinal-group: 9; - order: 8 -} - -.order-9 { - -webkit-box-ordinal-group: 10; - order: 9 -} - -.order-10 { - -webkit-box-ordinal-group: 11; - order: 10 -} - -.order-11 { - -webkit-box-ordinal-group: 12; - order: 11 -} - -.order-12 { - -webkit-box-ordinal-group: 13; - order: 12 -} - -.offset-1 { - margin-left: 8.33333% -} - -.offset-2 { - margin-left: 16.66667% -} - -.offset-3 { - margin-left: 25% -} - -.offset-4 { - margin-left: 33.33333% -} - -.offset-5 { - margin-left: 41.66667% -} - -.offset-6 { - margin-left: 50% -} - -.offset-7 { - margin-left: 58.33333% -} - -.offset-8 { - margin-left: 66.66667% -} - -.offset-9 { - margin-left: 75% -} - -.offset-10 { - margin-left: 83.33333% -} - -.offset-11 { - margin-left: 91.66667% -} - -@media (min-width:576px) { - .col-sm { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-sm-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-sm-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-sm-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-sm-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-sm-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-sm-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-sm-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-sm-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-sm-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-sm-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-sm-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-sm-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-sm-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-sm-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-sm-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-sm-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-sm-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-sm-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-sm-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-sm-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-sm-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-sm-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-sm-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-sm-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-sm-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-sm-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-sm-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-sm-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-sm-0 { - margin-left: 0 - } - - .offset-sm-1 { - margin-left: 8.33333% - } - - .offset-sm-2 { - margin-left: 16.66667% - } - - .offset-sm-3 { - margin-left: 25% - } - - .offset-sm-4 { - margin-left: 33.33333% - } - - .offset-sm-5 { - margin-left: 41.66667% - } - - .offset-sm-6 { - margin-left: 50% - } - - .offset-sm-7 { - margin-left: 58.33333% - } - - .offset-sm-8 { - margin-left: 66.66667% - } - - .offset-sm-9 { - margin-left: 75% - } - - .offset-sm-10 { - margin-left: 83.33333% - } - - .offset-sm-11 { - margin-left: 91.66667% - } - -} - -@media (min-width:768px) { - .col-md { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-md-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-md-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-md-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-md-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-md-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-md-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-md-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-md-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-md-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-md-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-md-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-md-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-md-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-md-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-md-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-md-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-md-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-md-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-md-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-md-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-md-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-md-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-md-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-md-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-md-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-md-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-md-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-md-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-md-0 { - margin-left: 0 - } - - .offset-md-1 { - margin-left: 8.33333% - } - - .offset-md-2 { - margin-left: 16.66667% - } - - .offset-md-3 { - margin-left: 25% - } - - .offset-md-4 { - margin-left: 33.33333% - } - - .offset-md-5 { - margin-left: 41.66667% - } - - .offset-md-6 { - margin-left: 50% - } - - .offset-md-7 { - margin-left: 58.33333% - } - - .offset-md-8 { - margin-left: 66.66667% - } - - .offset-md-9 { - margin-left: 75% - } - - .offset-md-10 { - margin-left: 83.33333% - } - - .offset-md-11 { - margin-left: 91.66667% - } - -} - -@media (min-width:992px) { - .col-lg { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-lg-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-lg-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-lg-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-lg-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-lg-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-lg-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-lg-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-lg-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-lg-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-lg-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-lg-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-lg-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-lg-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-lg-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-lg-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-lg-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-lg-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-lg-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-lg-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-lg-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-lg-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-lg-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-lg-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-lg-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-lg-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-lg-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-lg-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-lg-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-lg-0 { - margin-left: 0 - } - - .offset-lg-1 { - margin-left: 8.33333% - } - - .offset-lg-2 { - margin-left: 16.66667% - } - - .offset-lg-3 { - margin-left: 25% - } - - .offset-lg-4 { - margin-left: 33.33333% - } - - .offset-lg-5 { - margin-left: 41.66667% - } - - .offset-lg-6 { - margin-left: 50% - } - - .offset-lg-7 { - margin-left: 58.33333% - } - - .offset-lg-8 { - margin-left: 66.66667% - } - - .offset-lg-9 { - margin-left: 75% - } - - .offset-lg-10 { - margin-left: 83.33333% - } - - .offset-lg-11 { - margin-left: 91.66667% - } - -} - -@media (min-width:1200px) { - .col-xl { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - max-width: 100% - } - - .col-xl-auto { - -webkit-box-flex: 0; - flex: 0 0 auto; - width: auto; - max-width: 100% - } - - .col-xl-1 { - -webkit-box-flex: 0; - flex: 0 0 8.33333%; - max-width: 8.33333% - } - - .col-xl-2 { - -webkit-box-flex: 0; - flex: 0 0 16.66667%; - max-width: 16.66667% - } - - .col-xl-3 { - -webkit-box-flex: 0; - flex: 0 0 25%; - max-width: 25% - } - - .col-xl-4 { - -webkit-box-flex: 0; - flex: 0 0 33.33333%; - max-width: 33.33333% - } - - .col-xl-5 { - -webkit-box-flex: 0; - flex: 0 0 41.66667%; - max-width: 41.66667% - } - - .col-xl-6 { - -webkit-box-flex: 0; - flex: 0 0 50%; - max-width: 50% - } - - .col-xl-7 { - -webkit-box-flex: 0; - flex: 0 0 58.33333%; - max-width: 58.33333% - } - - .col-xl-8 { - -webkit-box-flex: 0; - flex: 0 0 66.66667%; - max-width: 66.66667% - } - - .col-xl-9 { - -webkit-box-flex: 0; - flex: 0 0 75%; - max-width: 75% - } - - .col-xl-10 { - -webkit-box-flex: 0; - flex: 0 0 83.33333%; - max-width: 83.33333% - } - - .col-xl-11 { - -webkit-box-flex: 0; - flex: 0 0 91.66667%; - max-width: 91.66667% - } - - .col-xl-12 { - -webkit-box-flex: 0; - flex: 0 0 100%; - max-width: 100% - } - - .order-xl-first { - -webkit-box-ordinal-group: 0; - order: -1 - } - - .order-xl-last { - -webkit-box-ordinal-group: 14; - order: 13 - } - - .order-xl-0 { - -webkit-box-ordinal-group: 1; - order: 0 - } - - .order-xl-1 { - -webkit-box-ordinal-group: 2; - order: 1 - } - - .order-xl-2 { - -webkit-box-ordinal-group: 3; - order: 2 - } - - .order-xl-3 { - -webkit-box-ordinal-group: 4; - order: 3 - } - - .order-xl-4 { - -webkit-box-ordinal-group: 5; - order: 4 - } - - .order-xl-5 { - -webkit-box-ordinal-group: 6; - order: 5 - } - - .order-xl-6 { - -webkit-box-ordinal-group: 7; - order: 6 - } - - .order-xl-7 { - -webkit-box-ordinal-group: 8; - order: 7 - } - - .order-xl-8 { - -webkit-box-ordinal-group: 9; - order: 8 - } - - .order-xl-9 { - -webkit-box-ordinal-group: 10; - order: 9 - } - - .order-xl-10 { - -webkit-box-ordinal-group: 11; - order: 10 - } - - .order-xl-11 { - -webkit-box-ordinal-group: 12; - order: 11 - } - - .order-xl-12 { - -webkit-box-ordinal-group: 13; - order: 12 - } - - .offset-xl-0 { - margin-left: 0 - } - - .offset-xl-1 { - margin-left: 8.33333% - } - - .offset-xl-2 { - margin-left: 16.66667% - } - - .offset-xl-3 { - margin-left: 25% - } - - .offset-xl-4 { - margin-left: 33.33333% - } - - .offset-xl-5 { - margin-left: 41.66667% - } - - .offset-xl-6 { - margin-left: 50% - } - - .offset-xl-7 { - margin-left: 58.33333% - } - - .offset-xl-8 { - margin-left: 66.66667% - } - - .offset-xl-9 { - margin-left: 75% - } - - .offset-xl-10 { - margin-left: 83.33333% - } - - .offset-xl-11 { - margin-left: 91.66667% - } - -} - -.table { - width: 100%; - margin-bottom: 1rem; - color: #212529 -} - -.table td, -.table th { - padding: 10px 15px; - vertical-align: top; - border-top: 1px solid #f2f4f9 -} - -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #f2f4f9 -} - -.table tbody+tbody { - border-top: 2px solid #f2f4f9 -} - -.table-sm td, -.table-sm th { - padding: 10px 15px -} - -.table-bordered { - border: 1px solid #f2f4f9 -} - -.table-bordered td, -.table-bordered th { - border: 1px solid #f2f4f9 -} - -.table-bordered thead td, -.table-bordered thead th { - border-bottom-width: 2px -} - -.table-borderless tbody+tbody, -.table-borderless td, -.table-borderless th, -.table-borderless thead th { - border: 0 -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: #f6f7f9 -} - -.table-hover tbody tr:hover { - color: #212529; - background-color: #f6f7f9 -} - -.table-primary, -.table-primary>td, -.table-primary>th { - background-color: #b9d7b9 -} - -.table-primary tbody+tbody, -.table-primary td, -.table-primary th, -.table-primary thead th { - border-color: #7cb57e -} - -.table-hover .table-primary:hover { - background-color: #a9cea9 -} - -.table-hover .table-primary:hover>td, -.table-hover .table-primary:hover>th { - background-color: #a9cea9 -} - -.table-secondary, -.table-secondary>td, -.table-secondary>th { - background-color: #dbdbdb -} - -.table-secondary tbody+tbody, -.table-secondary td, -.table-secondary th, -.table-secondary thead th { - border-color: #bdbdbd -} - -.table-hover .table-secondary:hover { - background-color: #cecece -} - -.table-hover .table-secondary:hover>td, -.table-hover .table-secondary:hover>th { - background-color: #cecece -} - -.table-success, -.table-success>td, -.table-success>th { - background-color: #b8f6e1 -} - -.table-success tbody+tbody, -.table-success td, -.table-success th, -.table-success thead th { - border-color: #7aefc7 -} - -.table-hover .table-success:hover { - background-color: #a1f3d7 -} - -.table-hover .table-success:hover>td, -.table-hover .table-success:hover>th { - background-color: #a1f3d7 -} - -.table-info, -.table-info>td, -.table-info>th { - background-color: #d6d3fc -} - -.table-info tbody+tbody, -.table-info td, -.table-info th, -.table-info thead th { - border-color: #b3adfa -} - -.table-hover .table-info:hover { - background-color: #c0bbfa -} - -.table-hover .table-info:hover>td, -.table-hover .table-info:hover>th { - background-color: #c0bbfa -} - -.table-warning, -.table-warning>td, -.table-warning>th { - background-color: #fbdcd2 -} - -.table-warning tbody+tbody, -.table-warning td, -.table-warning th, -.table-warning thead th { - border-color: #f7beac -} - -.table-hover .table-warning:hover { - background-color: #f9cabb -} - -.table-hover .table-warning:hover>td, -.table-hover .table-warning:hover>th { - background-color: #f9cabb -} - -.table-danger, -.table-danger>td, -.table-danger>th { - background-color: #ffd2d4 -} - -.table-danger tbody+tbody, -.table-danger td, -.table-danger th, -.table-danger thead th { - border-color: #ffacaf -} - -.table-hover .table-danger:hover { - background-color: #ffb9bc -} - -.table-hover .table-danger:hover>td, -.table-hover .table-danger:hover>th { - background-color: #ffb9bc -} - -.table-light, -.table-light>td, -.table-light>th { - background-color: #f6f6f6 -} - -.table-light tbody+tbody, -.table-light td, -.table-light th, -.table-light thead th { - border-color: #eee -} - -.table-hover .table-light:hover { - background-color: #e9e9e9 -} - -.table-hover .table-light:hover>td, -.table-hover .table-light:hover>th { - background-color: #e9e9e9 -} - -.table-dark, -.table-dark>td, -.table-dark>th { - background-color: #d8d9da -} - -.table-dark tbody+tbody, -.table-dark td, -.table-dark th, -.table-dark thead th { - border-color: #b7b8ba -} - -.table-hover .table-dark:hover { - background-color: #cbccce -} - -.table-hover .table-dark:hover>td, -.table-hover .table-dark:hover>th { - background-color: #cbccce -} - -.table-white, -.table-white>td, -.table-white>th { - background-color: #fff -} - -.table-white tbody+tbody, -.table-white td, -.table-white th, -.table-white thead th { - border-color: #fff -} - -.table-hover .table-white:hover { - background-color: #f2f2f2 -} - -.table-hover .table-white:hover>td, -.table-hover .table-white:hover>th { - background-color: #f2f2f2 -} - -.table-active, -.table-active>td, -.table-active>th { - background-color: rgba(0, 0, 0, .075) -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, .075) -} - -.table-hover .table-active:hover>td, -.table-hover .table-active:hover>th { - background-color: rgba(0, 0, 0, .075) -} - -.table .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55 -} - -.table .thead-light th { - color: #495057; - background-color: #e1e4e6; - border-color: #f2f4f9 -} - -.table-dark { - color: #fff; - background-color: #343a40 -} - -.table-dark td, -.table-dark th, -.table-dark thead th { - border-color: #454d55 -} - -.table-dark.table-bordered { - border: 0 -} - -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, .05) -} - -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, .075) -} - -@media (max-width:575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-sm>.table-bordered { - border: 0 - } - -} - -@media (max-width:767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-md>.table-bordered { - border: 0 - } - -} - -@media (max-width:991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-lg>.table-bordered { - border: 0 - } - -} - -@media (max-width:1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch - } - - .table-responsive-xl>.table-bordered { - border: 0 - } - -} - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch -} - -.table-responsive>.table-bordered { - border: 0 -} - -.form-control { - display: block; - width: 100%; - height: calc(1.5em + .75rem + 2px); - padding: .375rem .75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - background-color: #f6f7f9; - background-clip: padding-box; - border: 1px solid #f0f2f5; - border-radius: .25rem; - -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .form-control { - -webkit-transition: none; - transition: none - } - -} - -.form-control::-ms-expand { - background-color: transparent; - border: 0 -} - -.form-control:focus { - color: #495057; - background-color: #f6f7f9; - border-color: #d7dee5; - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.form-control::-webkit-input-placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control::-moz-placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control::-ms-input-placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control::placeholder { - color: #6c757d; - opacity: 1 -} - -.form-control:disabled, -.form-control[readonly] { - background-color: #f8f9fa; - opacity: 1 -} - -select.form-control:focus::-ms-value { - color: #6c757d; - background-color: #f6f7f9 -} - -.form-control-file, -.form-control-range { - display: block; - width: 100% -} - -.col-form-label { - padding-top: calc(.375rem + 1px); - padding-bottom: calc(.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5 -} - -.col-form-label-lg { - padding-top: calc(.5rem + 1px); - padding-bottom: calc(.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5 -} - -.col-form-label-sm { - padding-top: calc(.25rem + 1px); - padding-bottom: calc(.25rem + 1px); - font-size: .875rem; - line-height: 1.5 -} - -.form-control-plaintext { - display: block; - width: 100%; - padding-top: .375rem; - padding-bottom: .375rem; - margin-bottom: 0; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0 -} - -.form-control-plaintext.form-control-lg, -.form-control-plaintext.form-control-sm { - padding-right: 0; - padding-left: 0 -} - -.form-control-sm { - height: calc(1.5em + .5rem + 2px); - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem -} - -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: .5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: .3rem -} - -select.form-control[multiple], -select.form-control[size] { - height: auto -} - -textarea.form-control { - height: auto -} - -.form-group { - margin-bottom: 1rem -} - -.form-text { - display: block; - margin-top: .25rem -} - -.form-row { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px -} - -.form-row>.col, -.form-row>[class*=col-] { - padding-right: 5px; - padding-left: 5px -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem -} - -.form-check-input { - position: absolute; - margin-top: .3rem; - margin-left: -1.25rem -} - -.form-check-input:disabled~.form-check-label { - color: #adb5bd -} - -.form-check-label { - margin-bottom: 0 -} - -.form-check-inline { - display: -webkit-inline-box; - display: inline-flex; - -webkit-box-align: center; - align-items: center; - padding-left: 0; - margin-right: .75rem -} - -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: .3125rem; - margin-left: 0 -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: .25rem; - font-size: 80%; - color: #28a745 -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: .25rem .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(40, 167, 69, .9); - border-radius: .25rem -} - -.form-control.is-valid, -.was-validated .form-control:valid { - border-color: #28a745; - padding-right: calc(1.5em + .75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: center right calc(.375em + .1875rem); - background-size: calc(.75em + .375rem) calc(.75em + .375rem) -} - -.form-control.is-valid:focus, -.was-validated .form-control:valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.form-control.is-valid~.valid-feedback, -.form-control.is-valid~.valid-tooltip, -.was-validated .form-control:valid~.valid-feedback, -.was-validated .form-control:valid~.valid-tooltip { - display: block -} - -.was-validated textarea.form-control:valid, -textarea.form-control.is-valid { - padding-right: calc(1.5em + .75rem); - background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) -} - -.custom-select.is-valid, -.was-validated .custom-select:valid { - border-color: #28a745; - padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) -} - -.custom-select.is-valid:focus, -.was-validated .custom-select:valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.custom-select.is-valid~.valid-feedback, -.custom-select.is-valid~.valid-tooltip, -.was-validated .custom-select:valid~.valid-feedback, -.was-validated .custom-select:valid~.valid-tooltip { - display: block -} - -.form-control-file.is-valid~.valid-feedback, -.form-control-file.is-valid~.valid-tooltip, -.was-validated .form-control-file:valid~.valid-feedback, -.was-validated .form-control-file:valid~.valid-tooltip { - display: block -} - -.form-check-input.is-valid~.form-check-label, -.was-validated .form-check-input:valid~.form-check-label { - color: #28a745 -} - -.form-check-input.is-valid~.valid-feedback, -.form-check-input.is-valid~.valid-tooltip, -.was-validated .form-check-input:valid~.valid-feedback, -.was-validated .form-check-input:valid~.valid-tooltip { - display: block -} - -.custom-control-input.is-valid~.custom-control-label, -.was-validated .custom-control-input:valid~.custom-control-label { - color: #28a745 -} - -.custom-control-input.is-valid~.custom-control-label::before, -.was-validated .custom-control-input:valid~.custom-control-label::before { - border-color: #28a745 -} - -.custom-control-input.is-valid~.valid-feedback, -.custom-control-input.is-valid~.valid-tooltip, -.was-validated .custom-control-input:valid~.valid-feedback, -.was-validated .custom-control-input:valid~.valid-tooltip { - display: block -} - -.custom-control-input.is-valid:checked~.custom-control-label::before, -.was-validated .custom-control-input:valid:checked~.custom-control-label::before { - border-color: #34ce57; - background-color: #34ce57 -} - -.custom-control-input.is-valid:focus~.custom-control-label::before, -.was-validated .custom-control-input:valid:focus~.custom-control-label::before { - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before, -.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before { - border-color: #28a745 -} - -.custom-file-input.is-valid~.custom-file-label, -.was-validated .custom-file-input:valid~.custom-file-label { - border-color: #28a745 -} - -.custom-file-input.is-valid~.valid-feedback, -.custom-file-input.is-valid~.valid-tooltip, -.was-validated .custom-file-input:valid~.valid-feedback, -.was-validated .custom-file-input:valid~.valid-tooltip { - display: block -} - -.custom-file-input.is-valid:focus~.custom-file-label, -.was-validated .custom-file-input:valid:focus~.custom-file-label { - border-color: #28a745; - box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: .25rem; - font-size: 80%; - color: #dc3545 -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: .25rem .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(220, 53, 69, .9); - border-radius: .25rem -} - -.form-control.is-invalid, -.was-validated .form-control:invalid { - border-color: #dc3545; - padding-right: calc(1.5em + .75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); - background-repeat: no-repeat; - background-position: center right calc(.375em + .1875rem); - background-size: calc(.75em + .375rem) calc(.75em + .375rem) -} - -.form-control.is-invalid:focus, -.was-validated .form-control:invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.form-control.is-invalid~.invalid-feedback, -.form-control.is-invalid~.invalid-tooltip, -.was-validated .form-control:invalid~.invalid-feedback, -.was-validated .form-control:invalid~.invalid-tooltip { - display: block -} - -.was-validated textarea.form-control:invalid, -textarea.form-control.is-invalid { - padding-right: calc(1.5em + .75rem); - background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem) -} - -.custom-select.is-invalid, -.was-validated .custom-select:invalid { - border-color: #dc3545; - padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) -} - -.custom-select.is-invalid:focus, -.was-validated .custom-select:invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.custom-select.is-invalid~.invalid-feedback, -.custom-select.is-invalid~.invalid-tooltip, -.was-validated .custom-select:invalid~.invalid-feedback, -.was-validated .custom-select:invalid~.invalid-tooltip { - display: block -} - -.form-control-file.is-invalid~.invalid-feedback, -.form-control-file.is-invalid~.invalid-tooltip, -.was-validated .form-control-file:invalid~.invalid-feedback, -.was-validated .form-control-file:invalid~.invalid-tooltip { - display: block -} - -.form-check-input.is-invalid~.form-check-label, -.was-validated .form-check-input:invalid~.form-check-label { - color: #dc3545 -} - -.form-check-input.is-invalid~.invalid-feedback, -.form-check-input.is-invalid~.invalid-tooltip, -.was-validated .form-check-input:invalid~.invalid-feedback, -.was-validated .form-check-input:invalid~.invalid-tooltip { - display: block -} - -.custom-control-input.is-invalid~.custom-control-label, -.was-validated .custom-control-input:invalid~.custom-control-label { - color: #dc3545 -} - -.custom-control-input.is-invalid~.custom-control-label::before, -.was-validated .custom-control-input:invalid~.custom-control-label::before { - border-color: #dc3545 -} - -.custom-control-input.is-invalid~.invalid-feedback, -.custom-control-input.is-invalid~.invalid-tooltip, -.was-validated .custom-control-input:invalid~.invalid-feedback, -.was-validated .custom-control-input:invalid~.invalid-tooltip { - display: block -} - -.custom-control-input.is-invalid:checked~.custom-control-label::before, -.was-validated .custom-control-input:invalid:checked~.custom-control-label::before { - border-color: #e4606d; - background-color: #e4606d -} - -.custom-control-input.is-invalid:focus~.custom-control-label::before, -.was-validated .custom-control-input:invalid:focus~.custom-control-label::before { - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before, -.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before { - border-color: #dc3545 -} - -.custom-file-input.is-invalid~.custom-file-label, -.was-validated .custom-file-input:invalid~.custom-file-label { - border-color: #dc3545 -} - -.custom-file-input.is-invalid~.invalid-feedback, -.custom-file-input.is-invalid~.invalid-tooltip, -.was-validated .custom-file-input:invalid~.invalid-feedback, -.was-validated .custom-file-input:invalid~.invalid-tooltip { - display: block -} - -.custom-file-input.is-invalid:focus~.custom-file-label, -.was-validated .custom-file-input:invalid:focus~.custom-file-label { - border-color: #dc3545; - box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) -} - -.form-inline { - display: -webkit-box; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap; - -webkit-box-align: center; - align-items: center -} - -.form-inline .form-check { - width: 100% -} - -@media (min-width:576px) { - .form-inline label { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - margin-bottom: 0 - } - - .form-inline .form-group { - display: -webkit-box; - display: flex; - -webkit-box-flex: 0; - flex: 0 0 auto; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap; - -webkit-box-align: center; - align-items: center; - margin-bottom: 0 - } - - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle - } - - .form-inline .form-control-plaintext { - display: inline-block - } - - .form-inline .custom-select, - .form-inline .input-group { - width: auto - } - - .form-inline .form-check { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - width: auto; - padding-left: 0 - } - - .form-inline .form-check-input { - position: relative; - flex-shrink: 0; - margin-top: 0; - margin-right: .25rem; - margin-left: 0 - } - - .form-inline .custom-control { - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center - } - - .form-inline .custom-control-label { - margin-bottom: 0 - } - -} - -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: .375rem .75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: .25rem; - -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .btn { - -webkit-transition: none; - transition: none - } - -} - -.btn:hover { - color: #212529; - text-decoration: none -} - -.btn.focus, -.btn:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.btn.disabled, -.btn:disabled { - opacity: .65 -} - -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none -} - -.btn-primary { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-primary:hover { - color: #fff; - background-color: #034b04; - border-color: #023f03 -} - -.btn-primary.focus, -.btn-primary:focus { - box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) -} - -.btn-primary.disabled, -.btn-primary:disabled { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-primary:not(:disabled):not(.disabled).active, -.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle { - color: #fff; - background-color: #023f03; - border-color: #023203 -} - -.btn-primary:not(:disabled):not(.disabled).active:focus, -.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5) -} - -.btn-secondary { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-secondary:hover { - color: #fff; - background-color: #6d6d6d; - border-color: #676767 -} - -.btn-secondary.focus, -.btn-secondary:focus { - box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) -} - -.btn-secondary.disabled, -.btn-secondary:disabled { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-secondary:not(:disabled):not(.disabled).active, -.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle { - color: #fff; - background-color: #676767; - border-color: #606060 -} - -.btn-secondary:not(:disabled):not(.disabled).active:focus, -.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5) -} - -.btn-success { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-success:hover { - color: #fff; - background-color: #00ba7a; - border-color: #00ad72 -} - -.btn-success.focus, -.btn-success:focus { - box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) -} - -.btn-success.disabled, -.btn-success:disabled { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-success:not(:disabled):not(.disabled).active, -.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle { - color: #fff; - background-color: #00ad72; - border-color: #00a069 -} - -.btn-success:not(:disabled):not(.disabled).active:focus, -.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5) -} - -.btn-info { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-info:hover { - color: #fff; - background-color: #4a3df4; - border-color: #3f31f3 -} - -.btn-info.focus, -.btn-info:focus { - box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) -} - -.btn-info.disabled, -.btn-info:disabled { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-info:not(:disabled):not(.disabled).active, -.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle { - color: #fff; - background-color: #3f31f3; - border-color: #3425f3 -} - -.btn-info:not(:disabled):not(.disabled).active:focus, -.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5) -} - -.btn-warning { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-warning:hover { - color: #fff; - background-color: #ed673c; - border-color: #ec5e30 -} - -.btn-warning.focus, -.btn-warning:focus { - box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) -} - -.btn-warning.disabled, -.btn-warning:disabled { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-warning:not(:disabled):not(.disabled).active, -.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle { - color: #fff; - background-color: #ec5e30; - border-color: #eb5425 -} - -.btn-warning:not(:disabled):not(.disabled).active:focus, -.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5) -} - -.btn-danger { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-danger:hover { - color: #fff; - background-color: #ff3941; - border-color: #ff2c35 -} - -.btn-danger.focus, -.btn-danger:focus { - box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) -} - -.btn-danger.disabled, -.btn-danger:disabled { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-danger:not(:disabled):not(.disabled).active, -.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle { - color: #fff; - background-color: #ff2c35; - border-color: #ff1f29 -} - -.btn-danger:not(:disabled):not(.disabled).active:focus, -.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5) -} - -.btn-light { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-light:hover { - color: #212529; - background-color: #ccc; - border-color: #c6c6c6 -} - -.btn-light.focus, -.btn-light:focus { - box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) -} - -.btn-light.disabled, -.btn-light:disabled { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-light:not(:disabled):not(.disabled).active, -.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle { - color: #212529; - background-color: #c6c6c6; - border-color: #bfbfbf -} - -.btn-light:not(:disabled):not(.disabled).active:focus, -.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5) -} - -.btn-dark { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-dark:hover { - color: #fff; - background-color: #616367; - border-color: #5b5d61 -} - -.btn-dark.focus, -.btn-dark:focus { - box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) -} - -.btn-dark.disabled, -.btn-dark:disabled { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-dark:not(:disabled):not(.disabled).active, -.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle { - color: #fff; - background-color: #5b5d61; - border-color: #55575a -} - -.btn-dark:not(:disabled):not(.disabled).active:focus, -.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5) -} - -.btn-white { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-white:hover { - color: #212529; - background-color: #ececec; - border-color: #e6e6e6 -} - -.btn-white.focus, -.btn-white:focus { - box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) -} - -.btn-white.disabled, -.btn-white:disabled { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-white:not(:disabled):not(.disabled).active, -.btn-white:not(:disabled):not(.disabled):active,.show>.btn-white.dropdown-toggle { - color: #212529; - background-color: #e6e6e6; - border-color: #dfdfdf -} - -.btn-white:not(:disabled):not(.disabled).active:focus, -.btn-white:not(:disabled):not(.disabled):active:focus,.show>.btn-white.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5) -} - -.btn-outline-primary { - color: #047006; - border-color: #047006 -} - -.btn-outline-primary:hover { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-outline-primary.focus, -.btn-outline-primary:focus { - box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) -} - -.btn-outline-primary.disabled, -.btn-outline-primary:disabled { - color: #047006; - background-color: transparent -} - -.btn-outline-primary:not(:disabled):not(.disabled).active, -.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-outline-primary:not(:disabled):not(.disabled).active:focus, -.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) -} - -.btn-outline-secondary { - color: grey; - border-color: grey -} - -.btn-outline-secondary:hover { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-outline-secondary.focus, -.btn-outline-secondary:focus { - box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) -} - -.btn-outline-secondary.disabled, -.btn-outline-secondary:disabled { - color: grey; - background-color: transparent -} - -.btn-outline-secondary:not(:disabled):not(.disabled).active, -.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: grey; - border-color: grey -} - -.btn-outline-secondary:not(:disabled):not(.disabled).active:focus, -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) -} - -.btn-outline-success { - color: #047006; - border-color: #047006 -} - -.btn-outline-success:hover { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-outline-success.focus, -.btn-outline-success:focus { - box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) -} - -.btn-outline-success.disabled, -.btn-outline-success:disabled { - color: #047006; - background-color: transparent -} - -.btn-outline-success:not(:disabled):not(.disabled).active, -.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #047006; - border-color: #047006 -} - -.btn-outline-success:not(:disabled):not(.disabled).active:focus, -.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) -} - -.btn-outline-info { - color: #6c61f6; - border-color: #6c61f6 -} - -.btn-outline-info:hover { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-outline-info.focus, -.btn-outline-info:focus { - box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) -} - -.btn-outline-info.disabled, -.btn-outline-info:disabled { - color: #6c61f6; - background-color: transparent -} - -.btn-outline-info:not(:disabled):not(.disabled).active, -.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #6c61f6; - border-color: #6c61f6 -} - -.btn-outline-info:not(:disabled):not(.disabled).active:focus, -.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) -} - -.btn-outline-warning { - color: #f0825f; - border-color: #f0825f -} - -.btn-outline-warning:hover { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-outline-warning.focus, -.btn-outline-warning:focus { - box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) -} - -.btn-outline-warning.disabled, -.btn-outline-warning:disabled { - color: #f0825f; - background-color: transparent -} - -.btn-outline-warning:not(:disabled):not(.disabled).active, -.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #f0825f; - border-color: #f0825f -} - -.btn-outline-warning:not(:disabled):not(.disabled).active:focus, -.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) -} - -.btn-outline-danger { - color: #ff5f66; - border-color: #ff5f66 -} - -.btn-outline-danger:hover { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-outline-danger.focus, -.btn-outline-danger:focus { - box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) -} - -.btn-outline-danger.disabled, -.btn-outline-danger:disabled { - color: #ff5f66; - background-color: transparent -} - -.btn-outline-danger:not(:disabled):not(.disabled).active, -.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #ff5f66; - border-color: #ff5f66 -} - -.btn-outline-danger:not(:disabled):not(.disabled).active:focus, -.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) -} - -.btn-outline-light { - color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-outline-light:hover { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-outline-light.focus, -.btn-outline-light:focus { - box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) -} - -.btn-outline-light.disabled, -.btn-outline-light:disabled { - color: #dfdfdf; - background-color: transparent -} - -.btn-outline-light:not(:disabled):not(.disabled).active, -.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #dfdfdf; - border-color: #dfdfdf -} - -.btn-outline-light:not(:disabled):not(.disabled).active:focus, -.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) -} - -.btn-outline-dark { - color: #74767b; - border-color: #74767b -} - -.btn-outline-dark:hover { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-outline-dark.focus, -.btn-outline-dark:focus { - box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) -} - -.btn-outline-dark.disabled, -.btn-outline-dark:disabled { - color: #74767b; - background-color: transparent -} - -.btn-outline-dark:not(:disabled):not(.disabled).active, -.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #74767b; - border-color: #74767b -} - -.btn-outline-dark:not(:disabled):not(.disabled).active:focus, -.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) -} - -.btn-outline-white { - color: #fff; - border-color: #fff -} - -.btn-outline-white:hover { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-outline-white.focus, -.btn-outline-white:focus { - box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) -} - -.btn-outline-white.disabled, -.btn-outline-white:disabled { - color: #fff; - background-color: transparent -} - -.btn-outline-white:not(:disabled):not(.disabled).active, -.btn-outline-white:not(:disabled):not(.disabled):active,.show>.btn-outline-white.dropdown-toggle { - color: #212529; - background-color: #fff; - border-color: #fff -} - -.btn-outline-white:not(:disabled):not(.disabled).active:focus, -.btn-outline-white:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-white.dropdown-toggle:focus { - box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) -} - -.btn-link { - font-weight: 400; - color: #047006; - text-decoration: none -} - -.btn-link:hover { - color: #012602; - text-decoration: underline -} - -.btn-link.focus, -.btn-link:focus { - text-decoration: underline; - box-shadow: none -} - -.btn-link.disabled, -.btn-link:disabled { - color: #6c757d; - pointer-events: none -} - -.btn-group-lg>.btn, -.btn-lg { - padding: .5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: .3rem -} - -.btn-group-sm>.btn, -.btn-sm { - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem -} - -.btn-block { - display: block; - width: 100% -} - -.btn-block+.btn-block { - margin-top: .5rem -} - -input[type=button].btn-block, -input[type=reset].btn-block, -input[type=submit].btn-block { - width: 100% -} - -.fade { - -webkit-transition: opacity .15s linear; - transition: opacity .15s linear -} - -@media (prefers-reduced-motion:reduce) { - .fade { - -webkit-transition: none; - transition: none - } - -} - -.fade:not(.show) { - opacity: 0 -} - -.collapse:not(.show) { - display: none -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - transition: height .35s ease -} - -@media (prefers-reduced-motion:reduce) { - .collapsing { - -webkit-transition: none; - transition: none - } - -} - -.dropdown, -.dropleft, -.dropright, -.dropup { - position: relative -} - -.dropdown-toggle { - white-space: nowrap -} - -.dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: 'http://www.w3.org/2000/svg'; - border-top: .3em solid; - border-right: .3em solid transparent; - border-bottom: 0; - border-left: .3em solid transparent -} - -.dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: .5rem 0; - margin: .125rem 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: .25rem -} - -.dropdown-menu-left { - right: auto; - left: 0 -} - -.dropdown-menu-right { - right: 0; - left: auto -} - -@media (min-width:576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0 - } - - .dropdown-menu-sm-right { - right: 0; - left: auto - } - -} - -@media (min-width:768px) { - .dropdown-menu-md-left { - right: auto; - left: 0 - } - - .dropdown-menu-md-right { - right: 0; - left: auto - } - -} - -@media (min-width:992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0 - } - - .dropdown-menu-lg-right { - right: 0; - left: auto - } - -} - -@media (min-width:1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0 - } - - .dropdown-menu-xl-right { - right: 0; - left: auto - } - -} - -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: .125rem -} - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: '0 0 8 8'; - border-top: 0; - border-right: .3em solid transparent; - border-bottom: .3em solid; - border-left: .3em solid transparent -} - -.dropup .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: .125rem -} - -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: '%2328a745'; - border-top: .3em solid transparent; - border-right: 0; - border-bottom: .3em solid transparent; - border-left: .3em solid -} - -.dropright .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropright .dropdown-toggle::after { - vertical-align: 0 -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: .125rem -} - -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: .255em; - vertical-align: .255em; - content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' -} - -.dropleft .dropdown-toggle::after { - display: none -} - -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: .255em; - vertical-align: .255em; - content: 'http://www.w3.org/2000/svg'; - border-top: .3em solid transparent; - border-right: .3em solid; - border-bottom: .3em solid transparent -} - -.dropleft .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropleft .dropdown-toggle::before { - vertical-align: 0 -} - -.dropdown-menu[x-placement^=bottom], -.dropdown-menu[x-placement^=left], -.dropdown-menu[x-placement^=right], -.dropdown-menu[x-placement^=top] { - right: auto; - bottom: auto -} - -.dropdown-divider { - height: 0; - margin: .5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef -} - -.dropdown-item { - display: block; - width: 100%; - padding: .25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0 -} - -.dropdown-item:focus, -.dropdown-item:hover { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa -} - -.dropdown-item.active, -.dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #007bff -} - -.dropdown-item.disabled, -.dropdown-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: transparent -} - -.dropdown-menu.show { - display: block -} - -.dropdown-header { - display: block; - padding: .5rem 1.5rem; - margin-bottom: 0; - font-size: .875rem; - color: #6c757d; - white-space: nowrap -} - -.dropdown-item-text { - display: block; - padding: .25rem 1.5rem; - color: #212529 -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: -webkit-inline-box; - display: inline-flex; - vertical-align: middle -} - -.btn-group-vertical>.btn, -.btn-group>.btn { - position: relative; - -webkit-box-flex: 1; - flex: 1 1 auto -} - -.btn-group-vertical>.btn:hover, -.btn-group>.btn:hover { - z-index: 1 -} - -.btn-group-vertical>.btn.active, -.btn-group-vertical>.btn:active, -.btn-group-vertical>.btn:focus, -.btn-group>.btn.active, -.btn-group>.btn:active, -.btn-group>.btn:focus { - z-index: 1 -} - -.btn-toolbar { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-pack: start; - justify-content: flex-start -} - -.btn-toolbar .input-group { - width: auto -} - -.btn-group>.btn-group:not(:first-child), -.btn-group>.btn:not(:first-child) { - margin-left: -1px -} - -.btn-group>.btn-group:not(:last-child)>.btn, -.btn-group>.btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.btn-group>.btn-group:not(:first-child)>.btn, -.btn-group>.btn:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.dropdown-toggle-split { - padding-right: .5625rem; - padding-left: .5625rem -} - -.dropdown-toggle-split::after, -.dropright .dropdown-toggle-split::after, -.dropup .dropdown-toggle-split::after { - margin-left: 0 -} - -.dropleft .dropdown-toggle-split::before { - margin-right: 0 -} - -.btn-group-sm>.btn+.dropdown-toggle-split, -.btn-sm+.dropdown-toggle-split { - padding-right: .375rem; - padding-left: .375rem -} - -.btn-group-lg>.btn+.dropdown-toggle-split, -.btn-lg+.dropdown-toggle-split { - padding-right: .75rem; - padding-left: .75rem -} - -.btn-group-vertical { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-align: start; - align-items: flex-start; - -webkit-box-pack: center; - justify-content: center -} - -.btn-group-vertical>.btn, -.btn-group-vertical>.btn-group { - width: 100% -} - -.btn-group-vertical>.btn-group:not(:first-child), -.btn-group-vertical>.btn:not(:first-child) { - margin-top: -1px -} - -.btn-group-vertical>.btn-group:not(:last-child)>.btn, -.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 -} - -.btn-group-vertical>.btn-group:not(:first-child)>.btn, -.btn-group-vertical>.btn:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.btn-group-toggle>.btn, -.btn-group-toggle>.btn-group>.btn { - margin-bottom: 0 -} - -.btn-group-toggle>.btn input[type=checkbox], -.btn-group-toggle>.btn input[type=radio], -.btn-group-toggle>.btn-group>.btn input[type=checkbox], -.btn-group-toggle>.btn-group>.btn input[type=radio] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none -} - -.input-group { - position: relative; - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-align: stretch; - align-items: stretch; - width: 100% -} - -.input-group>.custom-file, -.input-group>.custom-select, -.input-group>.form-control, -.input-group>.form-control-plaintext { - position: relative; - -webkit-box-flex: 1; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0 -} - -.input-group>.custom-file+.custom-file, -.input-group>.custom-file+.custom-select, -.input-group>.custom-file+.form-control, -.input-group>.custom-select+.custom-file, -.input-group>.custom-select+.custom-select, -.input-group>.custom-select+.form-control, -.input-group>.form-control+.custom-file, -.input-group>.form-control+.custom-select, -.input-group>.form-control+.form-control, -.input-group>.form-control-plaintext+.custom-file, -.input-group>.form-control-plaintext+.custom-select, -.input-group>.form-control-plaintext+.form-control { - margin-left: -1px -} - -.input-group>.custom-file .custom-file-input:focus~.custom-file-label, -.input-group>.custom-select:focus, -.input-group>.form-control:focus { - z-index: 3 -} - -.input-group>.custom-file .custom-file-input:focus { - z-index: 4 -} - -.input-group>.custom-select:not(:last-child), -.input-group>.form-control:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group>.custom-select:not(:first-child), -.input-group>.form-control:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.input-group>.custom-file { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center -} - -.input-group>.custom-file:not(:last-child) .custom-file-label, -.input-group>.custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group>.custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.input-group-append, -.input-group-prepend { - display: -webkit-box; - display: flex -} - -.input-group-append .btn, -.input-group-prepend .btn { - position: relative; - z-index: 2 -} - -.input-group-append .btn:focus, -.input-group-prepend .btn:focus { - z-index: 3 -} - -.input-group-append .btn+.btn, -.input-group-append .btn+.input-group-text, -.input-group-append .input-group-text+.btn, -.input-group-append .input-group-text+.input-group-text, -.input-group-prepend .btn+.btn, -.input-group-prepend .btn+.input-group-text, -.input-group-prepend .input-group-text+.btn, -.input-group-prepend .input-group-text+.input-group-text { - margin-left: -1px -} - -.input-group-prepend { - margin-right: -1px -} - -.input-group-append { - margin-left: -1px -} - -.input-group-text { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - padding: .375rem .75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #f0f2f5; - border-radius: .25rem -} - -.input-group-text input[type=checkbox], -.input-group-text input[type=radio] { - margin-top: 0 -} - -.input-group-lg>.custom-select, -.input-group-lg>.form-control:not(textarea) { - height: calc(1.5em + 1rem + 2px) -} - -.input-group-lg>.custom-select, -.input-group-lg>.form-control, -.input-group-lg>.input-group-append>.btn, -.input-group-lg>.input-group-append>.input-group-text, -.input-group-lg>.input-group-prepend>.btn, -.input-group-lg>.input-group-prepend>.input-group-text { - padding: .5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: .3rem -} - -.input-group-sm>.custom-select, -.input-group-sm>.form-control:not(textarea) { - height: calc(1.5em + .5rem + 2px) -} - -.input-group-sm>.custom-select, -.input-group-sm>.form-control, -.input-group-sm>.input-group-append>.btn, -.input-group-sm>.input-group-append>.input-group-text, -.input-group-sm>.input-group-prepend>.btn, -.input-group-sm>.input-group-prepend>.input-group-text { - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem -} - -.input-group-lg>.custom-select, -.input-group-sm>.custom-select { - padding-right: 1.75rem -} - -.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle), -.input-group>.input-group-append:last-child>.input-group-text:not(:last-child), -.input-group>.input-group-append:not(:last-child)>.btn, -.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group>.input-group-append>.btn, -.input-group>.input-group-append>.input-group-text, -.input-group>.input-group-prepend:first-child>.btn:not(:first-child), -.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child), -.input-group>.input-group-prepend:not(:first-child)>.btn, -.input-group>.input-group-prepend:not(:first-child)>.input-group-text { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.custom-control { - position: relative; - display: block; - min-height: 1.7rem; - padding-left: 1.9rem -} - -.custom-control-inline { - display: -webkit-inline-box; - display: inline-flex; - margin-right: 1rem -} - -.custom-control-input { - position: absolute; - z-index: -1; - opacity: 0 -} - -.custom-control-input:checked~.custom-control-label::before { - color: #fff; - border-color: #047006; - background-color: #047006 -} - -.custom-control-input:focus~.custom-control-label::before { - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-control-input:focus:not(:checked)~.custom-control-label::before { - border-color: #80bdff -} - -.custom-control-input:not(:disabled):active~.custom-control-label::before { - color: #fff; - background-color: #b3d7ff; - border-color: #b3d7ff -} - -.custom-control-input:disabled~.custom-control-label { - color: #6c757d -} - -.custom-control-input:disabled~.custom-control-label::before { - background-color: #e9ecef -} - -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top -} - -.custom-control-label::before { - position: absolute; - top: .15rem; - left: -1.9rem; - display: block; - width: 1.4rem; - height: 1.4rem; - pointer-events: none; - content: '0 0 4 5'; - background-color: #fff; - border: #e1e5f1 solid 1px -} - -.custom-control-label::after { - position: absolute; - top: .15rem; - left: -1.9rem; - display: block; - width: 1.4rem; - height: 1.4rem; - content: '%23343a40'; - background: no-repeat 50%/50% 50% -} - -.custom-checkbox .custom-control-label::before { - border-radius: .25rem -} - -.custom-checkbox .custom-control-input:checked~.custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") -} - -.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before { - border-color: #007bff; - background-color: #007bff -} - -.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3c/svg%3e") -} - -.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-radio .custom-control-label::before { - border-radius: 50% -} - -.custom-radio .custom-control-input:checked~.custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3ccircle r=!string!fill=!string!/%3e%3c/svg%3e") -} - -.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-switch { - padding-left: 2.8rem -} - -.custom-switch .custom-control-label::before { - left: -2.8rem; - width: 2.3rem; - pointer-events: all; - border-radius: 25px -} - -.custom-switch .custom-control-label::after { - top: calc(.15rem + 2px); - left: calc(-2.8rem + 2px); - width: 1.1rem; - height: 1.1rem; - background-color: #e1e5f1; - border-radius: 25px; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out; - transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .custom-switch .custom-control-label::after { - -webkit-transition: none; - transition: none - } - -} - -.custom-switch .custom-control-input:checked~.custom-control-label::after { - background-color: #fff; - -webkit-transform: translateX(.9rem); - transform: translateX(.9rem) -} - -.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before { - background-color: rgba(0, 123, 255, .5) -} - -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + .75rem + 2px); - padding: .375rem 1.75rem .375rem .75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: .25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -.custom-select:focus { - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-select:focus::-ms-value { - color: #6c757d; - background-color: #f6f7f9 -} - -.custom-select[multiple], -.custom-select[size]:not([size='M2 0L0 2h4zm0 5L0 3h4z']) { - height: auto; - padding-right: .75rem; - background-image: none -} - -.custom-select:disabled { - color: #6c757d; - background-color: #e9ecef -} - -.custom-select::-ms-expand { - display: none -} - -.custom-select-sm { - height: calc(1.5em + .5rem + 2px); - padding-top: .25rem; - padding-bottom: .25rem; - padding-left: .5rem; - font-size: .875rem -} - -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: .5rem; - padding-bottom: .5rem; - padding-left: 1rem; - font-size: 1.25rem -} - -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + .75rem + 2px); - margin-bottom: 0 -} - -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + .75rem + 2px); - margin: 0; - opacity: 0 -} - -.custom-file-input:focus~.custom-file-label { - border-color: #80bdff; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-file-input:disabled~.custom-file-label { - background-color: #e9ecef -} - -.custom-file-input:lang(en)~.custom-file-label::after { - content: 'http://www.w3.org/2000/svg' -} - -.custom-file-input~.custom-file-label[data-browse]::after { - content: attr(data-browse) -} - -.custom-file-label { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + .75rem + 2px); - padding: .375rem .75rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - background-color: #f6f7f9; - border: 1px solid #f0f2f5; - border-radius: .25rem -} - -.custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + .75rem); - padding: .375rem .75rem; - line-height: 1.5; - color: #495057; - content: '0 0 8 8'; - background-color: #e9ecef; - border-left: inherit; - border-radius: 0 .25rem .25rem 0 -} - -.custom-range { - width: 100%; - height: calc(1rem + .4rem); - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -.custom-range:focus { - outline: 0 -} - -.custom-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-range:focus::-ms-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.custom-range::-moz-focus-outer { - border: 0 -} - -.custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -.25rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - -webkit-appearance: none; - appearance: none -} - -@media (prefers-reduced-motion:reduce) { - .custom-range::-webkit-slider-thumb { - -webkit-transition: none; - transition: none - } - -} - -.custom-range::-webkit-slider-thumb:active { - background-color: #b3d7ff -} - -.custom-range::-webkit-slider-runnable-track { - width: 100%; - height: .5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem -} - -.custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - -moz-appearance: none; - appearance: none -} - -@media (prefers-reduced-motion:reduce) { - .custom-range::-moz-range-thumb { - -webkit-transition: none; - transition: none - } - -} - -.custom-range::-moz-range-thumb:active { - background-color: #b3d7ff -} - -.custom-range::-moz-range-track { - width: 100%; - height: .5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem -} - -.custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: .2rem; - margin-left: .2rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - appearance: none -} - -@media (prefers-reduced-motion:reduce) { - .custom-range::-ms-thumb { - -webkit-transition: none; - transition: none - } - -} - -.custom-range::-ms-thumb:active { - background-color: #b3d7ff -} - -.custom-range::-ms-track { - width: 100%; - height: .5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: .5rem -} - -.custom-range::-ms-fill-lower { - background-color: #dee2e6; - border-radius: 1rem -} - -.custom-range::-ms-fill-upper { - margin-right: 15px; - background-color: #dee2e6; - border-radius: 1rem -} - -.custom-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd -} - -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default -} - -.custom-range:disabled::-moz-range-thumb { - background-color: #adb5bd -} - -.custom-range:disabled::-moz-range-track { - cursor: default -} - -.custom-range:disabled::-ms-thumb { - background-color: #adb5bd -} - -.custom-control-label::before, -.custom-file-label, -.custom-select { - -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .custom-control-label::before, - .custom-file-label, - .custom-select { - -webkit-transition: none; - transition: none - } - -} - -.nav { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none -} - -.nav-link { - display: block; - padding: .5rem 1rem -} - -.nav-link:focus, -.nav-link:hover { - text-decoration: none -} - -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6 -} - -.nav-tabs .nav-item { - margin-bottom: -1px -} - -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 2px; - border-top-right-radius: 2px -} - -.nav-tabs .nav-link:focus, -.nav-tabs .nav-link:hover { - border-color: #e9ecef #e9ecef #dee2e6 -} - -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent -} - -.nav-tabs .nav-item.show .nav-link, -.nav-tabs .nav-link.active { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.nav-pills .nav-link { - border-radius: 2px -} - -.nav-pills .nav-link.active, -.nav-pills .show>.nav-link { - color: #fff; - background-color: #007bff -} - -.nav-fill .nav-item { - -webkit-box-flex: 1; - flex: 1 1 auto; - text-align: center -} - -.nav-justified .nav-item { - flex-basis: 0; - -webkit-box-flex: 1; - flex-grow: 1; - text-align: center -} - -.tab-content>.tab-pane { - display: none -} - -.tab-content>.active { - display: block -} - -.navbar { - position: relative; - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: justify; - justify-content: space-between; - padding: .5rem 1rem -} - -.navbar>.container, -.navbar>.container-fluid { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: justify; - justify-content: space-between -} - -.navbar-brand { - display: inline-block; - padding-top: .3125rem; - padding-bottom: .3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap -} - -.navbar-brand:focus, -.navbar-brand:hover { - text-decoration: none -} - -.navbar-nav { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none -} - -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0 -} - -.navbar-nav .dropdown-menu { - position: static; - float: none -} - -.navbar-text { - display: inline-block; - padding-top: .5rem; - padding-bottom: .5rem -} - -.navbar-collapse { - flex-basis: 100%; - -webkit-box-flex: 1; - flex-grow: 1; - -webkit-box-align: center; - align-items: center -} - -.navbar-toggler { - padding: .25rem .75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: .25rem -} - -.navbar-toggler:focus, -.navbar-toggler:hover { - text-decoration: none -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: '%2328a745'; - background: no-repeat center center; - background-size: 100% 100% -} - -@media (max-width:575.98px) { - .navbar-expand-sm>.container, - .navbar-expand-sm>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:576px) { - .navbar-expand-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-sm .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-sm>.container, - .navbar-expand-sm>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-sm .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-sm .navbar-toggler { - display: none - } - -} - -@media (max-width:767.98px) { - .navbar-expand-md>.container, - .navbar-expand-md>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:768px) { - .navbar-expand-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-md .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-md .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-md>.container, - .navbar-expand-md>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-md .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-md .navbar-toggler { - display: none - } - -} - -@media (max-width:991.98px) { - .navbar-expand-lg>.container, - .navbar-expand-lg>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:992px) { - .navbar-expand-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-lg .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-lg>.container, - .navbar-expand-lg>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-lg .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-lg .navbar-toggler { - display: none - } - -} - -@media (max-width:1199.98px) { - .navbar-expand-xl>.container, - .navbar-expand-xl>.container-fluid { - padding-right: 0; - padding-left: 0 - } - -} - -@media (min-width:1200px) { - .navbar-expand-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start - } - - .navbar-expand-xl .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-xl>.container, - .navbar-expand-xl>.container-fluid { - flex-wrap: nowrap - } - - .navbar-expand-xl .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto - } - - .navbar-expand-xl .navbar-toggler { - display: none - } - -} - -.navbar-expand { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row nowrap; - -webkit-box-pack: start; - justify-content: flex-start -} - -.navbar-expand>.container, -.navbar-expand>.container-fluid { - padding-right: 0; - padding-left: 0 -} - -.navbar-expand .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row -} - -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute -} - -.navbar-expand .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem -} - -.navbar-expand>.container, -.navbar-expand>.container-fluid { - flex-wrap: nowrap -} - -.navbar-expand .navbar-collapse { - display: -webkit-box !important; - display: flex !important; - flex-basis: auto -} - -.navbar-expand .navbar-toggler { - display: none -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-brand:focus, -.navbar-light .navbar-brand:hover { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, .5) -} - -.navbar-light .navbar-nav .nav-link:focus, -.navbar-light .navbar-nav .nav-link:hover { - color: rgba(0, 0, 0, .7) -} - -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, .3) -} - -.navbar-light .navbar-nav .active>.nav-link, -.navbar-light .navbar-nav .nav-link.active, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .show>.nav-link { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, .5); - border-color: rgba(0, 0, 0, .1) -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") -} - -.navbar-light .navbar-text { - color: rgba(0, 0, 0, .5) -} - -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, .9) -} - -.navbar-light .navbar-text a:focus, -.navbar-light .navbar-text a:hover { - color: rgba(0, 0, 0, .9) -} - -.navbar-dark .navbar-brand { - color: #fff -} - -.navbar-dark .navbar-brand:focus, -.navbar-dark .navbar-brand:hover { - color: #fff -} - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, .5) -} - -.navbar-dark .navbar-nav .nav-link:focus, -.navbar-dark .navbar-nav .nav-link:hover { - color: rgba(255, 255, 255, .75) -} - -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, .25) -} - -.navbar-dark .navbar-nav .active>.nav-link, -.navbar-dark .navbar-nav .nav-link.active, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .show>.nav-link { - color: #fff -} - -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, .5); - border-color: rgba(255, 255, 255, .1) -} - -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e") -} - -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, .5) -} - -.navbar-dark .navbar-text a { - color: #fff -} - -.navbar-dark .navbar-text a:focus, -.navbar-dark .navbar-text a:hover { - color: #fff -} - -.card { - position: relative; - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(238, 238, 238, .75); - border-radius: .25rem -} - -.card>hr { - margin-right: 0; - margin-left: 0 -} - -.card>.list-group:first-child .list-group-item:first-child { - border-top-left-radius: .25rem; - border-top-right-radius: .25rem -} - -.card>.list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: .25rem; - border-bottom-left-radius: .25rem -} - -.card-body { - -webkit-box-flex: 1; - flex: 1 1 auto; - padding: 1.25rem -} - -.card-title { - margin-bottom: .75rem -} - -.card-subtitle { - margin-top: -.375rem; - margin-bottom: 0 -} - -.card-text:last-child { - margin-bottom: 0 -} - -.card-link:hover { - text-decoration: none -} - -.card-link+.card-link { - margin-left: 1.25rem -} - -.card-header { - padding: .75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, .03); - border-bottom: 1px solid rgba(238, 238, 238, .75) -} - -.card-header:first-child { - border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0 -} - -.card-header+.list-group .list-group-item:first-child { - border-top: 0 -} - -.card-footer { - padding: .75rem 1.25rem; - background-color: rgba(0, 0, 0, .03); - border-top: 1px solid rgba(238, 238, 238, .75) -} - -.card-footer:last-child { - border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px) -} - -.card-header-tabs { - margin-right: -.625rem; - margin-bottom: -.75rem; - margin-left: -.625rem; - border-bottom: 0 -} - -.card-header-pills { - margin-right: -.625rem; - margin-left: -.625rem -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem -} - -.card-img { - width: 100%; - border-radius: calc(.25rem - 1px) -} - -.card-img-top { - width: 100%; - border-top-left-radius: calc(.25rem - 1px); - border-top-right-radius: calc(.25rem - 1px) -} - -.card-img-bottom { - width: 100%; - border-bottom-right-radius: calc(.25rem - 1px); - border-bottom-left-radius: calc(.25rem - 1px) -} - -.card-deck { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column -} - -.card-deck .card { - margin-bottom: 15px -} - -@media (min-width:576px) { - .card-deck { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap; - margin-right: -15px; - margin-left: -15px - } - - .card-deck .card { - display: -webkit-box; - display: flex; - -webkit-box-flex: 1; - flex: 1 0 0%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - margin-right: 15px; - margin-bottom: 0; - margin-left: 15px - } - -} - -.card-group { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column -} - -.card-group>.card { - margin-bottom: 15px -} - -@media (min-width:576px) { - .card-group { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-flow: row wrap - } - - .card-group>.card { - -webkit-box-flex: 1; - flex: 1 0 0%; - margin-bottom: 0 - } - - .card-group>.card+.card { - margin-left: 0; - border-left: 0 - } - - .card-group>.card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 - } - - .card-group>.card:not(:last-child) .card-header, - .card-group>.card:not(:last-child) .card-img-top { - border-top-right-radius: 0 - } - - .card-group>.card:not(:last-child) .card-footer, - .card-group>.card:not(:last-child) .card-img-bottom { - border-bottom-right-radius: 0 - } - - .card-group>.card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 - } - - .card-group>.card:not(:first-child) .card-header, - .card-group>.card:not(:first-child) .card-img-top { - border-top-left-radius: 0 - } - - .card-group>.card:not(:first-child) .card-footer, - .card-group>.card:not(:first-child) .card-img-bottom { - border-bottom-left-radius: 0 - } - -} - -.card-columns .card { - margin-bottom: .75rem -} - -@media (min-width:576px) { - .card-columns { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1 - } - - .card-columns .card { - display: inline-block; - width: 100% - } - -} - -.accordion>.card { - overflow: hidden -} - -.accordion>.card:not(:first-of-type) .card-header:first-child { - border-radius: 0 -} - -.accordion>.card:not(:first-of-type):not(:last-of-type) { - border-bottom: 0; - border-radius: 0 -} - -.accordion>.card:first-of-type { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 -} - -.accordion>.card:last-of-type { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.accordion>.card .card-header { - margin-bottom: -1px -} - -.breadcrumb { - display: -webkit-box; - display: flex; - flex-wrap: wrap; - padding: .75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #f7f9fa; - border-radius: .25rem -} - -.breadcrumb-item+.breadcrumb-item { - padding-left: .5rem -} - -.breadcrumb-item+.breadcrumb-item::before { - display: inline-block; - padding-right: .5rem; - color: #a8a9ad; - content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z' -} - -.breadcrumb-item+.breadcrumb-item:hover::before { - text-decoration: underline -} - -.breadcrumb-item+.breadcrumb-item:hover::before { - text-decoration: none -} - -.breadcrumb-item.active { - color: #6c757d -} - -.pagination { - display: -webkit-box; - display: flex; - padding-left: 0; - list-style: none; - border-radius: 2px -} - -.page-link { - position: relative; - display: block; - padding: .5rem .75rem; - margin-left: -1px; - line-height: 1.25; - color: #007bff; - background-color: #fff; - border: 1px solid #dee2e6 -} - -.page-link:hover { - z-index: 2; - color: #0056b3; - text-decoration: none; - background-color: #e9ecef; - border-color: #dee2e6 -} - -.page-link:focus { - z-index: 2; - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25) -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px -} - -.page-item:last-child .page-link { - border-top-right-radius: 2px; - border-bottom-right-radius: 2px -} - -.page-item.active .page-link { - z-index: 1; - color: #fff; - background-color: #007bff; - border-color: #007bff -} - -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - cursor: auto; - background-color: #fff; - border-color: #dee2e6 -} - -.pagination-lg .page-link { - padding: .75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5 -} - -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px -} - -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px -} - -.pagination-sm .page-link { - padding: .25rem .5rem; - font-size: .875rem; - line-height: 1.5 -} - -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: .2rem; - border-bottom-left-radius: .2rem -} - -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: .2rem; - border-bottom-right-radius: .2rem -} - -.badge { - display: inline-block; - padding: .45rem 1rem; - font-size: 80%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25rem; - -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .badge { - -webkit-transition: none; - transition: none - } - -} - -a.badge:focus, -a.badge:hover { - text-decoration: none -} - -.badge:empty { - display: none -} - -.btn .badge { - position: relative; - top: -1px -} - -.badge-pill { - padding-right: .5rem; - padding-left: .5rem; - border-radius: 10rem -} - -.badge-primary { - color: #fff; - background-color: #047006 -} - -a.badge-primary:focus, -a.badge-primary:hover { - color: #fff; - background-color: #023f03 -} - -a.badge-primary.focus, -a.badge-primary:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5) -} - -.badge-secondary { - color: #fff; - background-color: grey -} - -a.badge-secondary:focus, -a.badge-secondary:hover { - color: #fff; - background-color: #676767 -} - -a.badge-secondary.focus, -a.badge-secondary:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5) -} - -.badge-success { - color: #fff; - background-color: #047006 -} - -a.badge-success:focus, -a.badge-success:hover { - color: #fff; - background-color: #00ad72 -} - -a.badge-success.focus, -a.badge-success:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5) -} - -.badge-info { - color: #fff; - background-color: #6c61f6 -} - -a.badge-info:focus, -a.badge-info:hover { - color: #fff; - background-color: #3f31f3 -} - -a.badge-info.focus, -a.badge-info:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5) -} - -.badge-warning { - color: #212529; - background-color: #f0825f -} - -a.badge-warning:focus, -a.badge-warning:hover { - color: #212529; - background-color: #ec5e30 -} - -a.badge-warning.focus, -a.badge-warning:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5) -} - -.badge-danger { - color: #fff; - background-color: #ff5f66 -} - -a.badge-danger:focus, -a.badge-danger:hover { - color: #fff; - background-color: #ff2c35 -} - -a.badge-danger.focus, -a.badge-danger:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5) -} - -.badge-light { - color: #212529; - background-color: #dfdfdf -} - -a.badge-light:focus, -a.badge-light:hover { - color: #212529; - background-color: #c6c6c6 -} - -a.badge-light.focus, -a.badge-light:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5) -} - -.badge-dark { - color: #fff; - background-color: #74767b -} - -a.badge-dark:focus, -a.badge-dark:hover { - color: #fff; - background-color: #5b5d61 -} - -a.badge-dark.focus, -a.badge-dark:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5) -} - -.badge-white { - color: #212529; - background-color: #fff -} - -a.badge-white:focus, -a.badge-white:hover { - color: #212529; - background-color: #e6e6e6 -} - -a.badge-white.focus, -a.badge-white:focus { - outline: 0; - box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5) -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 6px -} - -@media (min-width:576px) { - .jumbotron { - padding: 4rem 2rem - } - -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0 -} - -.alert { - position: relative; - padding: 1.15rem 1.15rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 2px -} - -.alert-heading { - color: inherit -} - -.alert-link { - font-weight: 700 -} - -.alert-dismissible { - padding-right: 3.8rem -} - -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - padding: 1.15rem 1.15rem; - color: inherit -} - -.alert-primary { - color: #023a03; - background-color: #cde2cd; - border-color: #b9d7b9 -} - -.alert-primary hr { - border-top-color: #a9cea9 -} - -.alert-primary .alert-link { - color: #000900 -} - -.alert-secondary { - color: #434343; - background-color: #e6e6e6; - border-color: #dbdbdb -} - -.alert-secondary hr { - border-top-color: #cecece -} - -.alert-secondary .alert-link { - color: #2a2a2a -} - -.alert-success { - color: #00744c; - background-color: #ccf9e9; - border-color: #b8f6e1 -} - -.alert-success hr { - border-top-color: #a1f3d7 -} - -.alert-success .alert-link { - color: #00412b -} - -.alert-info { - color: #383280; - background-color: #e2dffd; - border-color: #d6d3fc -} - -.alert-info hr { - border-top-color: #c0bbfa -} - -.alert-info .alert-link { - color: #28245b -} - -.alert-warning { - color: #7d4431; - background-color: #fce6df; - border-color: #fbdcd2 -} - -.alert-warning hr { - border-top-color: #f9cabb -} - -.alert-warning .alert-link { - color: #583023 -} - -.alert-danger { - color: #853135; - background-color: #ffdfe0; - border-color: #ffd2d4 -} - -.alert-danger hr { - border-top-color: #ffb9bc -} - -.alert-danger .alert-link { - color: #602326 -} - -.alert-light { - color: #747474; - background-color: #f9f9f9; - border-color: #f6f6f6 -} - -.alert-light hr { - border-top-color: #e9e9e9 -} - -.alert-light .alert-link { - color: #5b5b5b -} - -.alert-dark { - color: #3c3d40; - background-color: #e3e4e5; - border-color: #d8d9da -} - -.alert-dark hr { - border-top-color: #cbccce -} - -.alert-dark .alert-link { - color: #232426 -} - -.alert-white { - color: #858585; - background-color: #fff; - border-color: #fff -} - -.alert-white hr { - border-top-color: #f2f2f2 -} - -.alert-white .alert-link { - color: #6c6c6c -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0 - } - - to { - background-position: 0 0 - } - -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0 - } - - to { - background-position: 0 0 - } - -} - -.progress { - display: -webkit-box; - display: flex; - height: 1rem; - overflow: hidden; - font-size: .75rem; - background-color: #f3f5f7; - border-radius: 2px -} - -.progress-bar { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-pack: center; - justify-content: center; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #007bff; - -webkit-transition: width .6s ease; - transition: width .6s ease -} - -@media (prefers-reduced-motion:reduce) { - .progress-bar { - -webkit-transition: none; - transition: none - } - -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite -} - -@media (prefers-reduced-motion:reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none - } - -} - -.media { - display: -webkit-box; - display: flex; - -webkit-box-align: start; - align-items: flex-start -} - -.media-body { - -webkit-box-flex: 1; - flex: 1 -} - -.list-group { - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - padding-left: 0; - margin-bottom: 0 -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit -} - -.list-group-item-action:focus, -.list-group-item-action:hover { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa -} - -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef -} - -.list-group-item { - position: relative; - display: block; - padding: .75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, .125) -} - -.list-group-item:first-child { - border-top-left-radius: .25rem; - border-top-right-radius: .25rem -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: .25rem -} - -.list-group-item.disabled, -.list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff -} - -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #007bff; - border-color: #007bff -} - -.list-group-horizontal { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row -} - -.list-group-horizontal .list-group-item { - margin-right: -1px; - margin-bottom: 0 -} - -.list-group-horizontal .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 -} - -.list-group-horizontal .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 -} - -@media (min-width:576px) { - .list-group-horizontal-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-sm .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-sm .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-sm .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -@media (min-width:768px) { - .list-group-horizontal-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-md .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-md .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-md .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -@media (min-width:992px) { - .list-group-horizontal-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-lg .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-lg .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-lg .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -@media (min-width:1200px) { - .list-group-horizontal-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row - } - - .list-group-horizontal-xl .list-group-item { - margin-right: -1px; - margin-bottom: 0 - } - - .list-group-horizontal-xl .list-group-item:first-child { - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - border-top-right-radius: 0 - } - - .list-group-horizontal-xl .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: 0 - } - -} - -.list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0 -} - -.list-group-flush .list-group-item:last-child { - margin-bottom: -1px -} - -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0 -} - -.list-group-flush:last-child .list-group-item:last-child { - margin-bottom: 0; - border-bottom: 0 -} - -.list-group-item-primary { - color: #023a03; - background-color: #b9d7b9 -} - -.list-group-item-primary.list-group-item-action:focus, -.list-group-item-primary.list-group-item-action:hover { - color: #023a03; - background-color: #a9cea9 -} - -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #023a03; - border-color: #023a03 -} - -.list-group-item-secondary { - color: #434343; - background-color: #dbdbdb -} - -.list-group-item-secondary.list-group-item-action:focus, -.list-group-item-secondary.list-group-item-action:hover { - color: #434343; - background-color: #cecece -} - -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #434343; - border-color: #434343 -} - -.list-group-item-success { - color: #00744c; - background-color: #b8f6e1 -} - -.list-group-item-success.list-group-item-action:focus, -.list-group-item-success.list-group-item-action:hover { - color: #00744c; - background-color: #a1f3d7 -} - -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #00744c; - border-color: #00744c -} - -.list-group-item-info { - color: #383280; - background-color: #d6d3fc -} - -.list-group-item-info.list-group-item-action:focus, -.list-group-item-info.list-group-item-action:hover { - color: #383280; - background-color: #c0bbfa -} - -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #383280; - border-color: #383280 -} - -.list-group-item-warning { - color: #7d4431; - background-color: #fbdcd2 -} - -.list-group-item-warning.list-group-item-action:focus, -.list-group-item-warning.list-group-item-action:hover { - color: #7d4431; - background-color: #f9cabb -} - -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #7d4431; - border-color: #7d4431 -} - -.list-group-item-danger { - color: #853135; - background-color: #ffd2d4 -} - -.list-group-item-danger.list-group-item-action:focus, -.list-group-item-danger.list-group-item-action:hover { - color: #853135; - background-color: #ffb9bc -} - -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #853135; - border-color: #853135 -} - -.list-group-item-light { - color: #747474; - background-color: #f6f6f6 -} - -.list-group-item-light.list-group-item-action:focus, -.list-group-item-light.list-group-item-action:hover { - color: #747474; - background-color: #e9e9e9 -} - -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #747474; - border-color: #747474 -} - -.list-group-item-dark { - color: #3c3d40; - background-color: #d8d9da -} - -.list-group-item-dark.list-group-item-action:focus, -.list-group-item-dark.list-group-item-action:hover { - color: #3c3d40; - background-color: #cbccce -} - -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #3c3d40; - border-color: #3c3d40 -} - -.list-group-item-white { - color: #858585; - background-color: #fff -} - -.list-group-item-white.list-group-item-action:focus, -.list-group-item-white.list-group-item-action:hover { - color: #858585; - background-color: #f2f2f2 -} - -.list-group-item-white.list-group-item-action.active { - color: #fff; - background-color: #858585; - border-color: #858585 -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5 -} - -.close:hover { - color: #000; - text-decoration: none -} - -.close:not(:disabled):not(.disabled):focus, -.close:not(:disabled):not(.disabled):hover { - opacity: .75 -} - -button.close { - padding: 0; - background-color: transparent; - border: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - -a.close.disabled { - pointer-events: none -} - -.toast { - max-width: 350px; - overflow: hidden; - font-size: .875rem; - background-color: rgba(255, 255, 255, .85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .1); - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .1); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - opacity: 0; - border-radius: .25rem -} - -.toast:not(:last-child) { - margin-bottom: .75rem -} - -.toast.showing { - opacity: 1 -} - -.toast.show { - display: block; - opacity: 1 -} - -.toast.hide { - display: none -} - -.toast-header { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - padding: .25rem .75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, .85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, .05) -} - -.toast-body { - padding: .75rem -} - -.modal-open { - overflow: hidden -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0 -} - -.modal-dialog { - position: relative; - width: auto; - margin: .5rem; - pointer-events: none -} - -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - transition: -webkit-transform .3s ease-out; - transition: transform .3s ease-out; - transition: transform .3s ease-out, -webkit-transform .3s ease-out; - -webkit-transform: translate(0, -50px); - transform: translate(0, -50px) -} - -@media (prefers-reduced-motion:reduce) { - .modal.fade .modal-dialog { - -webkit-transition: none; - transition: none - } - -} - -.modal.show .modal-dialog { - -webkit-transform: none; - transform: none -} - -.modal-dialog-scrollable { - display: -webkit-box; - display: flex; - max-height: calc(100% - 1rem) -} - -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden -} - -.modal-dialog-scrollable .modal-footer, -.modal-dialog-scrollable .modal-header { - flex-shrink: 0 -} - -.modal-dialog-scrollable .modal-body { - overflow-y: auto -} - -.modal-dialog-centered { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - min-height: calc(100% - 1rem) -} - -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - content: 'http://www.w3.org/2000/svg' -} - -.modal-dialog-centered.modal-dialog-scrollable { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - -webkit-box-pack: center; - justify-content: center; - height: 100% -} - -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none -} - -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none -} - -.modal-content { - position: relative; - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: .3rem; - outline: 0 -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000 -} - -.modal-backdrop.fade { - opacity: 0 -} - -.modal-backdrop.show { - opacity: .8 -} - -.modal-header { - display: -webkit-box; - display: flex; - -webkit-box-align: start; - align-items: flex-start; - -webkit-box-pack: justify; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: .3rem; - border-top-right-radius: .3rem -} - -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5 -} - -.modal-body { - position: relative; - -webkit-box-flex: 1; - flex: 1 1 auto; - padding: 1rem -} - -.modal-footer { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: end; - justify-content: flex-end; - padding: 1rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: .3rem; - border-bottom-left-radius: .3rem -} - -.modal-footer>:not(:first-child) { - margin-left: .25rem -} - -.modal-footer>:not(:last-child) { - margin-right: .25rem -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll -} - -@media (min-width:576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto - } - - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem) - } - - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem) - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem) - } - - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem) - } - - .modal-sm { - max-width: 300px - } - -} - -@media (min-width:992px) { - .modal-lg, - .modal-xl { - max-width: 800px - } - -} - -@media (min-width:1200px) { - .modal-xl { - max-width: 1140px - } - -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.7; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: .875rem; - word-wrap: break-word; - opacity: 0 -} - -.tooltip.show { - opacity: .9 -} - -.tooltip .arrow { - position: absolute; - display: block; - width: .8rem; - height: .4rem -} - -.tooltip .arrow::before { - position: absolute; - content: '%23dc3545'; - border-color: transparent; - border-style: solid -} - -.bs-tooltip-auto[x-placement^=top], -.bs-tooltip-top { - padding: .4rem 0 -} - -.bs-tooltip-auto[x-placement^=top] .arrow, -.bs-tooltip-top .arrow { - bottom: 0 -} - -.bs-tooltip-auto[x-placement^=top] .arrow::before, -.bs-tooltip-top .arrow::before { - top: 0; - border-width: .4rem .4rem 0; - border-top-color: #000 -} - -.bs-tooltip-auto[x-placement^=right], -.bs-tooltip-right { - padding: 0 .4rem -} - -.bs-tooltip-auto[x-placement^=right] .arrow, -.bs-tooltip-right .arrow { - left: 0; - width: .4rem; - height: .8rem -} - -.bs-tooltip-auto[x-placement^=right] .arrow::before, -.bs-tooltip-right .arrow::before { - right: 0; - border-width: .4rem .4rem .4rem 0; - border-right-color: #000 -} - -.bs-tooltip-auto[x-placement^=bottom], -.bs-tooltip-bottom { - padding: .4rem 0 -} - -.bs-tooltip-auto[x-placement^=bottom] .arrow, -.bs-tooltip-bottom .arrow { - top: 0 -} - -.bs-tooltip-auto[x-placement^=bottom] .arrow::before, -.bs-tooltip-bottom .arrow::before { - bottom: 0; - border-width: 0 .4rem .4rem; - border-bottom-color: #000 -} - -.bs-tooltip-auto[x-placement^=left], -.bs-tooltip-left { - padding: 0 .4rem -} - -.bs-tooltip-auto[x-placement^=left] .arrow, -.bs-tooltip-left .arrow { - right: 0; - width: .4rem; - height: .8rem -} - -.bs-tooltip-auto[x-placement^=left] .arrow::before, -.bs-tooltip-left .arrow::before { - left: 0; - border-width: .4rem 0 .4rem .4rem; - border-left-color: #000 -} - -.tooltip-inner { - max-width: 200px; - padding: .25rem .5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: .25rem -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.7; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: .875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: .3rem -} - -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: .5rem; - margin: 0 6px -} - -.popover .arrow::after, -.popover .arrow::before { - position: absolute; - display: block; - content: '-2 -2 7 7'; - border-color: transparent; - border-style: solid -} - -.bs-popover-auto[x-placement^=top], -.bs-popover-top { - margin-bottom: .5rem -} - -.bs-popover-auto[x-placement^=top]>.arrow, -.bs-popover-top>.arrow { - bottom: calc((.5rem + 1px) * -1) -} - -.bs-popover-auto[x-placement^=top]>.arrow::before, -.bs-popover-top>.arrow::before { - bottom: 0; - border-width: .5rem .5rem 0; - border-top-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=top]>.arrow::after, -.bs-popover-top>.arrow::after { - bottom: 1px; - border-width: .5rem .5rem 0; - border-top-color: #fff -} - -.bs-popover-auto[x-placement^=right], -.bs-popover-right { - margin-left: .5rem -} - -.bs-popover-auto[x-placement^=right]>.arrow, -.bs-popover-right>.arrow { - left: calc((.5rem + 1px) * -1); - width: .5rem; - height: 1rem; - margin: 6px 0 -} - -.bs-popover-auto[x-placement^=right]>.arrow::before, -.bs-popover-right>.arrow::before { - left: 0; - border-width: .5rem .5rem .5rem 0; - border-right-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=right]>.arrow::after, -.bs-popover-right>.arrow::after { - left: 1px; - border-width: .5rem .5rem .5rem 0; - border-right-color: #fff -} - -.bs-popover-auto[x-placement^=bottom], -.bs-popover-bottom { - margin-top: .5rem -} - -.bs-popover-auto[x-placement^=bottom]>.arrow, -.bs-popover-bottom>.arrow { - top: calc((.5rem + 1px) * -1) -} - -.bs-popover-auto[x-placement^=bottom]>.arrow::before, -.bs-popover-bottom>.arrow::before { - top: 0; - border-width: 0 .5rem .5rem .5rem; - border-bottom-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=bottom]>.arrow::after, -.bs-popover-bottom>.arrow::after { - top: 1px; - border-width: 0 .5rem .5rem .5rem; - border-bottom-color: #fff -} - -.bs-popover-auto[x-placement^=bottom] .popover-header::before, -.bs-popover-bottom .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -.5rem; - content: '%23dc3545'; - border-bottom: 1px solid #f7f7f7 -} - -.bs-popover-auto[x-placement^=left], -.bs-popover-left { - margin-right: .5rem -} - -.bs-popover-auto[x-placement^=left]>.arrow, -.bs-popover-left>.arrow { - right: calc((.5rem + 1px) * -1); - width: .5rem; - height: 1rem; - margin: 6px 0 -} - -.bs-popover-auto[x-placement^=left]>.arrow::before, -.bs-popover-left>.arrow::before { - right: 0; - border-width: .5rem 0 .5rem .5rem; - border-left-color: rgba(0, 0, 0, .25) -} - -.bs-popover-auto[x-placement^=left]>.arrow::after, -.bs-popover-left>.arrow::after { - right: 1px; - border-width: .5rem 0 .5rem .5rem; - border-left-color: #fff -} - -.popover-header { - padding: .5rem .75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(6px - 1px); - border-top-right-radius: calc(6px - 1px) -} - -.popover-header:empty { - display: none -} - -.popover-body { - padding: .5rem .75rem; - color: #212529 -} - -.carousel { - position: relative -} - -.carousel.pointer-event { - touch-action: pan-y -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden -} - -.carousel-inner::after { - display: block; - clear: both; - content: 'M0 0l3 3m0-3L0 3' -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transition: -webkit-transform .6s ease-in-out; - transition: -webkit-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out -} - -@media (prefers-reduced-motion:reduce) { - .carousel-item { - -webkit-transition: none; - transition: none - } - -} - -.carousel-item-next, -.carousel-item-prev, -.carousel-item.active { - display: block -} - -.active.carousel-item-right, -.carousel-item-next:not(.carousel-item-left) { - -webkit-transform: translateX(100%); - transform: translateX(100%) -} - -.active.carousel-item-left, -.carousel-item-prev:not(.carousel-item-right) { - -webkit-transform: translateX(-100%); - transform: translateX(-100%) -} - -.carousel-fade .carousel-item { - opacity: 0; - -webkit-transition-property: opacity; - transition-property: opacity; - -webkit-transform: none; - transform: none -} - -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right, -.carousel-fade .carousel-item.active { - z-index: 1; - opacity: 1 -} - -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - -webkit-transition: 0s .6s opacity; - transition: 0s .6s opacity -} - -@media (prefers-reduced-motion:reduce) { - .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-right { - -webkit-transition: none; - transition: none - } - -} - -.carousel-control-next, -.carousel-control-prev { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: .5; - -webkit-transition: opacity .15s ease; - transition: opacity .15s ease -} - -@media (prefers-reduced-motion:reduce) { - .carousel-control-next, - .carousel-control-prev { - -webkit-transition: none; - transition: none - } - -} - -.carousel-control-next:focus, -.carousel-control-next:hover, -.carousel-control-prev:focus, -.carousel-control-prev:hover { - color: #fff; - text-decoration: none; - outline: 0; - opacity: .9 -} - -.carousel-control-prev { - left: 0 -} - -.carousel-control-next { - right: 0 -} - -.carousel-control-next-icon, -.carousel-control-prev-icon { - display: inline-block; - width: 20px; - height: 20px; - background: no-repeat 50%/100% 100% -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e") -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none -} - -.carousel-indicators li { - box-sizing: content-box; - -webkit-box-flex: 0; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: .5; - -webkit-transition: opacity .6s ease; - transition: opacity .6s ease -} - -@media (prefers-reduced-motion:reduce) { - .carousel-indicators li { - -webkit-transition: none; - transition: none - } - -} - -.carousel-indicators .active { - opacity: 1 -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center -} - -@-webkit-keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } - -} - -@keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg) - } - -} - -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - border: .25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border .75s linear infinite; - animation: spinner-border .75s linear infinite -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: .2em -} - -@-webkit-keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0) - } - - 50% { - opacity: 1 - } - -} - -@keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0) - } - - 50% { - opacity: 1 - } - -} - -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: spinner-grow .75s linear infinite; - animation: spinner-grow .75s linear infinite -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem -} - -.align-baseline { - vertical-align: baseline !important -} - -.align-top { - vertical-align: top !important -} - -.align-middle { - vertical-align: middle !important -} - -.align-bottom { - vertical-align: bottom !important -} - -.align-text-bottom { - vertical-align: text-bottom !important -} - -.align-text-top { - vertical-align: text-top !important -} - -.bg-primary { - background-color: #047006 !important -} - -a.bg-primary:focus, -a.bg-primary:hover, -button.bg-primary:focus, -button.bg-primary:hover { - background-color: #023f03 !important -} - -.bg-secondary { - background-color: grey !important -} - -a.bg-secondary:focus, -a.bg-secondary:hover, -button.bg-secondary:focus, -button.bg-secondary:hover { - background-color: #676767 !important -} - -.bg-success { - background-color: #047006 !important -} - -a.bg-success:focus, -a.bg-success:hover, -button.bg-success:focus, -button.bg-success:hover { - background-color: #00ad72 !important -} - -.bg-info { - background-color: #6c61f6 !important -} - -a.bg-info:focus, -a.bg-info:hover, -button.bg-info:focus, -button.bg-info:hover { - background-color: #3f31f3 !important -} - -.bg-warning { - background-color: #f0825f !important -} - -a.bg-warning:focus, -a.bg-warning:hover, -button.bg-warning:focus, -button.bg-warning:hover { - background-color: #ec5e30 !important -} - -.bg-danger { - background-color: #ff5f66 !important -} - -a.bg-danger:focus, -a.bg-danger:hover, -button.bg-danger:focus, -button.bg-danger:hover { - background-color: #ff2c35 !important -} - -.bg-light { - background-color: #dfdfdf !important -} - -a.bg-light:focus, -a.bg-light:hover, -button.bg-light:focus, -button.bg-light:hover { - background-color: #c6c6c6 !important -} - -.bg-dark { - background-color: #74767b !important -} - -a.bg-dark:focus, -a.bg-dark:hover, -button.bg-dark:focus, -button.bg-dark:hover { - background-color: #5b5d61 !important -} - -.bg-white { - background-color: #fff !important -} - -a.bg-white:focus, -a.bg-white:hover, -button.bg-white:focus, -button.bg-white:hover { - background-color: #e6e6e6 !important -} - -.bg-white { - background-color: #fff !important -} - -.bg-transparent { - background-color: transparent !important -} - -.border { - border: 1px solid #f2f4f9 !important -} - -.border-top { - border-top: 1px solid #f2f4f9 !important -} - -.border-right { - border-right: 1px solid #f2f4f9 !important -} - -.border-bottom { - border-bottom: 1px solid #f2f4f9 !important -} - -.border-left { - border-left: 1px solid #f2f4f9 !important -} - -.border-0 { - border: 0 !important -} - -.border-top-0 { - border-top: 0 !important -} - -.border-right-0 { - border-right: 0 !important -} - -.border-bottom-0 { - border-bottom: 0 !important -} - -.border-left-0 { - border-left: 0 !important -} - -.border-primary { - border-color: #047006 !important -} - -.border-secondary { - border-color: grey !important -} - -.border-success { - border-color: #047006 !important -} - -.border-info { - border-color: #6c61f6 !important -} - -.border-warning { - border-color: #f0825f !important -} - -.border-danger { - border-color: #ff5f66 !important -} - -.border-light { - border-color: #dfdfdf !important -} - -.border-dark { - border-color: #74767b !important -} - -.border-white { - border-color: #fff !important -} - -.border-white { - border-color: #fff !important -} - -.rounded-sm { - border-radius: .2rem !important -} - -.rounded { - border-radius: 2px !important -} - -.rounded-top { - border-top-left-radius: 2px !important; - border-top-right-radius: 2px !important -} - -.rounded-right { - border-top-right-radius: 2px !important; - border-bottom-right-radius: 2px !important -} - -.rounded-bottom { - border-bottom-right-radius: 2px !important; - border-bottom-left-radius: 2px !important -} - -.rounded-left { - border-top-left-radius: 2px !important; - border-bottom-left-radius: 2px !important -} - -.rounded-lg { - border-radius: 6px !important -} - -.rounded-circle { - border-radius: 50% !important -} - -.rounded-pill { - border-radius: 50rem !important -} - -.rounded-0 { - border-radius: 0 !important -} - -.clearfix::after { - display: block; - clear: both; - content: '.5' -} - -.d-none { - display: none !important -} - -.d-inline { - display: inline !important -} - -.d-inline-block { - display: inline-block !important -} - -.d-block { - display: block !important -} - -.d-table { - display: table !important -} - -.d-table-row { - display: table-row !important -} - -.d-table-cell { - display: table-cell !important -} - -.d-flex { - display: -webkit-box !important; - display: flex !important -} - -.d-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important -} - -@media (min-width:576px) { - .d-sm-none { - display: none !important - } - - .d-sm-inline { - display: inline !important - } - - .d-sm-inline-block { - display: inline-block !important - } - - .d-sm-block { - display: block !important - } - - .d-sm-table { - display: table !important - } - - .d-sm-table-row { - display: table-row !important - } - - .d-sm-table-cell { - display: table-cell !important - } - - .d-sm-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-sm-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media (min-width:768px) { - .d-md-none { - display: none !important - } - - .d-md-inline { - display: inline !important - } - - .d-md-inline-block { - display: inline-block !important - } - - .d-md-block { - display: block !important - } - - .d-md-table { - display: table !important - } - - .d-md-table-row { - display: table-row !important - } - - .d-md-table-cell { - display: table-cell !important - } - - .d-md-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-md-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media (min-width:992px) { - .d-lg-none { - display: none !important - } - - .d-lg-inline { - display: inline !important - } - - .d-lg-inline-block { - display: inline-block !important - } - - .d-lg-block { - display: block !important - } - - .d-lg-table { - display: table !important - } - - .d-lg-table-row { - display: table-row !important - } - - .d-lg-table-cell { - display: table-cell !important - } - - .d-lg-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-lg-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media (min-width:1200px) { - .d-xl-none { - display: none !important - } - - .d-xl-inline { - display: inline !important - } - - .d-xl-inline-block { - display: inline-block !important - } - - .d-xl-block { - display: block !important - } - - .d-xl-table { - display: table !important - } - - .d-xl-table-row { - display: table-row !important - } - - .d-xl-table-cell { - display: table-cell !important - } - - .d-xl-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-xl-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -@media print { - .d-print-none { - display: none !important - } - - .d-print-inline { - display: inline !important - } - - .d-print-inline-block { - display: inline-block !important - } - - .d-print-block { - display: block !important - } - - .d-print-table { - display: table !important - } - - .d-print-table-row { - display: table-row !important - } - - .d-print-table-cell { - display: table-cell !important - } - - .d-print-flex { - display: -webkit-box !important; - display: flex !important - } - - .d-print-inline-flex { - display: -webkit-inline-box !important; - display: inline-flex !important - } - -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden -} - -.embed-responsive::before { - display: block; - content: '3' -} - -.embed-responsive .embed-responsive-item, -.embed-responsive embed, -.embed-responsive iframe, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0 -} - -.embed-responsive-21by9::before { - padding-top: 42.85714% -} - -.embed-responsive-16by9::before { - padding-top: 56.25% -} - -.embed-responsive-4by3::before { - padding-top: 75% -} - -.embed-responsive-1by1::before { - padding-top: 100% -} - -.embed-responsive-21by9::before { - padding-top: 42.85714% -} - -.embed-responsive-16by9::before { - padding-top: 56.25% -} - -.embed-responsive-4by3::before { - padding-top: 75% -} - -.embed-responsive-1by1::before { - padding-top: 100% -} - -.flex-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important -} - -.flex-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important -} - -.flex-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important -} - -.flex-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important -} - -.flex-wrap { - flex-wrap: wrap !important -} - -.flex-nowrap { - flex-wrap: nowrap !important -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important -} - -.flex-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important -} - -.flex-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important -} - -.flex-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important -} - -.flex-shrink-0 { - flex-shrink: 0 !important -} - -.flex-shrink-1 { - flex-shrink: 1 !important -} - -.justify-content-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important -} - -.justify-content-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important -} - -.justify-content-center { - -webkit-box-pack: center !important; - justify-content: center !important -} - -.justify-content-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important -} - -.justify-content-around { - justify-content: space-around !important -} - -.align-items-start { - -webkit-box-align: start !important; - align-items: flex-start !important -} - -.align-items-end { - -webkit-box-align: end !important; - align-items: flex-end !important -} - -.align-items-center { - -webkit-box-align: center !important; - align-items: center !important -} - -.align-items-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important -} - -.align-items-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important -} - -.align-content-start { - align-content: flex-start !important -} - -.align-content-end { - align-content: flex-end !important -} - -.align-content-center { - align-content: center !important -} - -.align-content-between { - align-content: space-between !important -} - -.align-content-around { - align-content: space-around !important -} - -.align-content-stretch { - align-content: stretch !important -} - -.align-self-auto { - align-self: auto !important -} - -.align-self-start { - align-self: flex-start !important -} - -.align-self-end { - align-self: flex-end !important -} - -.align-self-center { - align-self: center !important -} - -.align-self-baseline { - align-self: baseline !important -} - -.align-self-stretch { - align-self: stretch !important -} - -@media (min-width:576px) { - .flex-sm-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-sm-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-sm-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-sm-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-sm-wrap { - flex-wrap: wrap !important - } - - .flex-sm-nowrap { - flex-wrap: nowrap !important - } - - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-sm-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-sm-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-sm-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-sm-shrink-0 { - flex-shrink: 0 !important - } - - .flex-sm-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-sm-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-sm-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-sm-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-sm-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-sm-around { - justify-content: space-around !important - } - - .align-items-sm-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-sm-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-sm-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-sm-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-sm-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-sm-start { - align-content: flex-start !important - } - - .align-content-sm-end { - align-content: flex-end !important - } - - .align-content-sm-center { - align-content: center !important - } - - .align-content-sm-between { - align-content: space-between !important - } - - .align-content-sm-around { - align-content: space-around !important - } - - .align-content-sm-stretch { - align-content: stretch !important - } - - .align-self-sm-auto { - align-self: auto !important - } - - .align-self-sm-start { - align-self: flex-start !important - } - - .align-self-sm-end { - align-self: flex-end !important - } - - .align-self-sm-center { - align-self: center !important - } - - .align-self-sm-baseline { - align-self: baseline !important - } - - .align-self-sm-stretch { - align-self: stretch !important - } - -} - -@media (min-width:768px) { - .flex-md-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-md-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-md-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-md-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-md-wrap { - flex-wrap: wrap !important - } - - .flex-md-nowrap { - flex-wrap: nowrap !important - } - - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-md-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-md-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-md-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-md-shrink-0 { - flex-shrink: 0 !important - } - - .flex-md-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-md-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-md-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-md-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-md-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-md-around { - justify-content: space-around !important - } - - .align-items-md-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-md-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-md-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-md-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-md-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-md-start { - align-content: flex-start !important - } - - .align-content-md-end { - align-content: flex-end !important - } - - .align-content-md-center { - align-content: center !important - } - - .align-content-md-between { - align-content: space-between !important - } - - .align-content-md-around { - align-content: space-around !important - } - - .align-content-md-stretch { - align-content: stretch !important - } - - .align-self-md-auto { - align-self: auto !important - } - - .align-self-md-start { - align-self: flex-start !important - } - - .align-self-md-end { - align-self: flex-end !important - } - - .align-self-md-center { - align-self: center !important - } - - .align-self-md-baseline { - align-self: baseline !important - } - - .align-self-md-stretch { - align-self: stretch !important - } - -} - -@media (min-width:992px) { - .flex-lg-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-lg-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-lg-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-lg-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-lg-wrap { - flex-wrap: wrap !important - } - - .flex-lg-nowrap { - flex-wrap: nowrap !important - } - - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-lg-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-lg-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-lg-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-lg-shrink-0 { - flex-shrink: 0 !important - } - - .flex-lg-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-lg-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-lg-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-lg-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-lg-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-lg-around { - justify-content: space-around !important - } - - .align-items-lg-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-lg-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-lg-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-lg-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-lg-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-lg-start { - align-content: flex-start !important - } - - .align-content-lg-end { - align-content: flex-end !important - } - - .align-content-lg-center { - align-content: center !important - } - - .align-content-lg-between { - align-content: space-between !important - } - - .align-content-lg-around { - align-content: space-around !important - } - - .align-content-lg-stretch { - align-content: stretch !important - } - - .align-self-lg-auto { - align-self: auto !important - } - - .align-self-lg-start { - align-self: flex-start !important - } - - .align-self-lg-end { - align-self: flex-end !important - } - - .align-self-lg-center { - align-self: center !important - } - - .align-self-lg-baseline { - align-self: baseline !important - } - - .align-self-lg-stretch { - align-self: stretch !important - } - -} - -@media (min-width:1200px) { - .flex-xl-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - flex-direction: row !important - } - - .flex-xl-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - flex-direction: column !important - } - - .flex-xl-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - flex-direction: row-reverse !important - } - - .flex-xl-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - flex-direction: column-reverse !important - } - - .flex-xl-wrap { - flex-wrap: wrap !important - } - - .flex-xl-nowrap { - flex-wrap: nowrap !important - } - - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important - } - - .flex-xl-fill { - -webkit-box-flex: 1 !important; - flex: 1 1 auto !important - } - - .flex-xl-grow-0 { - -webkit-box-flex: 0 !important; - flex-grow: 0 !important - } - - .flex-xl-grow-1 { - -webkit-box-flex: 1 !important; - flex-grow: 1 !important - } - - .flex-xl-shrink-0 { - flex-shrink: 0 !important - } - - .flex-xl-shrink-1 { - flex-shrink: 1 !important - } - - .justify-content-xl-start { - -webkit-box-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-xl-end { - -webkit-box-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-xl-center { - -webkit-box-pack: center !important; - justify-content: center !important - } - - .justify-content-xl-between { - -webkit-box-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-xl-around { - justify-content: space-around !important - } - - .align-items-xl-start { - -webkit-box-align: start !important; - align-items: flex-start !important - } - - .align-items-xl-end { - -webkit-box-align: end !important; - align-items: flex-end !important - } - - .align-items-xl-center { - -webkit-box-align: center !important; - align-items: center !important - } - - .align-items-xl-baseline { - -webkit-box-align: baseline !important; - align-items: baseline !important - } - - .align-items-xl-stretch { - -webkit-box-align: stretch !important; - align-items: stretch !important - } - - .align-content-xl-start { - align-content: flex-start !important - } - - .align-content-xl-end { - align-content: flex-end !important - } - - .align-content-xl-center { - align-content: center !important - } - - .align-content-xl-between { - align-content: space-between !important - } - - .align-content-xl-around { - align-content: space-around !important - } - - .align-content-xl-stretch { - align-content: stretch !important - } - - .align-self-xl-auto { - align-self: auto !important - } - - .align-self-xl-start { - align-self: flex-start !important - } - - .align-self-xl-end { - align-self: flex-end !important - } - - .align-self-xl-center { - align-self: center !important - } - - .align-self-xl-baseline { - align-self: baseline !important - } - - .align-self-xl-stretch { - align-self: stretch !important - } - -} - -.float-left { - float: left !important -} - -.float-right { - float: right !important -} - -.float-none { - float: none !important -} - -@media (min-width:576px) { - .float-sm-left { - float: left !important - } - - .float-sm-right { - float: right !important - } - - .float-sm-none { - float: none !important - } - -} - -@media (min-width:768px) { - .float-md-left { - float: left !important - } - - .float-md-right { - float: right !important - } - - .float-md-none { - float: none !important - } - -} - -@media (min-width:992px) { - .float-lg-left { - float: left !important - } - - .float-lg-right { - float: right !important - } - - .float-lg-none { - float: none !important - } - -} - -@media (min-width:1200px) { - .float-xl-left { - float: left !important - } - - .float-xl-right { - float: right !important - } - - .float-xl-none { - float: none !important - } - -} - -.overflow-auto { - overflow: auto !important -} - -.overflow-hidden { - overflow: hidden !important -} - -.position-static { - position: static !important -} - -.position-relative { - position: relative !important -} - -.position-absolute { - position: absolute !important -} - -.position-fixed { - position: fixed !important -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030 -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030 -} - -@supports ((position:-webkit-sticky) or (position:sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020 - } - -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0 -} - -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal -} - -.shadow-sm { - box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important -} - -.shadow { - box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important -} - -.shadow-none { - box-shadow: none !important -} - -.w-25 { - width: 25% !important -} - -.w-50 { - width: 50% !important -} - -.w-75 { - width: 75% !important -} - -.w-100 { - width: 100% !important -} - -.w-auto { - width: auto !important -} - -.h-25 { - height: 25% !important -} - -.h-50 { - height: 50% !important -} - -.h-75 { - height: 75% !important -} - -.h-100 { - height: 100% !important -} - -.h-auto { - height: auto !important -} - -.mw-100 { - max-width: 100% !important -} - -.mh-100 { - max-height: 100% !important -} - -.min-vw-100 { - min-width: 100vw !important -} - -.min-vh-100 { - min-height: 100vh !important -} - -.vw-100 { - width: 100vw !important -} - -.vh-100 { - height: 100vh !important -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: '.5'; - background-color: rgba(0, 0, 0, 0) -} - -.m-0 { - margin: 0 !important -} - -.mt-0, -.my-0 { - margin-top: 0 !important -} - -.mr-0, -.mx-0 { - margin-right: 0 !important -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important -} - -.ml-0, -.mx-0 { - margin-left: 0 !important -} - -.m-1 { - margin: .25rem !important -} - -.mt-1, -.my-1 { - margin-top: .25rem !important -} - -.mr-1, -.mx-1 { - margin-right: .25rem !important -} - -.mb-1, -.my-1 { - margin-bottom: .25rem !important -} - -.ml-1, -.mx-1 { - margin-left: .25rem !important -} - -.m-2 { - margin: .5rem !important -} - -.mt-2, -.my-2 { - margin-top: .5rem !important -} - -.mr-2, -.mx-2 { - margin-right: .5rem !important -} - -.mb-2, -.my-2 { - margin-bottom: .5rem !important -} - -.ml-2, -.mx-2 { - margin-left: .5rem !important -} - -.m-3 { - margin: 1rem !important -} - -.mt-3, -.my-3 { - margin-top: 1rem !important -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important -} - -.m-4 { - margin: 1.5rem !important -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important -} - -.m-5 { - margin: 3rem !important -} - -.mt-5, -.my-5 { - margin-top: 3rem !important -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important -} - -.p-0 { - padding: 0 !important -} - -.pt-0, -.py-0 { - padding-top: 0 !important -} - -.pr-0, -.px-0 { - padding-right: 0 !important -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important -} - -.pl-0, -.px-0 { - padding-left: 0 !important -} - -.p-1 { - padding: .25rem !important -} - -.pt-1, -.py-1 { - padding-top: .25rem !important -} - -.pr-1, -.px-1 { - padding-right: .25rem !important -} - -.pb-1, -.py-1 { - padding-bottom: .25rem !important -} - -.pl-1, -.px-1 { - padding-left: .25rem !important -} - -.p-2 { - padding: .5rem !important -} - -.pt-2, -.py-2 { - padding-top: .5rem !important -} - -.pr-2, -.px-2 { - padding-right: .5rem !important -} - -.pb-2, -.py-2 { - padding-bottom: .5rem !important -} - -.pl-2, -.px-2 { - padding-left: .5rem !important -} - -.p-3 { - padding: 1rem !important -} - -.pt-3, -.py-3 { - padding-top: 1rem !important -} - -.pr-3, -.px-3 { - padding-right: 1rem !important -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important -} - -.pl-3, -.px-3 { - padding-left: 1rem !important -} - -.p-4 { - padding: 1.5rem !important -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important -} - -.p-5 { - padding: 3rem !important -} - -.pt-5, -.py-5 { - padding-top: 3rem !important -} - -.pr-5, -.px-5 { - padding-right: 3rem !important -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important -} - -.pl-5, -.px-5 { - padding-left: 3rem !important -} - -.m-n1 { - margin: -.25rem !important -} - -.mt-n1, -.my-n1 { - margin-top: -.25rem !important -} - -.mr-n1, -.mx-n1 { - margin-right: -.25rem !important -} - -.mb-n1, -.my-n1 { - margin-bottom: -.25rem !important -} - -.ml-n1, -.mx-n1 { - margin-left: -.25rem !important -} - -.m-n2 { - margin: -.5rem !important -} - -.mt-n2, -.my-n2 { - margin-top: -.5rem !important -} - -.mr-n2, -.mx-n2 { - margin-right: -.5rem !important -} - -.mb-n2, -.my-n2 { - margin-bottom: -.5rem !important -} - -.ml-n2, -.mx-n2 { - margin-left: -.5rem !important -} - -.m-n3 { - margin: -1rem !important -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important -} - -.m-n4 { - margin: -1.5rem !important -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important -} - -.m-n5 { - margin: -3rem !important -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important -} - -.m-auto { - margin: auto !important -} - -.mt-auto, -.my-auto { - margin-top: auto !important -} - -.mr-auto, -.mx-auto { - margin-right: auto !important -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important -} - -.ml-auto, -.mx-auto { - margin-left: auto !important -} - -@media (min-width:576px) { - .m-sm-0 { - margin: 0 !important - } - - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important - } - - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important - } - - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important - } - - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important - } - - .m-sm-1 { - margin: .25rem !important - } - - .mt-sm-1, - .my-sm-1 { - margin-top: .25rem !important - } - - .mr-sm-1, - .mx-sm-1 { - margin-right: .25rem !important - } - - .mb-sm-1, - .my-sm-1 { - margin-bottom: .25rem !important - } - - .ml-sm-1, - .mx-sm-1 { - margin-left: .25rem !important - } - - .m-sm-2 { - margin: .5rem !important - } - - .mt-sm-2, - .my-sm-2 { - margin-top: .5rem !important - } - - .mr-sm-2, - .mx-sm-2 { - margin-right: .5rem !important - } - - .mb-sm-2, - .my-sm-2 { - margin-bottom: .5rem !important - } - - .ml-sm-2, - .mx-sm-2 { - margin-left: .5rem !important - } - - .m-sm-3 { - margin: 1rem !important - } - - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important - } - - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important - } - - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important - } - - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important - } - - .m-sm-4 { - margin: 1.5rem !important - } - - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important - } - - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important - } - - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important - } - - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important - } - - .m-sm-5 { - margin: 3rem !important - } - - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important - } - - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important - } - - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important - } - - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important - } - - .p-sm-0 { - padding: 0 !important - } - - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important - } - - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important - } - - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important - } - - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important - } - - .p-sm-1 { - padding: .25rem !important - } - - .pt-sm-1, - .py-sm-1 { - padding-top: .25rem !important - } - - .pr-sm-1, - .px-sm-1 { - padding-right: .25rem !important - } - - .pb-sm-1, - .py-sm-1 { - padding-bottom: .25rem !important - } - - .pl-sm-1, - .px-sm-1 { - padding-left: .25rem !important - } - - .p-sm-2 { - padding: .5rem !important - } - - .pt-sm-2, - .py-sm-2 { - padding-top: .5rem !important - } - - .pr-sm-2, - .px-sm-2 { - padding-right: .5rem !important - } - - .pb-sm-2, - .py-sm-2 { - padding-bottom: .5rem !important - } - - .pl-sm-2, - .px-sm-2 { - padding-left: .5rem !important - } - - .p-sm-3 { - padding: 1rem !important - } - - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important - } - - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important - } - - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important - } - - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important - } - - .p-sm-4 { - padding: 1.5rem !important - } - - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important - } - - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important - } - - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important - } - - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important - } - - .p-sm-5 { - padding: 3rem !important - } - - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important - } - - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important - } - - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important - } - - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important - } - - .m-sm-n1 { - margin: -.25rem !important - } - - .mt-sm-n1, - .my-sm-n1 { - margin-top: -.25rem !important - } - - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -.25rem !important - } - - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -.25rem !important - } - - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -.25rem !important - } - - .m-sm-n2 { - margin: -.5rem !important - } - - .mt-sm-n2, - .my-sm-n2 { - margin-top: -.5rem !important - } - - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -.5rem !important - } - - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -.5rem !important - } - - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -.5rem !important - } - - .m-sm-n3 { - margin: -1rem !important - } - - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important - } - - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important - } - - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important - } - - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important - } - - .m-sm-n4 { - margin: -1.5rem !important - } - - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important - } - - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important - } - - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important - } - - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important - } - - .m-sm-n5 { - margin: -3rem !important - } - - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important - } - - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important - } - - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important - } - - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important - } - - .m-sm-auto { - margin: auto !important - } - - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important - } - - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important - } - - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important - } - - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important - } - -} - -@media (min-width:768px) { - .m-md-0 { - margin: 0 !important - } - - .mt-md-0, - .my-md-0 { - margin-top: 0 !important - } - - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important - } - - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important - } - - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important - } - - .m-md-1 { - margin: .25rem !important - } - - .mt-md-1, - .my-md-1 { - margin-top: .25rem !important - } - - .mr-md-1, - .mx-md-1 { - margin-right: .25rem !important - } - - .mb-md-1, - .my-md-1 { - margin-bottom: .25rem !important - } - - .ml-md-1, - .mx-md-1 { - margin-left: .25rem !important - } - - .m-md-2 { - margin: .5rem !important - } - - .mt-md-2, - .my-md-2 { - margin-top: .5rem !important - } - - .mr-md-2, - .mx-md-2 { - margin-right: .5rem !important - } - - .mb-md-2, - .my-md-2 { - margin-bottom: .5rem !important - } - - .ml-md-2, - .mx-md-2 { - margin-left: .5rem !important - } - - .m-md-3 { - margin: 1rem !important - } - - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important - } - - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important - } - - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important - } - - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important - } - - .m-md-4 { - margin: 1.5rem !important - } - - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important - } - - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important - } - - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important - } - - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important - } - - .m-md-5 { - margin: 3rem !important - } - - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important - } - - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important - } - - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important - } - - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important - } - - .p-md-0 { - padding: 0 !important - } - - .pt-md-0, - .py-md-0 { - padding-top: 0 !important - } - - .pr-md-0, - .px-md-0 { - padding-right: 0 !important - } - - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important - } - - .pl-md-0, - .px-md-0 { - padding-left: 0 !important - } - - .p-md-1 { - padding: .25rem !important - } - - .pt-md-1, - .py-md-1 { - padding-top: .25rem !important - } - - .pr-md-1, - .px-md-1 { - padding-right: .25rem !important - } - - .pb-md-1, - .py-md-1 { - padding-bottom: .25rem !important - } - - .pl-md-1, - .px-md-1 { - padding-left: .25rem !important - } - - .p-md-2 { - padding: .5rem !important - } - - .pt-md-2, - .py-md-2 { - padding-top: .5rem !important - } - - .pr-md-2, - .px-md-2 { - padding-right: .5rem !important - } - - .pb-md-2, - .py-md-2 { - padding-bottom: .5rem !important - } - - .pl-md-2, - .px-md-2 { - padding-left: .5rem !important - } - - .p-md-3 { - padding: 1rem !important - } - - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important - } - - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important - } - - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important - } - - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important - } - - .p-md-4 { - padding: 1.5rem !important - } - - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important - } - - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important - } - - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important - } - - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important - } - - .p-md-5 { - padding: 3rem !important - } - - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important - } - - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important - } - - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important - } - - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important - } - - .m-md-n1 { - margin: -.25rem !important - } - - .mt-md-n1, - .my-md-n1 { - margin-top: -.25rem !important - } - - .mr-md-n1, - .mx-md-n1 { - margin-right: -.25rem !important - } - - .mb-md-n1, - .my-md-n1 { - margin-bottom: -.25rem !important - } - - .ml-md-n1, - .mx-md-n1 { - margin-left: -.25rem !important - } - - .m-md-n2 { - margin: -.5rem !important - } - - .mt-md-n2, - .my-md-n2 { - margin-top: -.5rem !important - } - - .mr-md-n2, - .mx-md-n2 { - margin-right: -.5rem !important - } - - .mb-md-n2, - .my-md-n2 { - margin-bottom: -.5rem !important - } - - .ml-md-n2, - .mx-md-n2 { - margin-left: -.5rem !important - } - - .m-md-n3 { - margin: -1rem !important - } - - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important - } - - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important - } - - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important - } - - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important - } - - .m-md-n4 { - margin: -1.5rem !important - } - - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important - } - - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important - } - - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important - } - - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important - } - - .m-md-n5 { - margin: -3rem !important - } - - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important - } - - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important - } - - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important - } - - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important - } - - .m-md-auto { - margin: auto !important - } - - .mt-md-auto, - .my-md-auto { - margin-top: auto !important - } - - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important - } - - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important - } - - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important - } - -} - -@media (min-width:992px) { - .m-lg-0 { - margin: 0 !important - } - - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important - } - - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important - } - - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important - } - - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important - } - - .m-lg-1 { - margin: .25rem !important - } - - .mt-lg-1, - .my-lg-1 { - margin-top: .25rem !important - } - - .mr-lg-1, - .mx-lg-1 { - margin-right: .25rem !important - } - - .mb-lg-1, - .my-lg-1 { - margin-bottom: .25rem !important - } - - .ml-lg-1, - .mx-lg-1 { - margin-left: .25rem !important - } - - .m-lg-2 { - margin: .5rem !important - } - - .mt-lg-2, - .my-lg-2 { - margin-top: .5rem !important - } - - .mr-lg-2, - .mx-lg-2 { - margin-right: .5rem !important - } - - .mb-lg-2, - .my-lg-2 { - margin-bottom: .5rem !important - } - - .ml-lg-2, - .mx-lg-2 { - margin-left: .5rem !important - } - - .m-lg-3 { - margin: 1rem !important - } - - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important - } - - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important - } - - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important - } - - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important - } - - .m-lg-4 { - margin: 1.5rem !important - } - - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important - } - - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important - } - - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important - } - - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important - } - - .m-lg-5 { - margin: 3rem !important - } - - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important - } - - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important - } - - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important - } - - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important - } - - .p-lg-0 { - padding: 0 !important - } - - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important - } - - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important - } - - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important - } - - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important - } - - .p-lg-1 { - padding: .25rem !important - } - - .pt-lg-1, - .py-lg-1 { - padding-top: .25rem !important - } - - .pr-lg-1, - .px-lg-1 { - padding-right: .25rem !important - } - - .pb-lg-1, - .py-lg-1 { - padding-bottom: .25rem !important - } - - .pl-lg-1, - .px-lg-1 { - padding-left: .25rem !important - } - - .p-lg-2 { - padding: .5rem !important - } - - .pt-lg-2, - .py-lg-2 { - padding-top: .5rem !important - } - - .pr-lg-2, - .px-lg-2 { - padding-right: .5rem !important - } - - .pb-lg-2, - .py-lg-2 { - padding-bottom: .5rem !important - } - - .pl-lg-2, - .px-lg-2 { - padding-left: .5rem !important - } - - .p-lg-3 { - padding: 1rem !important - } - - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important - } - - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important - } - - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important - } - - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important - } - - .p-lg-4 { - padding: 1.5rem !important - } - - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important - } - - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important - } - - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important - } - - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important - } - - .p-lg-5 { - padding: 3rem !important - } - - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important - } - - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important - } - - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important - } - - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important - } - - .m-lg-n1 { - margin: -.25rem !important - } - - .mt-lg-n1, - .my-lg-n1 { - margin-top: -.25rem !important - } - - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -.25rem !important - } - - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -.25rem !important - } - - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -.25rem !important - } - - .m-lg-n2 { - margin: -.5rem !important - } - - .mt-lg-n2, - .my-lg-n2 { - margin-top: -.5rem !important - } - - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -.5rem !important - } - - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -.5rem !important - } - - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -.5rem !important - } - - .m-lg-n3 { - margin: -1rem !important - } - - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important - } - - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important - } - - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important - } - - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important - } - - .m-lg-n4 { - margin: -1.5rem !important - } - - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important - } - - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important - } - - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important - } - - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important - } - - .m-lg-n5 { - margin: -3rem !important - } - - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important - } - - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important - } - - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important - } - - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important - } - - .m-lg-auto { - margin: auto !important - } - - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important - } - - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important - } - - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important - } - - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important - } - -} - -@media (min-width:1200px) { - .m-xl-0 { - margin: 0 !important - } - - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important - } - - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important - } - - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important - } - - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important - } - - .m-xl-1 { - margin: .25rem !important - } - - .mt-xl-1, - .my-xl-1 { - margin-top: .25rem !important - } - - .mr-xl-1, - .mx-xl-1 { - margin-right: .25rem !important - } - - .mb-xl-1, - .my-xl-1 { - margin-bottom: .25rem !important - } - - .ml-xl-1, - .mx-xl-1 { - margin-left: .25rem !important - } - - .m-xl-2 { - margin: .5rem !important - } - - .mt-xl-2, - .my-xl-2 { - margin-top: .5rem !important - } - - .mr-xl-2, - .mx-xl-2 { - margin-right: .5rem !important - } - - .mb-xl-2, - .my-xl-2 { - margin-bottom: .5rem !important - } - - .ml-xl-2, - .mx-xl-2 { - margin-left: .5rem !important - } - - .m-xl-3 { - margin: 1rem !important - } - - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important - } - - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important - } - - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important - } - - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important - } - - .m-xl-4 { - margin: 1.5rem !important - } - - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important - } - - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important - } - - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important - } - - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important - } - - .m-xl-5 { - margin: 3rem !important - } - - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important - } - - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important - } - - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important - } - - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important - } - - .p-xl-0 { - padding: 0 !important - } - - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important - } - - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important - } - - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important - } - - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important - } - - .p-xl-1 { - padding: .25rem !important - } - - .pt-xl-1, - .py-xl-1 { - padding-top: .25rem !important - } - - .pr-xl-1, - .px-xl-1 { - padding-right: .25rem !important - } - - .pb-xl-1, - .py-xl-1 { - padding-bottom: .25rem !important - } - - .pl-xl-1, - .px-xl-1 { - padding-left: .25rem !important - } - - .p-xl-2 { - padding: .5rem !important - } - - .pt-xl-2, - .py-xl-2 { - padding-top: .5rem !important - } - - .pr-xl-2, - .px-xl-2 { - padding-right: .5rem !important - } - - .pb-xl-2, - .py-xl-2 { - padding-bottom: .5rem !important - } - - .pl-xl-2, - .px-xl-2 { - padding-left: .5rem !important - } - - .p-xl-3 { - padding: 1rem !important - } - - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important - } - - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important - } - - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important - } - - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important - } - - .p-xl-4 { - padding: 1.5rem !important - } - - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important - } - - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important - } - - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important - } - - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important - } - - .p-xl-5 { - padding: 3rem !important - } - - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important - } - - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important - } - - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important - } - - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important - } - - .m-xl-n1 { - margin: -.25rem !important - } - - .mt-xl-n1, - .my-xl-n1 { - margin-top: -.25rem !important - } - - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -.25rem !important - } - - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -.25rem !important - } - - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -.25rem !important - } - - .m-xl-n2 { - margin: -.5rem !important - } - - .mt-xl-n2, - .my-xl-n2 { - margin-top: -.5rem !important - } - - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -.5rem !important - } - - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -.5rem !important - } - - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -.5rem !important - } - - .m-xl-n3 { - margin: -1rem !important - } - - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important - } - - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important - } - - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important - } - - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important - } - - .m-xl-n4 { - margin: -1.5rem !important - } - - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important - } - - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important - } - - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important - } - - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important - } - - .m-xl-n5 { - margin: -3rem !important - } - - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important - } - - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important - } - - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important - } - - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important - } - - .m-xl-auto { - margin: auto !important - } - - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important - } - - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important - } - - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important - } - - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important - } - -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important -} - -.text-justify { - text-align: justify !important -} - -.text-wrap { - white-space: normal !important -} - -.text-nowrap { - white-space: nowrap !important -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap -} - -.text-left { - text-align: left !important -} - -.text-right { - text-align: right !important -} - -.text-center { - text-align: center !important -} - -@media (min-width:576px) { - .text-sm-left { - text-align: left !important - } - - .text-sm-right { - text-align: right !important - } - - .text-sm-center { - text-align: center !important - } - -} - -@media (min-width:768px) { - .text-md-left { - text-align: left !important - } - - .text-md-right { - text-align: right !important - } - - .text-md-center { - text-align: center !important - } - -} - -@media (min-width:992px) { - .text-lg-left { - text-align: left !important - } - - .text-lg-right { - text-align: right !important - } - - .text-lg-center { - text-align: center !important - } - -} - -@media (min-width:1200px) { - .text-xl-left { - text-align: left !important - } - - .text-xl-right { - text-align: right !important - } - - .text-xl-center { - text-align: center !important - } - -} - -.text-lowercase { - text-transform: lowercase !important -} - -.text-uppercase { - text-transform: uppercase !important -} - -.text-capitalize { - text-transform: capitalize !important -} - -.font-weight-light { - font-weight: 300 !important -} - -.font-weight-lighter { - font-weight: lighter !important -} - -.font-weight-normal { - font-weight: 400 !important -} - -.font-weight-bold { - font-weight: 700 !important -} - -.font-weight-bolder { - font-weight: bolder !important -} - -.font-italic { - font-style: italic !important -} - -.text-white { - color: #fff !important -} - -.text-primary { - color: #047006 !important -} - -a.text-primary:focus, -a.text-primary:hover { - color: #012602 !important -} - -.text-secondary { - color: grey !important -} - -a.text-secondary:focus, -a.text-secondary:hover { - color: #5a5a5a !important -} - -.text-success { - color: #047006 !important -} - -a.text-success:focus, -a.text-success:hover { - color: #009461 !important -} - -.text-info { - color: #6c61f6 !important -} - -a.text-info:focus, -a.text-info:hover { - color: #2919f2 !important -} - -.text-warning { - color: #f0825f !important -} - -a.text-warning:focus, -a.text-warning:hover { - color: #e94b19 !important -} - -.text-danger { - color: #ff5f66 !important -} - -a.text-danger:focus, -a.text-danger:hover { - color: #ff131d !important -} - -.text-light { - color: #dfdfdf !important -} - -a.text-light:focus, -a.text-light:hover { - color: #b9b9b9 !important -} - -.text-dark { - color: #74767b !important -} - -a.text-dark:focus, -a.text-dark:hover { - color: #4f5054 !important -} - -.text-white { - color: #fff !important -} - -a.text-white:focus, -a.text-white:hover { - color: #d9d9d9 !important -} - -.text-body { - color: #212529 !important -} - -.text-muted { - color: #adb5bd !important -} - -.text-black-50 { - color: rgba(0, 0, 0, .5) !important -} - -.text-white-50 { - color: rgba(255, 255, 255, .5) !important -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0 -} - -.text-decoration-none { - text-decoration: none !important -} - -.text-break { - word-break: break-word !important; - overflow-wrap: break-word !important -} - -.text-reset { - color: inherit !important -} - -.visible { - visibility: visible !important -} - -.invisible { - visibility: hidden !important -} - -@media print { - *, - ::after, - ::before { - text-shadow: none !important; - box-shadow: none !important - } - - a:not(.btn) { - text-decoration: underline - } - - abbr[title]::after { - content: '3'attr(title) ")" - } - - pre { - white-space: pre-wrap !important - } - - blockquote, - pre { - border: 1px solid #adb5bd; - page-break-inside: avoid - } - - thead { - display: table-header-group - } - - img, - tr { - page-break-inside: avoid - } - - h2, - h3, - p { - orphans: 3; - widows: 3 - } - - h2, - h3 { - page-break-after: avoid - } - - @page { - size: a3 - } - - body { - min-width: 992px !important - } - - .container { - min-width: 992px !important - } - - .navbar { - display: none - } - - .badge { - border: 1px solid #000 - } - - .table { - border-collapse: collapse !important - } - - .table td, - .table th { - background-color: #fff !important - } - - .table-bordered td, - .table-bordered th { - border: 1px solid #dee2e6 !important - } - - .table-dark { - color: inherit - } - - .table-dark tbody+tbody, - .table-dark td, - .table-dark th, - .table-dark thead th { - border-color: #f2f4f9 - } - - .table .thead-dark th { - color: inherit; - border-color: #f2f4f9 - } - -} - -.dev-info { - position: fixed; - color: grey; - font-size: smaller; - left: 8px; - z-index: 120 -} - -.versionstring { - top: 70px; - right: 8px; - left: auto -} - -.grd-time-used { - bottom: 0 -} - -.t-header { - display: -webkit-box; - display: flex; - height: 70px; - background: #f9fafb; - z-index: 100 -} - -@media (max-width:991.98px) { - .t-header { - padding-left: 5px; - padding-right: 5px - } - -} - -.t-header .t-header-brand-wrapper { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - height: 70px; - width: 17rem; - min-width: 17rem; - max-width: 17rem; - background: #fff; - z-index: 100; - padding-left: 18px -} - -.t-header .t-header-brand-wrapper a { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - color: #dfdfdf; - font-family: Roboto, sans-serif; - font-weight: 500; - font-size: 1.25rem -} - -.t-header .t-header-brand-wrapper a .logo { - max-width: 100%; - width: 110px -} - -.t-header .t-header-brand-wrapper a .logo-mini { - display: none; - max-width: 100%; - width: 35px -} - -.t-header .t-header-brand-wrapper a p { - color: inherit; - font-size: inherit; - font-weight: inherit; - margin-bottom: 0 -} - -@media (max-width:991.98px) { - .t-header .t-header-brand-wrapper { - padding-left: 0; - -webkit-box-pack: center; - justify-content: center - } - - .t-header .t-header-brand-wrapper a .logo-mini { - width: 25px - } - -} - -.t-header .t-header-content-wrapper { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - width: 100%; - max-width: 100%; - padding: 0 2.5rem -} - -@media (max-width:991.98px) { - .t-header .t-header-content-wrapper { - padding: 0 1rem - } - -} - -.t-header .t-header-content-wrapper .t-header-search-box { - display: -webkit-box; - display: flex; - width: 40%; - height: 45px; - border: none; - background: #edf0f3; - border-radius: 4px; - -webkit-transition: .3s ease-in-out; - transition: .3s ease-in-out; - -webkit-transition-property: background; - transition-property: background -} - -@media (max-width:580px) { - .t-header .t-header-content-wrapper .t-header-search-box { - display: none - } - -} - -.t-header .t-header-content-wrapper .t-header-search-box .input-group-prepend .input-group-text { - border: none; - background: 0 0; - font-size: 1.5rem; - padding-left: 15px; - line-height: 23px -} - -.t-header .t-header-content-wrapper .t-header-search-box .form-control { - height: inherit; - border: none; - background: 0 0; - font-size: .875rem; - font-family: Roboto, sans-serif; - font-weight: 500; - padding-left: 0 -} - -.t-header .t-header-content-wrapper .t-header-search-box .form-control.placeholder { - font-size: inherit; - font-family: inherit; - font-weight: inherit -} - -.t-header .t-header-content-wrapper .t-header-search-box .form-control:-moz-placeholder { - font-size: inherit; - font-family: inherit; - font-weight: inherit -} - -.t-header .t-header-content-wrapper .t-header-search-box .form-control::-moz-placeholder { - font-size: inherit; - font-family: inherit; - font-weight: inherit -} - -.t-header .t-header-content-wrapper .t-header-search-box .form-control:-ms-input-placeholder { - font-size: inherit; - font-family: inherit; - font-weight: inherit -} - -.t-header .t-header-content-wrapper .t-header-search-box .form-control::-webkit-input-placeholder { - font-size: inherit; - font-family: inherit; - font-weight: inherit -} - -.t-header .t-header-content-wrapper .t-header-search-box:hover { - background: #e4e8ed -} - -.t-header .t-header-content-wrapper .t-header-content { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - width: 100%; - max-width: 100% -} - -.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link { - position: relative; - font-family: Roboto, sans-serif -} - -.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link i { - color: #525c5d -} - -.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link .notification-indicator { - position: absolute; - top: 12px; - right: 12px -} - -.t-header .t-header-content-wrapper .t-header-content .nav .nav-item:last-child .nav-link { - padding-right: 0 -} - -.t-header .t-header-toggler { - background: 0 0; - border: none; - margin-left: auto -} - -.t-header .t-header-toggler svg.logo { - width: 50px; - height: 50px; - cursor: pointer; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0) -} - -.t-header .t-header-toggler svg.logo path { - fill: none; - -webkit-transition: stroke-dashoffset .35s cubic-bezier(.25, -.25, .75, 1.25), stroke-dasharray .35s cubic-bezier(.25, -.25, .75, 1.25); - transition: stroke-dashoffset .35s cubic-bezier(.25, -.25, .75, 1.25), stroke-dasharray .35s cubic-bezier(.25, -.25, .75, 1.25); - stroke-width: 8px; - stroke-linecap: round; - stroke: #adb5bd; - stroke-dashoffset: -20px -} - -.t-header .t-header-toggler svg.logo .bottom, -.t-header .t-header-toggler svg.logo .middle, -.t-header .t-header-toggler svg.logo .top { - stroke-dasharray: 60px 300px -} - -.t-header .t-header-toggler.arrow path.bottom, -.t-header .t-header-toggler.arrow path.top { - stroke-dasharray: 25px 300px; - stroke-dashoffset: -230px -} - -.t-header .t-header-toggler i { - font-size: 1.375rem -} - -.t-header .t-header-toggler.t-header-mobile-toggler { - margin-left: 0; - margin-right: 15px -} - -.t-header.fixed-top { - position: fixed -} - -.header-fixed .t-header { - position: fixed; - top: 0; - right: 0; - left: 0; - width: 100%; - z-index: 100 -} - -.header-fixed .sidebar { - padding-top: 70px -} - -.header-fixed .sidebar .t-header-brand-wrapper { - position: fixed; - left: 0; - top: 0; - z-index: 100; - width: 17rem; - box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .05) -} - -.header-fixed .sidebar .navigation-menu { - z-index: 1 -} - -.sidebar { - position: relative; - display: block; - height: 100%; - min-height: 100vh; - width: 17rem; - min-width: 17rem; - max-width: 17rem; - background: #fff -} - -.sidebar .sidebar-header { - border-bottom: 1px solid #2c3744 -} - -.sidebar .navigation-menu { - padding-left: 0; - padding-bottom: 80px; - margin-bottom: 0; - margin-top: 18px -} - -.sidebar .navigation-menu li { - display: block; - margin: 0; - -webkit-transition-duration: .25s; - transition-duration: .25s; - -webkit-transition-timing-function: cubic-bezier(.26, .66, .45, .78); - transition-timing-function: cubic-bezier(.26, .66, .45, .78); - -webkit-transition-property: background; - transition-property: background -} - -.sidebar .navigation-menu li.nav-category-divider { - position: -webkit-sticky; - position: sticky; - top: 64px; - display: block; - background: #fff; - margin: 15px 0 0 0; - padding: 20px 30px 10px 30px; - font-size: 10px; - color: #047006; - z-index: 1; - font-family: Roboto, sans-serif; - font-weight: 500 -} - -.sidebar .navigation-menu li.nav-category-divider:first-child { - margin-top: 0 -} - -.sidebar .navigation-menu li a { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-orient: horizontal; - -webkit-box-direction: reverse; - flex-direction: row-reverse; - -webkit-box-pack: end; - justify-content: flex-end; - padding: 12px 30px 12px 30px; - font-size: 13px; - line-height: 1; - color: #525c5d; - letter-spacing: .03rem; - font-weight: 500; - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden -} - -.sidebar .navigation-menu li a .link-icon { - margin-right: 15px; - line-height: 1; - color: #525c5d; - font-size: 1.1875rem -} - -.sidebar .navigation-menu li:last-child a { - border-bottom: none -} - -.sidebar .navigation-menu li .navigation-submenu { - background: #fafafa; - padding: 0 0 10px 30px -} - -.sidebar .navigation-menu li .navigation-submenu.collapsing { - -webkit-transition: .2s ease-in; - transition: .2s ease-in -} - -.sidebar .navigation-menu li .navigation-submenu li { - display: inherit -} - -.sidebar .navigation-menu li .navigation-submenu li a { - display: block; - padding: calc(9px) 30px calc(9px) calc(30px + 2px); - opacity: .8; - letter-spacing: .03rem; - font-weight: 400; - font-size: calc(13px - 1px); - -webkit-transition: .3s ease-in-out; - transition: .3s ease-in-out; - -webkit-transition-property: color; - transition-property: color -} - -.sidebar .navigation-menu li .navigation-submenu li a[data-toggle=collapse] { - position: relative -} - -.sidebar .navigation-menu li .navigation-submenu li a[data-toggle=collapse]:after { - content: '.5'; - height: 7px; - width: 7px; - border-radius: 25px; - position: absolute; - right: calc(30px + 4px); - top: 14px -} - -.sidebar .navigation-menu li .navigation-submenu li a.active { - color: #047006 -} - -.sidebar .navigation-menu li .navigation-submenu li a:hover { - color: #047006 -} - -.sidebar .navigation-menu li .navigation-submenu li:first-child a { - padding-top: 10px -} - -.sidebar .navigation-menu li .navigation-submenu li:first-child a:after { - top: 15px -} - -.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+1) a:after { - background: #047006 -} - -.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+2) a:after { - background: #047006 -} - -.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+3) a:after { - background: #ff5f66 -} - -.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+4) a:after { - background: #f0825f -} - -.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+5) a:after { - background: #6c61f6 -} - -.sidebar .navigation-menu li .navigation-submenu li .navigation-submenu { - padding-left: 0 -} - -.sidebar .navigation-menu li .navigation-submenu li .navigation-submenu li a { - opacity: .5 -} - -.sidebar .navigation-menu li.active a .link-title { - color: #047006 -} - -.sidebar .navigation-menu li.active a .link-icon { - color: #047006 -} - -.sidebar .navigation-menu>li:not(.nav-category-divider):hover { - background: #fafafa -} - -.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse] { - position: relative -} - -.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse]:after { - content: '3'; - font-family: "Material Design Icons"; - font-size: 15px; - text-rendering: auto; - line-height: inherit; - font-weight: bolder; - position: absolute; - top: 13px; - right: 30px; - display: block; - -webkit-transition: .3s; - transition: .3s; - -webkit-transition-property: -webkit-transform; - transition-property: -webkit-transform; - transition-property: transform; - transition-property: transform, -webkit-transform; - color: #839092 -} - -.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse][aria-expanded=true] { - background: #fafafa -} - -.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse][aria-expanded=true]:after { - -webkit-transform: rotate(90deg); - transform: rotate(90deg) -} - -.sidebar .sidebar_footer { - display: block; - position: fixed; - bottom: 0; - left: 0; - margin-top: auto; - width: inherit; - z-index: 2; - background: #fff -} - -.sidebar .sidebar_footer .admin-access-level { - position: absolute; - bottom: 0; - display: -webkit-box; - display: flex; - -webkit-box-pack: start; - justify-content: flex-start; - -webkit-box-align: center; - align-items: center; - z-index: 9999; - height: auto; - width: 100%; - background: #fff; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - padding: 10px 20px; - box-shadow: -7px -2px 25px -5px rgba(0, 0, 0, .12) -} - -.sidebar .sidebar_footer .admin-access-level .user-type-wrapper { - padding: 0 0 0 10px -} - -.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .user_name { - color: #525c5d; - margin-bottom: 8px; - line-height: 1; - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - max-width: 95px; - font-family: Roboto, sans-serif; - font-weight: 500; - letter-spacing: .03rem -} - -.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .user_access_level { - color: #74767b; - line-height: 1 -} - -.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .status-indicator { - margin-right: 5px -} - -.sidebar .sidebar_footer .admin-access-level .arrow { - color: #525c5d; - margin-left: auto; - font-size: 20px; - line-height: 1; - -webkit-transition: .3s; - transition: .3s -} - -.sidebar .sidebar_footer .user-account { - display: block; - width: 100%; - border-radius: 0; - border: none; - margin-bottom: -100vh; - opacity: 0; - -webkit-transition: .3s; - transition: .3s; - border-right: 1px solid #f2f4f9; - box-shadow: -7px -2px 25px -5px rgba(0, 0, 0, .12) -} - -.sidebar .sidebar_footer .user-account:before { - display: none -} - -.sidebar .sidebar_footer .user-account .user-profile-item-tittle { - background: 0 0; - padding: 20px 18px 10px 18px; - z-index: 1; - color: #adb5bd; - font-family: Roboto, sans-serif; - font-weight: 500 -} - -.sidebar .sidebar_footer .user-account .user-profile-itemcategory { - background: 0 0; - margin-bottom: 10px; - border-bottom: 1px solid #f2f4f9; - padding-bottom: 10px; - font-family: Roboto, sans-serif; - font-weight: 500; - letter-spacing: .03rem -} - -.sidebar .sidebar_footer .user-account .user-profile-item { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - background: inherit; - padding: 10px 18px; - -webkit-transition: .3s; - transition: .3s; - z-index: 1; - background: 0 0; - color: #525c5d; - font-size: 13px; - font-family: Roboto, sans-serif; - font-weight: 500; - letter-spacing: .03rem -} - -.sidebar .sidebar_footer .user-account .user-profile-item:hover { - background: #f5f5f5 -} - -.sidebar .sidebar_footer .user-account .user-profile-item i { - margin-right: 10px; - font-size: 18px; - line-height: 1; - color: inherit -} - -.sidebar .sidebar_footer .user-account .user-profile-item img { - margin-right: 10px -} - -.sidebar .sidebar_footer .user-account .btn-logout { - width: 91%; - max-width: 91%; - margin: 15px 10px 30px 10px; - border-radius: 4px -} - -.sidebar .sidebar_footer.opened { - background: #fff -} - -.sidebar .sidebar_footer.opened .admin-access-level { - background: #fff -} - -.sidebar .sidebar_footer.opened .admin-access-level .arrow { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg) -} - -.sidebar .sidebar_footer.opened .user-account { - margin-bottom: 60px; - opacity: 1; - background: #fff -} - -footer { - position: absolute; - bottom: 0; - left: 0; - right: 0; - padding: 2rem 2.5rem; - max-width: 1140px; - margin-left: auto; - margin-right: auto -} - -@media (max-width:991.98px) { - footer { - padding: 20px 0 30px 0 - } - -} - -footer ul { - margin-left: 0; - padding-left: 0 -} - -footer ul li { - display: inline-block; - padding: 0 10px 0 0; - line-height: 1 -} - -footer ul li:not(:last-child) { - margin-right: 10px; - border-right: 1px solid #f2f4f9 -} - -footer ul li a { - font-family: Roboto, sans-serif; - font-weight: 400; - letter-spacing: .03rem; - color: #565656 -} - -pre.cake-error { - z-index: 220; - position: absolute; - background-color: #fff -} - -.alert-notification-wrapper { - position: fixed; - left: 17rem; - right: 0; - z-index: 999 -} - -@media (max-width:991.98px) { - .alert-notification-wrapper { - left: 0 - } - -} - -.alert-notification-wrapper.top { - top: 70px -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter { - border: 2px solid #55acee; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter i { - color: #55acee -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link { - background: 0 0; - color: #55acee -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link:hover { - color: #2795e9 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook { - border: 2px solid #0084ff; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook i { - color: #0084ff -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link { - background: 0 0; - color: #0084ff -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link:hover { - color: #006acc -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google { - border: 2px solid #dd4b39; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google i { - color: #dd4b39 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link { - background: 0 0; - color: #dd4b39 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link:hover { - color: #c23321 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin { - border: 2px solid #0077b5; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin i { - color: #0077b5 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link { - background: 0 0; - color: #0077b5 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link:hover { - color: #005582 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest { - border: 2px solid #bd081c; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest i { - color: #bd081c -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link { - background: 0 0; - color: #bd081c -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link:hover { - color: #8c0615 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube { - border: 2px solid #cd201f; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube i { - color: #cd201f -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link { - background: 0 0; - color: #cd201f -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link:hover { - color: #a11918 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github { - border: 2px solid #333; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github i { - color: #333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link { - background: 0 0; - color: #333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link:hover { - color: #1a1a1a -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance { - border: 2px solid #0454f6; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance i { - color: #0454f6 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link { - background: 0 0; - color: #0454f6 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link:hover { - color: #0343c4 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble { - border: 2px solid #ea4c89; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble i { - color: #ea4c89 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link { - background: 0 0; - color: #ea4c89 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link:hover { - color: #e51e6b -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit { - border: 2px solid #ed4333; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit i { - color: #ed4333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link { - background: 0 0; - color: #ed4333 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link:hover { - color: #da2413 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram { - border: 2px solid #ff759b; - color: #101010 -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram i { - color: #ff759b -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link { - background: 0 0; - color: #ff759b -} - -.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link:hover { - color: #ff4276 -} - -.btn-inverse-primary { - background: rgba(4, 112, 6, .15); - color: #047006 -} - -.btn-inverse-primary i { - color: inherit -} - -.btn-inverse-primary:hover { - background: rgba(4, 112, 6, .8); - color: #fff -} - -.btn-inverse-secondary { - background: rgba(128, 128, 128, .15); - color: grey -} - -.btn-inverse-secondary i { - color: inherit -} - -.btn-inverse-secondary:hover { - background: rgba(128, 128, 128, .8); - color: #fff -} - -.btn-inverse-success { - background: rgba(0, 224, 147, .15); - color: #047006 -} - -.btn-inverse-success i { - color: inherit -} - -.btn-inverse-success:hover { - background: rgba(0, 224, 147, .8); - color: #fff -} - -.btn-inverse-info { - background: rgba(108, 97, 246, .15); - color: #6c61f6 -} - -.btn-inverse-info i { - color: inherit -} - -.btn-inverse-info:hover { - background: rgba(108, 97, 246, .8); - color: #fff -} - -.btn-inverse-warning { - background: rgba(240, 130, 95, .15); - color: #f0825f -} - -.btn-inverse-warning i { - color: inherit -} - -.btn-inverse-warning:hover { - background: rgba(240, 130, 95, .8); - color: #fff -} - -.btn-inverse-danger { - background: rgba(255, 95, 102, .15); - color: #ff5f66 -} - -.btn-inverse-danger i { - color: inherit -} - -.btn-inverse-danger:hover { - background: rgba(255, 95, 102, .8); - color: #fff -} - -.btn-inverse-light { - background: rgba(223, 223, 223, .15); - color: #dfdfdf -} - -.btn-inverse-light i { - color: inherit -} - -.btn-inverse-light:hover { - background: rgba(223, 223, 223, .8); - color: #fff -} - -.btn-inverse-dark { - background: rgba(116, 118, 123, .15); - color: #74767b -} - -.btn-inverse-dark i { - color: inherit -} - -.btn-inverse-dark:hover { - background: rgba(116, 118, 123, .8); - color: #fff -} - -.btn-inverse-white { - background: rgba(255, 255, 255, .15); - color: #fff -} - -.btn-inverse-white i { - color: inherit -} - -.btn-inverse-white:hover { - background: rgba(255, 255, 255, .8); - color: #fff -} - -.btn:not(.social-btn-outlined).btn-twitter { - background: #55acee; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-twitter:hover { - background: #2795e9 -} - -.btn:not(.social-btn-outlined).btn-twitter.btn-link { - background: 0 0; - color: #55acee -} - -.btn:not(.social-btn-outlined).btn-twitter.btn-link:hover { - color: #2795e9 -} - -.btn:not(.social-btn-outlined).btn-facebook { - background: #0084ff; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-facebook:hover { - background: #006acc -} - -.btn:not(.social-btn-outlined).btn-facebook.btn-link { - background: 0 0; - color: #0084ff -} - -.btn:not(.social-btn-outlined).btn-facebook.btn-link:hover { - color: #006acc -} - -.btn:not(.social-btn-outlined).btn-google { - background: #dd4b39; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-google:hover { - background: #c23321 -} - -.btn:not(.social-btn-outlined).btn-google.btn-link { - background: 0 0; - color: #dd4b39 -} - -.btn:not(.social-btn-outlined).btn-google.btn-link:hover { - color: #c23321 -} - -.btn:not(.social-btn-outlined).btn-linkedin { - background: #0077b5; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-linkedin:hover { - background: #005582 -} - -.btn:not(.social-btn-outlined).btn-linkedin.btn-link { - background: 0 0; - color: #0077b5 -} - -.btn:not(.social-btn-outlined).btn-linkedin.btn-link:hover { - color: #005582 -} - -.btn:not(.social-btn-outlined).btn-pinterest { - background: #bd081c; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-pinterest:hover { - background: #8c0615 -} - -.btn:not(.social-btn-outlined).btn-pinterest.btn-link { - background: 0 0; - color: #bd081c -} - -.btn:not(.social-btn-outlined).btn-pinterest.btn-link:hover { - color: #8c0615 -} - -.btn:not(.social-btn-outlined).btn-youtube { - background: #cd201f; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-youtube:hover { - background: #a11918 -} - -.btn:not(.social-btn-outlined).btn-youtube.btn-link { - background: 0 0; - color: #cd201f -} - -.btn:not(.social-btn-outlined).btn-youtube.btn-link:hover { - color: #a11918 -} - -.btn:not(.social-btn-outlined).btn-github { - background: #333; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-github:hover { - background: #1a1a1a -} - -.btn:not(.social-btn-outlined).btn-github.btn-link { - background: 0 0; - color: #333 -} - -.btn:not(.social-btn-outlined).btn-github.btn-link:hover { - color: #1a1a1a -} - -.btn:not(.social-btn-outlined).btn-behance { - background: #0454f6; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-behance:hover { - background: #0343c4 -} - -.btn:not(.social-btn-outlined).btn-behance.btn-link { - background: 0 0; - color: #0454f6 -} - -.btn:not(.social-btn-outlined).btn-behance.btn-link:hover { - color: #0343c4 -} - -.btn:not(.social-btn-outlined).btn-dribbble { - background: #ea4c89; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-dribbble:hover { - background: #e51e6b -} - -.btn:not(.social-btn-outlined).btn-dribbble.btn-link { - background: 0 0; - color: #ea4c89 -} - -.btn:not(.social-btn-outlined).btn-dribbble.btn-link:hover { - color: #e51e6b -} - -.btn:not(.social-btn-outlined).btn-reddit { - background: #ed4333; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-reddit:hover { - background: #da2413 -} - -.btn:not(.social-btn-outlined).btn-reddit.btn-link { - background: 0 0; - color: #ed4333 -} - -.btn:not(.social-btn-outlined).btn-reddit.btn-link:hover { - color: #da2413 -} - -.btn:not(.social-btn-outlined).btn-instagram { - background: #ff759b; - border: none; - color: #fff -} - -.btn:not(.social-btn-outlined).btn-instagram:hover { - background: #ff4276 -} - -.btn:not(.social-btn-outlined).btn-instagram.btn-link { - background: 0 0; - color: #ff759b -} - -.btn:not(.social-btn-outlined).btn-instagram.btn-link:hover { - color: #ff4276 -} - -.btn-group label.btn.btn-primary:not(:disabled):not(.disabled).active { - background: #000e01 -} - -.btn-group label.btn.btn-secondary:not(:disabled):not(.disabled).active { - background: #4d4d4d -} - -.btn-group label.btn.btn-success:not(:disabled):not(.disabled).active { - background: #007a50 -} - -.btn-group label.btn.btn-info:not(:disabled):not(.disabled).active { - background: #1d0de4 -} - -.btn-group label.btn.btn-warning:not(:disabled):not(.disabled).active { - background: #d54314 -} - -.btn-group label.btn.btn-danger:not(:disabled):not(.disabled).active { - background: #f8000b -} - -.btn-group label.btn.btn-light:not(:disabled):not(.disabled).active { - background: #acacac -} - -.btn-group label.btn.btn-dark:not(:disabled):not(.disabled).active { - background: #424447 -} - -.btn-group label.btn.btn-white:not(:disabled):not(.disabled).active { - background: #ccc -} - -.btn-outline-primary { - border: 2px solid #047006 -} - -.btn-outline-secondary { - border: 2px solid grey -} - -.btn-outline-success { - border: 2px solid #047006 -} - -.btn-outline-info { - border: 2px solid #6c61f6 -} - -.btn-outline-warning { - border: 2px solid #f0825f -} - -.btn-outline-danger { - border: 2px solid #ff5f66 -} - -.btn-outline-light { - border: 2px solid #dfdfdf -} - -.btn-outline-dark { - border: 2px solid #74767b -} - -.btn-outline-white { - border: 2px solid #fff -} - -.btn-group label.btn input { - display: none -} - -.btn { - display: -webkit-inline-box; - display: inline-flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - -webkit-transition: .3s ease; - transition: .3s ease; - -webkit-transition-property: background, color; - transition-property: background, color; - font-size: .875rem; - font-family: Roboto, sans-serif; - font-weight: 600; - letter-spacing: .03rem -} - -.btn:not([class*=btn-inverse]):not(.component-flat) { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) -} - -.btn i { - font-size: 1.25rem -} - -.btn-group-lg>.btn, -.btn.btn-lg { - height: 55px; - max-height: 55px; - padding: 15px 30px; - font-size: 1.125rem -} - -.btn-group-sm>.btn, -.btn.btn-sm { - height: 35px; - max-height: 35px; - padding: 4px 15px; - font-size: .875rem -} - -.btn.btn-xs { - height: 25px; - max-height: 25px; - padding: 0 10px; - line-height: 1; - font-size: .75rem -} - -.btn.btn-xs.has-icon i, -.btn.btn-xs.has-icon span { - font-size: .8125rem; - margin-right: 5px -} - -.btn { - height: 40px; - max-height: 40px; - padding: 5px 20px -} - -.btn.active { - box-shadow: none -} - -.btn.social-icon-btn { - height: 40px; - width: 40px -} - -.btn.social-btn i { - margin-right: 10px -} - -.btn.social-btn-outlined i { - margin-right: 10px -} - -.btn.has-icon i, -.btn.has-icon span { - font-size: 1.25rem; - margin-right: 10px; - line-height: 1 -} - -.btn.btn-outline-secondary { - color: #1a1a1a; - border-color: #676767 -} - -.btn.btn-info, -.btn.btn-warning { - color: #fff -} - -.btn.btn-light { - background: #fff; - color: #000 -} - -.btn.dropdown-dotted-list { - background: #fff -} - -.btn.dropdown-toggle-split { - padding: 0 8px -} - -.btn.action-btn { - display: -webkit-inline-box; - display: inline-flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - padding: 0; - height: 40px; - width: 40px -} - -.btn.action-btn i { - font-size: 1.25rem; - width: 26px; - display: -webkit-box; - display: flex; - -webkit-box-pack: center; - justify-content: center; - -webkit-box-align: center; - align-items: center; - line-height: 23px; - vertical-align: middle; - font-size: 1.25rem -} - -.btn.action-btn i:before { - width: inherit; - height: inherit; - line-height: inherit; - font-size: inherit -} - -.btn.action-btn.btn-xs { - height: 30px; - width: 30px -} - -.btn-group-sm>.btn.action-btn, -.btn.action-btn.btn-sm { - height: 35px; - width: 35px -} - -.btn-group-lg>.btn.action-btn, -.btn.action-btn.btn-lg { - height: 50px; - width: 50px -} - -.btn-group-lg>.btn.action-btn i, -.btn.action-btn.btn-lg i { - font-size: 1.875rem; - line-height: 24px -} - -.btn.action-btn.btn-refresh.clicked i { - color: #047006; - -webkit-animation: rotate360 .8s linear infinite; - animation: rotate360 .8s linear infinite -} - -.btn.action-btn.btn-like.clicked i { - color: #ff5f66; - -webkit-animation: bounceIn .8s linear 1; - animation: bounceIn .8s linear 1 -} - -.btn.action-btn.btn-like.clicked:hover i { - color: #fff -} - -.btn.btn-rounded { - border-radius: 50px -} - -.flag-germany { - width: 40px; - height: 28px; - background: red; - border-top: 9px solid #000; - border-bottom: 9px solid #fc0; - display: block -} - -.flag-england { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); - background-size: cover; - width: 40px; - height: 28px; - display: block -} - -.language-active { - background-color: #f9fafb; - padding: 2px -} - -.language-inactive { - padding: 2px; - background-color: transparent -} - -.is-invalid .form-control { - background-color: rgba(240, 130, 95, .2); - border: none -} - -.is-invalid .invalid-feedback { - display: block -} - -.is-valid .form-control { - background-color: rgba(4, 112, 6, .2); - border: none -} - -.form-control { - padding-left: 20px; - padding-right: 20px; - color: rgba(16, 16, 16, .8) -} - -.form-control.placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control:-moz-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control::-moz-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control:-ms-input-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control::-webkit-input-placeholder { - font-weight: inherit; - color: inherit; - font-size: inherit -} - -.form-control.is-invalid { - background-color: rgba(240, 130, 95, .2); - border: none -} - -.form-control.is-valid { - background-color: rgba(4, 112, 6, .2); - border: none -} - -.input-group-text { - background-color: #f6f7f9; - color: #101010; - border-color: #f2f4f9; - padding: 0 10px; - font-size: 17px -} - -.is-valid .input-group-text { - background-color: rgba(4, 112, 6, .2); - color: #047006 -} - -.is-invalid .input-group-text { - background-color: rgba(240, 130, 95, .2); - color: #f0825f -} - -.form-group { - margin-bottom: 20px -} - -.form-group.input-rounded .form-control { - border-radius: 25px -} - -.custom-file .custom-file-label { - padding: 8px .75rem; - height: 41px -} - -.custom-file .custom-file-label:after { - padding: 1.45rem .8rem; - line-height: 0 -} - -.custom-select, -.custom-select[multiple] { - background: #f6f7f9; - border-color: #f0f2f5; - color: rgba(16, 16, 16, .8) -} - -.custom-select option, -.custom-select[multiple] option { - background: #f6f7f9; - color: rgba(16, 16, 16, .8); - display: block; - border-bottom: 1px solid #f2f4f9; - padding: 5px 10px -} - -.custom-select option:checked, -.custom-select[multiple] option:checked { - background: #f6f7f9 -} - -.custom-select option[selected], -.custom-select[multiple] option[selected] { - background: #f6f7f9; - display: block -} - -.custom-select[multiple] { - padding: 0; - border-radius: 2px -} - -.custom-control-input:focus~.custom-control-label::before { - box-shadow: none -} - -.custom-switch .custom-control-label::after { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); - background: #047006 -} - -.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link { - color: #047006 -} - -.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link.active { - background: #047006; - color: #fff -} - -.tab-container.tab-bg-primary .tab-content { - background: #047006; - color: #fff -} - -.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link { - color: grey -} - -.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link.active { - background: grey; - color: #fff -} - -.tab-container.tab-bg-secondary .tab-content { - background: grey; - color: #fff -} - -.tab-container.tab-bg-success .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link { - color: #047006 -} - -.tab-container.tab-bg-success .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-success .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link.active { - background: #047006; - color: #fff -} - -.tab-container.tab-bg-success .tab-content { - background: #047006; - color: #fff -} - -.tab-container.tab-bg-info .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link { - color: #6c61f6 -} - -.tab-container.tab-bg-info .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-info .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link.active { - background: #6c61f6; - color: #fff -} - -.tab-container.tab-bg-info .tab-content { - background: #6c61f6; - color: #fff -} - -.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link { - color: #f0825f -} - -.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link.active { - background: #f0825f; - color: #fff -} - -.tab-container.tab-bg-warning .tab-content { - background: #f0825f; - color: #fff -} - -.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link { - color: #ff5f66 -} - -.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link.active { - background: #ff5f66; - color: #fff -} - -.tab-container.tab-bg-danger .tab-content { - background: #ff5f66; - color: #fff -} - -.tab-container.tab-bg-light .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link { - color: #dfdfdf -} - -.tab-container.tab-bg-light .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-light .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link.active { - background: #dfdfdf; - color: #fff -} - -.tab-container.tab-bg-light .tab-content { - background: #dfdfdf; - color: #fff -} - -.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link { - color: #74767b -} - -.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link.active { - background: #74767b; - color: #fff -} - -.tab-container.tab-bg-dark .tab-content { - background: #74767b; - color: #fff -} - -.tab-container.tab-bg-white .nav-pills .nav-item .nav-link, -.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link { - color: #fff -} - -.tab-container.tab-bg-white .nav-pills .nav-item .nav-link i, -.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link i { - color: inherit -} - -.tab-container.tab-bg-white .nav-pills .nav-item .nav-link.active, -.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link.active { - background: #fff; - color: #fff -} - -.tab-container.tab-bg-white .tab-content { - background: #fff; - color: #fff -} - -.nav-tabs { - border-bottom: 1px solid #f2f4f9 -} - -.tab-container .nav-pills, -.tab-container .nav-tabs { - border-bottom: none -} - -.tab-container .nav-pills .nav-item .nav-link, -.tab-container .nav-tabs .nav-item .nav-link { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: start; - justify-content: start; - font-family: Roboto, sans-serif; - font-weight: 500; - letter-spacing: 1; - padding: 7px 13px; - border: none; - -webkit-transition-duration: .3s; - transition-duration: .3s; - -webkit-transition-property: background, color; - transition-property: background, color -} - -.tab-container .nav-pills .nav-item .nav-link i, -.tab-container .nav-tabs .nav-item .nav-link i { - font-size: 20px; - line-height: 1 -} - -.tab-container .nav-pills .nav-item .nav-link .tab-tittle, -.tab-container .nav-tabs .nav-item .nav-link .tab-tittle { - display: inline-block -} - -.tab-container .nav-pills .nav-item .nav-link .tab-tittle.prepend, -.tab-container .nav-tabs .nav-item .nav-link .tab-tittle.prepend { - margin-left: 10px -} - -.tab-container .nav-pills .nav-item .nav-link .tab-tittle.append, -.tab-container .nav-tabs .nav-item .nav-link .tab-tittle.append { - margin-right: 10px -} - -.tab-container .tab-content { - padding: 30px 20px 20px 20px; - width: 100%; - background: #f0f2f5 -} - -.tab-container .nav-tabs .nav-link { - color: #101010 -} - -.tab-container .nav-tabs .nav-link i { - color: #101010 -} - -.tab-container .nav-tabs .nav-link.active { - background: #f7f7f7; - color: #047006 -} - -.tab-container .nav-tabs .nav-link.active i { - color: inherit -} - -.tab-container .nav-pills { - margin: 10px -} - -.tab-container .nav-pills .nav-link.active { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); - color: #fff -} - -.tab-container.vertical-tabs { - display: -webkit-box; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - -webkit-box-flex: 1; - flex-grow: 1 -} - -.tab-container.vertical-tabs .nav-pills, -.tab-container.vertical-tabs .nav-tabs { - float: left; - display: -webkit-box; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - flex-direction: column -} - -.table, -table { - margin-bottom: 0 -} - -.table tfoot tr th, -.table thead tr th, -table tfoot tr th, -table thead tr th { - border-bottom-width: 1px; - font-family: Roboto, sans-serif; - font-weight: 500 -} - -.table tbody tr, -table tbody tr { - -webkit-transition-duration: .5s; - transition-duration: .5s -} - -.table tbody tr td, -table tbody tr td { - font-family: Roboto, sans-serif; - font-weight: 400; - vertical-align: middle -} - -.table tbody tr td .input-frame:after, -table tbody tr td .input-frame:after { - top: 5px -} - -.table tbody tr td span, -table tbody tr td span { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center -} - -.table tbody tr td span .status-indicator, -table tbody tr td span .status-indicator { - margin-right: 5px -} - -.table tbody tr td .image, -table tbody tr td .image { - max-width: 75px; - width: 100% -} - -.table tbody tr.text-align-edge td:first-child, -table tbody tr.text-align-edge td:first-child { - padding-left: 0; - text-align: left -} - -.table tbody tr.text-align-edge td:last-child, -table tbody tr.text-align-edge td:last-child { - padding-right: 0; - text-align: right -} - -.table td, -.table th, -table td, -table th { - white-space: nowrap -} - -.table:not(.table-dark) thead tr.solid-header th, -table:not(.table-dark) thead tr.solid-header th { - background: #fafafa; - border-top: 1px solid #f2f4f9 -} - -.table:not(.table-dark) tfoot, -.table:not(.table-dark) thead, -table:not(.table-dark) tfoot, -table:not(.table-dark) thead { - background: #e1e4e6 -} - -.table:not(.table-dark) tfoot tr th, -.table:not(.table-dark) thead tr th, -table:not(.table-dark) tfoot tr th, -table:not(.table-dark) thead tr th { - background: #fff; - color: #101010 -} - -.table:not(.table-dark) tbody tr[class*=bg], -table:not(.table-dark) tbody tr[class*=bg] { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) -} - -.table:not(.table-dark) tbody tr[class*=bg] td, -table:not(.table-dark) tbody tr[class*=bg] td { - color: #fff; - border: none -} - -.table:not(.table-dark) tbody tr td, -table:not(.table-dark) tbody tr td { - color: #101010 -} - -.table:not(.table-bordered) tfoot tr th, -.table:not(.table-bordered) thead tr th, -table:not(.table-bordered) tfoot tr th, -table:not(.table-bordered) thead tr th { - border-top: none -} - -.table.info-table tr td, -.table.info-table tr th, -table.info-table tr td, -table.info-table tr th { - text-align: right -} - -.table.info-table tr td:first-child, -.table.info-table tr th:first-child, -table.info-table tr td:first-child, -table.info-table tr th:first-child { - text-align: left -} - -.table.info-table tr td.actions, -.table.info-table tr th.actions, -table.info-table tr td.actions, -table.info-table tr th.actions { - padding-left: 0 -} - -.tippy-tooltip[data-animation=fade][data-state=hidden] { - opacity: 0 -} - -.tippy-iOS { - cursor: pointer !important; - -webkit-tap-highlight-color: transparent -} - -.tippy-popper { - pointer-events: none; - max-width: calc(100vw - 10px); - -webkit-transition-timing-function: cubic-bezier(.165, .84, .44, 1); - transition-timing-function: cubic-bezier(.165, .84, .44, 1); - -webkit-transition-property: -webkit-transform; - transition-property: -webkit-transform; - transition-property: transform; - transition-property: transform, -webkit-transform -} - -.tippy-tooltip { - position: relative; - color: #fff; - border-radius: 4px; - font-size: 14px; - line-height: 1.4; - background-color: #333; - -webkit-transition-property: visibility, opacity, -webkit-transform; - transition-property: visibility, opacity, -webkit-transform; - transition-property: visibility, opacity, transform; - transition-property: visibility, opacity, transform, -webkit-transform; - outline: 0 -} - -.tippy-tooltip[data-placement^=top]>.tippy-arrow { - border-width: 8px 8px 0; - border-top-color: #333; - margin: 0 3px; - -webkit-transform-origin: 50% 0; - transform-origin: 50% 0; - bottom: -7px -} - -.tippy-tooltip[data-placement^=bottom]>.tippy-arrow { - border-width: 0 8px 8px; - border-bottom-color: #333; - margin: 0 3px; - -webkit-transform-origin: 50% 7px; - transform-origin: 50% 7px; - top: -7px -} - -.tippy-tooltip[data-placement^=left]>.tippy-arrow { - border-width: 8px 0 8px 8px; - border-left-color: #333; - margin: 3px 0; - -webkit-transform-origin: 0 50%; - transform-origin: 0 50%; - right: -7px -} - -.tippy-tooltip[data-placement^=right]>.tippy-arrow { - border-width: 8px 8px 8px 0; - border-right-color: #333; - margin: 3px 0; - -webkit-transform-origin: 7px 50%; - transform-origin: 7px 50%; - left: -7px -} - -.tippy-tooltip[data-interactive][data-state=visible] { - pointer-events: auto -} - -.tippy-tooltip[data-inertia][data-state=visible] { - -webkit-transition-timing-function: cubic-bezier(.54, 1.5, .38, 1.11); - transition-timing-function: cubic-bezier(.54, 1.5, .38, 1.11) -} - -.tippy-arrow { - position: absolute; - border-color: transparent; - border-style: solid -} - -.tippy-content { - padding: 5px 9px -} - -.tippy-tooltip { - color: #101010; - background-color: #f9fafb; - border-radius: 0; - font-size: 12px -} - -.tippy-tooltip .tippy-content b { - color: #047006 -} - -.tippy-tooltip .tippy-content ul { - list-style-type: none; - padding-left: 4px -} - -.tippy-tooltip .tippy-content .mdi { - font-size: 16px -} - -.tippy-tooltip .tippy-content .grid-header { - padding: 5px 10px; - margin-bottom: 5px -} - -.page-body { - background: #fff -} - -.page-content-wrapper { - background: #f9fafb; - border-left: 1px solid #f2f4f9 -} - -@media (min-width:992px) { - .t-header .t-header-content-wrapper { - border-left: 1px solid #f2f4f9 - } - -} - -@media (min-width:768px) { - .page-body { - position: relative; - display: grid; - max-width: 100%; - grid-template-columns: 17rem calc(100vw - 17rem); - -webkit-transition: .3s; - transition: .3s - } - - .page-body .page-content-wrapper { - position: relative; - width: 100%; - min-height: 100vh; - padding: 1.5rem 2.5rem calc(90px + 1.5rem); - margin-top: 70px - } - - .page-body .page-content-wrapper .page-content-wrapper-inner { - max-width: 1140px; - margin-left: auto; - margin-right: auto - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header { - position: -webkit-sticky; - position: sticky; - top: 70px; - background: #f9fafb; - z-index: 99 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb { - padding: 1rem 1rem 1rem 21px; - margin-left: -20px; - margin-right: -20px; - background: #f9fafb - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item { - color: #565656; - letter-spacing: .03rem; - font-family: Roboto, sans-serif; - font-weight: 500 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item a { - color: inherit - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item.active { - color: #047006 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-title-heading { - color: #565656; - font-size: 1.5rem; - font-family: Roboto, sans-serif; - font-weight: 500; - margin-bottom: 0 - } - - .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-description { - opacity: .7; - margin-top: 15px - } - - body.sidebar-minimized .t-header .t-header-brand-wrapper { - background: #f9fafb - } - - body.sidebar-minimized .t-header .t-header-content-wrapper { - border-left: #f9fafb - } - - body.sidebar-minimized .page-body { - grid-template-columns: 0 100% - } - - body.sidebar-minimized .page-body .sidebar .sidebar_footer { - left: -17rem - } - - body.sidebar-minimized .page-body .sidebar .nav-category-divider { - position: initial - } - -} - -@media (max-width:991.98px) { - .t-header { - width: 100vw - } - - .t-header .t-header-brand-wrapper { - background: #f9fafb; - width: 4rem; - min-width: 4rem; - max-width: 4rem - } - - .t-header .t-header-brand-wrapper a .logo { - -webkit-animation-name: menuItemFadeIn; - animation-name: menuItemFadeIn; - -webkit-animation-duration: .25s; - animation-duration: .25s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - display: none - } - - @-webkit-keyframes menuItemFadeIn { - from { - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - display: none; - opacity: 0 - } - - to { - display: block; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1 - } - - } - - @keyframes menuItemFadeIn { - from { - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - display: none; - opacity: 0 - } - - to { - display: block; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1 - } - - } - - .t-header .t-header-brand-wrapper a .logo-mini { - display: block - } - - .page-body { - display: -webkit-box; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - flex-direction: row; - overflow: hidden; - max-width: 100% - } - - .page-body .sidebar { - position: relative; - left: 0; - z-index: 99; - width: 15rem; - min-width: 15rem; - max-width: 15rem; - margin-left: -15rem; - -webkit-transition-duration: .2s; - transition-duration: .2s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - -webkit-transition-property: margin-left, width; - transition-property: margin-left, width - } - - .page-body .sidebar .sidebar_footer { - -webkit-transition-duration: .2s; - transition-duration: .2s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - -webkit-transition-property: left; - transition-property: left; - left: -15rem - } - - .page-body .page-content-wrapper { - padding: 20px 20px; - min-width: 100vw; - margin-left: 0; - -webkit-transition-duration: .2s; - transition-duration: .2s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - -webkit-transition-property: margin-left; - transition-property: margin-left - } - - .page-body .page-content-wrapper .viewport-header .breadcrumb { - background: 0 0; - padding-left: 0 - } - - .page-body .page-content-wrapper footer { - position: relative - } - - .page-body.sidebar-collpased .sidebar { - margin-left: 0; - min-width: 15rem - } - - .page-body.sidebar-collpased .sidebar .sidebar_footer { - left: 0 - } - -} - -@media (max-width:767.98px) { - .page-body .page-content-wrapper { - padding: 80px 20px 0 20px - } - -} - -.profile-img.bg-inverse-primary { - color: #047006 -} - -.profile-img.bg-inverse-secondary { - color: grey -} - -.profile-img.bg-inverse-success { - color: #047006 -} - -.profile-img.bg-inverse-info { - color: #6c61f6 -} - -.profile-img.bg-inverse-warning { - color: #f0825f -} - -.profile-img.bg-inverse-danger { - color: #ff5f66 -} - -.profile-img.bg-inverse-light { - color: #dfdfdf -} - -.profile-img.bg-inverse-dark { - color: #74767b -} - -.profile-img.bg-inverse-white { - color: #fff -} - -.notification-indicator-primary { - background: #047006 -} - -.notification-indicator-primary:before { - content: '3'; - background: rgba(4, 112, 6, .5) -} - -.notification-indicator-secondary { - background: grey -} - -.notification-indicator-secondary:before { - content: '.5'; - background: rgba(128, 128, 128, .5) -} - -.notification-indicator-success { - background: #047006 -} - -.notification-indicator-success:before { - content: 'http://www.w3.org/2000/svg'; - background: rgba(0, 224, 147, .5) -} - -.notification-indicator-info { - background: #6c61f6 -} - -.notification-indicator-info:before { - content: '0 0 4 5'; - background: rgba(108, 97, 246, .5) -} - -.notification-indicator-warning { - background: #f0825f -} - -.notification-indicator-warning:before { - content: '%23343a40'; - background: rgba(240, 130, 95, .5) -} - -.notification-indicator-danger { - background: #ff5f66 -} - -.notification-indicator-danger:before { - content: 'M2 0L0 2h4zm0 5L0 3h4z'; - background: rgba(255, 95, 102, .5) -} - -.notification-indicator-light { - background: #dfdfdf -} - -.notification-indicator-light:before { - content: 'http://www.w3.org/2000/svg'; - background: rgba(223, 223, 223, .5) -} - -.notification-indicator-dark { - background: #74767b -} - -.notification-indicator-dark:before { - content: '%23dc3545'; - background: rgba(116, 118, 123, .5) -} - -.notification-indicator-white { - background: #fff -} - -.notification-indicator-white:before { - content: '-2 -2 7 7'; - background: rgba(255, 255, 255, .5) -} - -.border-top { - border-top-style: solid; - border-top-color: #f2f4f9; - border-top-width: 1px -} - -.border-right { - border-right-style: solid; - border-right-color: #f2f4f9; - border-right-width: 1px -} - -.border-bottom { - border-bottom-style: solid; - border-bottom-color: #f2f4f9; - border-bottom-width: 1px -} - -.border-left { - border-left-style: solid; - border-left-color: #f2f4f9; - border-left-width: 1px -} - -.ellipsor { - max-width: 100%; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden -} - -.text-gray { - color: #565656 -} - -.overflow-hidden { - overflow: hidden -} - -.pos-relative { - position: relative -} - -.profile-img { - width: 40px; - height: 40px; - overflow: hidden -} - -.profile-img:not(.component-flat) { - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2) -} - -.profile-img:not(.img-sm):not(.img-lg):not(.img-xl) img { - width: 40px; - height: 40px -} - -.profile-img:not(.img-rounded) { - border-radius: 6px -} - -.profile-img.no-avatar { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - text-align: center; - text-transform: uppercase; - font-family: Roboto, sans-serif; - font-weight: 600 -} - -.profile-img.img-rounded { - border-radius: 100% -} - -.grouped-images { - display: -webkit-box; - display: flex -} - -.grouped-images .plus-text, -.grouped-images img { - display: -webkit-box; - display: flex; - -webkit-box-align: center; - align-items: center; - -webkit-box-pack: center; - justify-content: center; - text-align: center; - border-radius: 100%; - overflow: hidden; - margin-right: -10px; - margin-right: -10px; - border: 3px solid #fff; - background: #f0f2f5; - color: #565656; - font-family: Roboto, sans-serif; - font-weight: 700; - letter-spacing: .03rem -} - -.grouped-images .plus-text:not(.img-sm):not(.img-lg):not(.img-xl), -.grouped-images img:not(.img-sm):not(.img-lg):not(.img-xl) { - width: 40px; - height: 40px -} - -.img-sm { - width: 30px; - height: 30px -} - -.img-lg { - width: 80px; - height: 80px -} - -.img-xl { - width: 100px; - height: 100px -} - -.mdi.mdi-1x:before { - font-size: 1.25rem -} - -.mdi.mdi-2x:before { - font-size: 1.5625rem -} - -.mdi.mdi-3x:before { - font-size: 1.875rem -} - -.mdi.mdi-4x:before { - font-size: 2.1875rem -} - -.mdi.mdi-5x:before { - font-size: 2.5rem -} - -.mdi.mdi-6x:before { - font-size: 3.125rem -} - -.mdi.mdi-7x:before { - font-size: 3.75rem -} - -.status-indicator { - display: inline-block; - width: 12px; - min-width: 12px; - height: 12px; - border-radius: 4px -} - -.status-indicator.rounded-indicator { - border-radius: 50px -} - -.status-indicator.small { - width: 7px; - min-width: 7px; - height: 7px -} - -.text-black { - color: #101010 -} - -.notification-indicator { - display: block; - width: 7px; - height: 7px; - border-radius: 100%; - z-index: 0 -} - -.notification-indicator.notification-indicator-ripple:before { - content: '%23dc3545'; - display: block; - width: 26px; - height: 26px; - z-index: -1; - position: absolute; - top: -9px; - left: -9px; - border-radius: 100%; - opacity: 0; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - mix-blend-mode: screen; - -webkit-animation: ripple 1.2s ease-out; - animation: ripple 1.2s ease-out; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite -} - -.logo { - display: block; - margin: 0 auto; - width: 280px -} - -.logo img { - width: 100% -} - -.grid { - background: #fff; - border-radius: 6px; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); - margin-bottom: 1.5rem; - border: 1px solid rgba(238, 238, 238, .75) -} - -.grid-header { - padding: 15px 20px; - margin-bottom: 15px; - font-family: Roboto, sans-serif; - font-weight: 500; - letter-spacing: .03rem; - background: #f9fafb; - border-left: 3px solid #047006; - border-radius: 0 6px 0 0 -} - -.grid-title { - opacity: .9; - margin-bottom: 25px -} - -.close { - color: #101010 -} - -.split-header { - display: -webkit-box; - display: flex; - -webkit-box-pack: justify; - justify-content: space-between; - -webkit-box-align: center; - align-items: center -} - -.split-header .content-wrapper { - display: -webkit-box; - display: flex -} - -.split-header .content-wrapper a i, -.split-header .content-wrapper span i { - font-size: 20px; - color: #adb5bd; - -webkit-transition: .3s ease color; - transition: .3s ease color -} - -.split-header .content-wrapper a i:hover, -.split-header .content-wrapper span i:hover { - color: #047006 -} - -.split-header .content-wrapper.v-centered { - -webkit-box-align: center; - align-items: center -} - -.split-header .content-wrapper.h-centered { - -webkit-box-pack: center; - justify-content: center -} - -.grid-body { - padding: 20px 25px 20px -} - -.card-title { - font-family: Roboto, sans-serif; - font-weight: 500; - color: #313131; - margin-bottom: 0 -} - -.equel-grid { - display: -webkit-box; - display: flex; - -webkit-box-align: stretch; - align-items: stretch -} - -.equel-grid .grid { - width: 100%; - min-width: 100% -} - -.showcase_row_area { - margin-bottom: 20px -} - -.showcase_row_area .showcase_text_area { - text-align: right -} - -@media (max-width:767.98px) { - .showcase_row_area .showcase_text_area { - text-align: left - } - -} - -.showcase_row_area .showcase_content_area { - margin-bottom: -10px -} - -.showcase_row_area .showcase_content_area .btn { - margin-right: 5px; - margin-bottom: 10px -} - -.showcase_row_area:last-child { - margin-bottom: 0 -} - -.content-preview { - width: 45px; - height: 45px -} - -.content-preview.rounded { - border-radius: 100% -} - -.btn:not(.disabled),.cursor_pointer,a { - cursor: pointer -} - -.grd-positive-currency { - color: #047006 -} - -.grd-negative-currency { - color: red -} - -.color-success { - color: var(--success) -} - -.color-danger { - color: var(--danger) -} - -.color-warning { - color: var(--warning) -} - -.color-primary { - color: var(--primary) -} - -.btn-gradido-orange { - color: #fff; - background-color: #ffa600; - border-color: #ffa600 -} - -.visible-modal { - display: block -} - -.margin-top-10 { - margin-top: 10px -} - -.pull-right { - float: right -} - -.pull-right-row { - display: block; - margin-right: 10px -} - -.display-block { - display: block -} - -p.grd_small { - margin-top: 2px; - margin-bottom: 2px -} - -ul.grd-no-style { - list-style-type: none -} - -.center-ul-container ul { - padding-left: 0; - margin-bottom: 0; - text-align: center -} - -.center-ul-container ul .grd-error { - margin-top: 5px; - color: #8b0000 -} - -.grd-alert-color { - color: #ff5f66 !important -} - -.grd-success-color { - color: #047006 !important -} - -.grd-orange-color { - color: #ffa600 -} - -.hidden { - display: none -} - -.alert { - cursor: pointer -} - -.table.table-auto-break td, -.table.table-auto-break th { - white-space: pre-line -} diff --git a/community_server/webroot/css/styles.css b/community_server/webroot/css/styles.css deleted file mode 100644 index 143cbdc08..000000000 --- a/community_server/webroot/css/styles.css +++ /dev/null @@ -1,347 +0,0 @@ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 30.10.2019, 09:26:42 - Author : einhornimmond -*/ -.dev-info { - position: fixed; - color: grey; - font-size: smaller; - left: 8px; -} -.grd-time-used { - bottom: 0; -} -.versionstring { - top: 0; -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 12.07.2019, 07:59:32 - Author : einhornimmond -*/ -div[role='grd_dialog'] { - position: fixed; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - top: 0; - left: 0; -} -div.grd_modal-dialog { - margin-top: 100px; - min-height: 200px; - max-width: 1000px; - margin-left: auto; - margin-right: auto; - background-color: white; - color: black; - border: 1px solid grey; -} -div.grd_modal-dialog.grd_dialog-large { - margin-top: 5px; - width: 90%; -} -div.grd_modal-body { - padding: 25px; -} -div.grd_modal-header { - background-color: rgba(0, 0, 0, 0.1); - padding: 5px; - padding-left: 15px; - border: 1px solid grey; - color: black; -} -div.grd_modal-footer { - background-color: rgba(0, 0, 0, 0.1); - height: 40px; -} -.grd_modal-footer a, -.grd_modal-footer button { - float: right; - padding: 9px; - margin-right: 10px; - border: 1px solid grey; -} -.grd_modal-footer a:hover, -.grd_modal-footer button:hover { - background-color: rgba(255, 255, 255, 0.5); -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 30.10.2019, 14:41:57 - Author : einhornimmond -*/ -/* Button */ -/*a.grd_bn,a.grd_bn:visited { - color:black; - text-decoration: none; -} -*/ -.grd-form-bn:hover, -.grd-active { - background-color: lightgray; - border-color: black; -} -.grd-form-bn { - padding: 5px; - border: 1px solid grey; - display: table-cell; - text-align: center; - vertical-align: middle; - color: #444; -} -a.grd-form-bn, -a.grd-form-bn:visited { - color: black; - text-decoration: none; -} -.grd-form-bn-succeed { - background-color: lightcyan; - color: green; - margin-top: 3px; - margin-bottom: 3px; -} -.grd-form-bn-succeed:not([disabled]):hover { - background-color: lightgreen; -} -.grd-form-bn-discard { - margin-left: 5px; - border: 1px solid red; - color: red; - cursor: pointer; -} -/* -.grd_large-bn { - width:100vw; - height:25vh; - font-size: 8vh; -} - -.grd_bg-bn { - width:50vw; - height:25vh; - font-size: 7vh; -} - -.gr_md-bn { - width:50vw; - height:25vh; - font-size: 6vh; -} -*/ -/* form elements */ -.grd_textarea { - border: 1px solid grey; - background-color: rgba(0, 0, 0, 0.05); - padding: 5px; - font-style: italic; -} -.grd-input label { - display: block; -} -input.grd-privkey { - width: 465px; -} -input.grd-pubkey { - width: 465px; -} -input.grd-non-der-keys { - width: 900px; -} -input:not([type='radio']) { - width: 200px; -} -label:not(.grd_radio_label) { - width: 80px; - display: inline-block; -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 13.10.2019, 15:43:58 - Author : einhornimmond -*/ -.grd-time-used { - position: fixed; - bottom: 0; - left: 0; - color: grey; - font-size: smaller; -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 30.10.2019, 16:04:16 - Author : einhornimmond -*/ -/* messages, update flash */ -.grd-error { - color: red; - border: 1px solid rgba(255, 0, 0, 0.5); - padding: 5px; -} -.grd-info { - border: 1px dotted gray; - padding: 5px; -} -.grd-success { - padding: 5px; - color: green; -} -.flash-messages .message { - padding: 5px; -} -.flash-messages .success { - color: green; -} -.flash-messages .error { - color: red; -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 30.10.2019, 14:16:16 - Author : einhornimmond -*/ -/* navbar */ -nav.grd-left-bar { - position: fixed; - top: 80.5px; -} -nav .grd-nav-bn { - width: 120px; -} -nav ul { - margin-top: 0; - padding-left: 0; -} -/* buttons */ -.grd-nav-bn:hover, -.grd-active { - background-color: lightgray; - border-color: black; -} -.grd-nav-bn { - padding: 10px; - border: 1px solid grey; - display: table-cell; - text-align: center; - vertical-align: middle; - color: grey; -} -.grd-nav-without-border { - border: none; -} -.grd-nav-bn-large { - width: 40vw; - height: 18vh; - font-size: 35px; -} -a.grd-nav-bn, -a.grd-nav-bn:visited { - color: black; - text-decoration: none; -} -.grd-nav-bn-discard { - color: darkred !important; -} -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 07.07.2019, 16:20:15 - Author : einhornimmond -*/ -/* content container */ -.grd_container { - max-width: 820px; - margin-left: auto; - margin-right: auto; -} -.grd_container_small { - max-width: 500px; -} -.grd_text { - max-width: 550px; - margin-bottom: 5px; -} -.grd_text-max-width { - max-width: 550px; -} -/* layout helper */ -.grd_margin_5 { - margin: 5px; -} -.grd-margin-top-10 { - margin-top: 10px; -} -.grd-width-200 { - width: 200px; -} -.grd-padding-top-bottom-5 { - padding-top: 5px; - padding-bottom: 5px; -} -.grd-padding-top-bottom-10 { - padding-top: 10px; - padding-bottom: 10px; -} -.grd_margin-bottom { - margin-bottom: 5px; -} -.grd_right { - float: right; -} -a.grd_invisible_link { - color: black; - text-decoration: none; -} -a.grd_invisible_link:hover { - color: grey; -} -.grd_clickable { - cursor: pointer; -} -ul.grd-no-style { - list-style: none; -} -p.grd_small { - margin-top: 2px; - margin-bottom: 2px; -} -.grd-default-currency { - color: grey; -} -.grd-positive-currency { - color: green; -} -.grd-negative-currency { - color: red; -} -.admin-border { - border-color: #ffa600; -} diff --git a/community_server/webroot/favicon.ico b/community_server/webroot/favicon.ico deleted file mode 100644 index 5b44f2027..000000000 Binary files a/community_server/webroot/favicon.ico and /dev/null differ diff --git a/community_server/webroot/favicon.png b/community_server/webroot/favicon.png deleted file mode 100644 index 5c437973e..000000000 Binary files a/community_server/webroot/favicon.png and /dev/null differ diff --git a/community_server/webroot/font/cakedingbats-webfont.eot b/community_server/webroot/font/cakedingbats-webfont.eot deleted file mode 100644 index e8605d926..000000000 Binary files a/community_server/webroot/font/cakedingbats-webfont.eot and /dev/null differ diff --git a/community_server/webroot/font/cakedingbats-webfont.svg b/community_server/webroot/font/cakedingbats-webfont.svg deleted file mode 100644 index d1e0c98f7..000000000 --- a/community_server/webroot/font/cakedingbats-webfont.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/community_server/webroot/font/cakedingbats-webfont.ttf b/community_server/webroot/font/cakedingbats-webfont.ttf deleted file mode 100644 index 13d54454e..000000000 Binary files a/community_server/webroot/font/cakedingbats-webfont.ttf and /dev/null differ diff --git a/community_server/webroot/font/cakedingbats-webfont.woff b/community_server/webroot/font/cakedingbats-webfont.woff deleted file mode 100644 index 073baab11..000000000 Binary files a/community_server/webroot/font/cakedingbats-webfont.woff and /dev/null differ diff --git a/community_server/webroot/font/cakedingbats-webfont.woff2 b/community_server/webroot/font/cakedingbats-webfont.woff2 deleted file mode 100644 index 6e71eaf53..000000000 Binary files a/community_server/webroot/font/cakedingbats-webfont.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot deleted file mode 100644 index 3e035411c..000000000 Binary files a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot and /dev/null differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf deleted file mode 100644 index db76e5796..000000000 Binary files a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff deleted file mode 100644 index 5f10918f0..000000000 Binary files a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff and /dev/null differ diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 deleted file mode 100644 index 34df5fe02..000000000 Binary files a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Black.ttf b/community_server/webroot/fonts/Roboto/Roboto-Black.ttf deleted file mode 100644 index 689fe5cb3..000000000 Binary files a/community_server/webroot/fonts/Roboto/Roboto-Black.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf b/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf deleted file mode 100644 index d3f01ad24..000000000 Binary files a/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Light.ttf b/community_server/webroot/fonts/Roboto/Roboto-Light.ttf deleted file mode 100644 index 219063a57..000000000 Binary files a/community_server/webroot/fonts/Roboto/Roboto-Light.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf b/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf deleted file mode 100644 index 1a7f3b0bb..000000000 Binary files a/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf b/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf deleted file mode 100644 index 2c97eeadf..000000000 Binary files a/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf b/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf deleted file mode 100644 index b74a4fd1a..000000000 Binary files a/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.eot b/community_server/webroot/fonts/materialdesignicons-webfont.eot deleted file mode 100644 index fe283ac48..000000000 Binary files a/community_server/webroot/fonts/materialdesignicons-webfont.eot and /dev/null differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.svg b/community_server/webroot/fonts/materialdesignicons-webfont.svg deleted file mode 100644 index b356c2977..000000000 --- a/community_server/webroot/fonts/materialdesignicons-webfont.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.ttf b/community_server/webroot/fonts/materialdesignicons-webfont.ttf deleted file mode 100644 index 3219fca04..000000000 Binary files a/community_server/webroot/fonts/materialdesignicons-webfont.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.woff b/community_server/webroot/fonts/materialdesignicons-webfont.woff deleted file mode 100644 index abe1e47ef..000000000 Binary files a/community_server/webroot/fonts/materialdesignicons-webfont.woff and /dev/null differ diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.woff2 b/community_server/webroot/fonts/materialdesignicons-webfont.woff2 deleted file mode 100644 index 47e8a2c3e..000000000 Binary files a/community_server/webroot/fonts/materialdesignicons-webfont.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-300.eot b/community_server/webroot/fonts/open-sans-v18-latin-300.eot deleted file mode 100644 index 1c0f100ba..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-300.eot and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-300.svg b/community_server/webroot/fonts/open-sans-v18-latin-300.svg deleted file mode 100644 index c0a1c8cd7..000000000 --- a/community_server/webroot/fonts/open-sans-v18-latin-300.svg +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/community_server/webroot/fonts/open-sans-v18-latin-300.ttf b/community_server/webroot/fonts/open-sans-v18-latin-300.ttf deleted file mode 100644 index dcce1bb7d..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-300.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-300.woff b/community_server/webroot/fonts/open-sans-v18-latin-300.woff deleted file mode 100644 index 26567ff25..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-300.woff and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-300.woff2 b/community_server/webroot/fonts/open-sans-v18-latin-300.woff2 deleted file mode 100644 index 7bf901c28..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-300.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-600.eot b/community_server/webroot/fonts/open-sans-v18-latin-600.eot deleted file mode 100644 index b0d46a4ce..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-600.eot and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-600.svg b/community_server/webroot/fonts/open-sans-v18-latin-600.svg deleted file mode 100644 index 410561e78..000000000 --- a/community_server/webroot/fonts/open-sans-v18-latin-600.svg +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/community_server/webroot/fonts/open-sans-v18-latin-600.ttf b/community_server/webroot/fonts/open-sans-v18-latin-600.ttf deleted file mode 100644 index 25fdf1eb3..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-600.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-600.woff b/community_server/webroot/fonts/open-sans-v18-latin-600.woff deleted file mode 100644 index 9d0eb42db..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-600.woff and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-600.woff2 b/community_server/webroot/fonts/open-sans-v18-latin-600.woff2 deleted file mode 100644 index 5c5d54e2f..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-600.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-700.eot b/community_server/webroot/fonts/open-sans-v18-latin-700.eot deleted file mode 100644 index 5b9ddb4eb..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-700.eot and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-700.svg b/community_server/webroot/fonts/open-sans-v18-latin-700.svg deleted file mode 100644 index 8e6b61ade..000000000 --- a/community_server/webroot/fonts/open-sans-v18-latin-700.svg +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/community_server/webroot/fonts/open-sans-v18-latin-700.ttf b/community_server/webroot/fonts/open-sans-v18-latin-700.ttf deleted file mode 100644 index c9a3c7a48..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-700.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-700.woff b/community_server/webroot/fonts/open-sans-v18-latin-700.woff deleted file mode 100644 index b8b46d0b4..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-700.woff and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-700.woff2 b/community_server/webroot/fonts/open-sans-v18-latin-700.woff2 deleted file mode 100644 index 3a38286c6..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-700.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-800.eot b/community_server/webroot/fonts/open-sans-v18-latin-800.eot deleted file mode 100644 index b9d7b260c..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-800.eot and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-800.svg b/community_server/webroot/fonts/open-sans-v18-latin-800.svg deleted file mode 100644 index f2a2d9f6e..000000000 --- a/community_server/webroot/fonts/open-sans-v18-latin-800.svg +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/community_server/webroot/fonts/open-sans-v18-latin-800.ttf b/community_server/webroot/fonts/open-sans-v18-latin-800.ttf deleted file mode 100644 index a62af861f..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-800.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-800.woff b/community_server/webroot/fonts/open-sans-v18-latin-800.woff deleted file mode 100644 index bdac80d5c..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-800.woff and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-800.woff2 b/community_server/webroot/fonts/open-sans-v18-latin-800.woff2 deleted file mode 100644 index 86a8a8757..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-800.woff2 and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-regular.eot b/community_server/webroot/fonts/open-sans-v18-latin-regular.eot deleted file mode 100644 index 8f3becf66..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-regular.eot and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-regular.svg b/community_server/webroot/fonts/open-sans-v18-latin-regular.svg deleted file mode 100644 index 78eb653a7..000000000 --- a/community_server/webroot/fonts/open-sans-v18-latin-regular.svg +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/community_server/webroot/fonts/open-sans-v18-latin-regular.ttf b/community_server/webroot/fonts/open-sans-v18-latin-regular.ttf deleted file mode 100644 index fb23764c1..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-regular.ttf and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-regular.woff b/community_server/webroot/fonts/open-sans-v18-latin-regular.woff deleted file mode 100644 index 39e88ed92..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-regular.woff and /dev/null differ diff --git a/community_server/webroot/fonts/open-sans-v18-latin-regular.woff2 b/community_server/webroot/fonts/open-sans-v18-latin-regular.woff2 deleted file mode 100644 index e9f58b775..000000000 Binary files a/community_server/webroot/fonts/open-sans-v18-latin-regular.woff2 and /dev/null differ diff --git a/community_server/webroot/img/50x50.png b/community_server/webroot/img/50x50.png deleted file mode 100644 index 7eb2b9ad8..000000000 Binary files a/community_server/webroot/img/50x50.png and /dev/null differ diff --git a/community_server/webroot/img/cake-logo.png b/community_server/webroot/img/cake-logo.png deleted file mode 100644 index 41939ef5a..000000000 Binary files a/community_server/webroot/img/cake-logo.png and /dev/null differ diff --git a/community_server/webroot/img/cake.icon.png b/community_server/webroot/img/cake.icon.png deleted file mode 100644 index 394fa42d5..000000000 Binary files a/community_server/webroot/img/cake.icon.png and /dev/null differ diff --git a/community_server/webroot/img/cake.logo.svg b/community_server/webroot/img/cake.logo.svg deleted file mode 100644 index e73abb54b..000000000 --- a/community_server/webroot/img/cake.logo.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/community_server/webroot/img/cake.power.gif b/community_server/webroot/img/cake.power.gif deleted file mode 100644 index 8f8d570a2..000000000 Binary files a/community_server/webroot/img/cake.power.gif and /dev/null differ diff --git a/community_server/webroot/img/gradido_logo_web.png b/community_server/webroot/img/gradido_logo_web.png deleted file mode 100644 index 062997764..000000000 Binary files a/community_server/webroot/img/gradido_logo_web.png and /dev/null differ diff --git a/community_server/webroot/img/gradido_logo_web.webp b/community_server/webroot/img/gradido_logo_web.webp deleted file mode 100644 index bff8a245d..000000000 Binary files a/community_server/webroot/img/gradido_logo_web.webp and /dev/null differ diff --git a/community_server/webroot/img/logo_half.png b/community_server/webroot/img/logo_half.png deleted file mode 100644 index d6852eab8..000000000 Binary files a/community_server/webroot/img/logo_half.png and /dev/null differ diff --git a/community_server/webroot/img/logo_half.webp b/community_server/webroot/img/logo_half.webp deleted file mode 100644 index d0e6c245b..000000000 Binary files a/community_server/webroot/img/logo_half.webp and /dev/null differ diff --git a/community_server/webroot/img/logo_schrift.png b/community_server/webroot/img/logo_schrift.png deleted file mode 100644 index 062997764..000000000 Binary files a/community_server/webroot/img/logo_schrift.png and /dev/null differ diff --git a/community_server/webroot/img/logo_schrift.webp b/community_server/webroot/img/logo_schrift.webp deleted file mode 100644 index bff8a245d..000000000 Binary files a/community_server/webroot/img/logo_schrift.webp and /dev/null differ diff --git a/community_server/webroot/index.php b/community_server/webroot/index.php deleted file mode 100644 index 2e697aedc..000000000 --- a/community_server/webroot/index.php +++ /dev/null @@ -1,41 +0,0 @@ -emit($server->run()); - diff --git a/community_server/webroot/js/basic.js b/community_server/webroot/js/basic.js deleted file mode 100644 index df53065fe..000000000 --- a/community_server/webroot/js/basic.js +++ /dev/null @@ -1,116 +0,0 @@ -// cross browser dom is ready module from: -// https://www.competa.com/blog/cross-browser-document-ready-with-vanilla-javascript/ -var domIsReady = (function(domIsReady) { - var isBrowserIeOrNot = function() { - return (!document.attachEvent || typeof document.attachEvent === "undefined" ? 'not-ie' : 'ie'); - } - - domIsReady = function(callback) { - if (callback && typeof callback === 'function') { - if (isBrowserIeOrNot() !== 'ie') { - document.addEventListener("DOMContentLoaded", function() { - return callback(); - }); - } else { - document.attachEvent("onreadystatechange", function() { - if (document.readyState === "complete") { - return callback(); - } - }); - } - } else { - console.error('The callback is not a function!'); - } - } - - return domIsReady; -})(domIsReady || {}); - - -// vanilla ajax request, json get -function getJson(basisUrl, method, successFunction, errorFunction, timeoutFunction) { - var xhr = new XMLHttpRequest(); - - xhr.onload = function(e) { - var xhr = e.target; - //console.log(xhr); - var jsonReturn = []; - if (xhr.responseType === 'json') { - jsonReturn = xhr.response; - } else { - jsonReturn = JSON.parse(xhr.responseText); - } - successFunction(jsonReturn); - } - xhr.onerror = function(e) { - errorFunction(e); - } - xhr.ontimeout = function(e) { - timeoutFunction(e); - } - - var bustCache = '&' + new Date().getTime(); - //oReq.open('GET', e.target.dataset.url + bustCache, true); - xhr.open('GET', basisUrl + '?method=' + method + bustCache, true); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.responseType = 'json'; - xhr.send(); -} - -// cross browser dom is ready -(function(document, window, domIsReady, undefined) { - domIsReady(function() { - var DesktopToggler = document.querySelector('#nav-action'); - var MobileToggler = document.querySelector('#nav-action-mobile'); - var HeaderToggle = document.querySelector('.t-header-toggler'); - - // SIDEBAR TOGGLE FUNCTION FOR LARGE SCREENS (SCREEN "LG" AND UP) - if (DesktopToggler) { - DesktopToggler.addEventListener('click', function() { - console.log('toggler clicked / Desktop'); - if (document.querySelector('.nav-menu').classList.contains('initial')) { - document.querySelector('.nav-menu').classList.remove('initial'); - document.querySelector('.nav-menu').classList.add('nav-menu-minimized'); - } else { - document.querySelector('.nav-menu').classList.toggle('nav-menu-minimized'); - document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized'); - } - let big = document.querySelectorAll('.logo.big'); - big.forEach(function(el) { - el.classList.toggle('visible'); - }); - let small = document.querySelectorAll('.logo.small'); - small.forEach(function(el) { - el.classList.toggle('visible'); - }); - }); - } - - // SIDEBAR TOGGLE FUNCTION FOR MOBILE (SCREEN "MD" AND DOWN) - if (MobileToggler) { - MobileToggler.addEventListener('click', function() { - console.log('toggler clicked / Desktop'); - if (document.querySelector('.nav-menu').classList.contains('initial')) { - document.querySelector('.nav-menu').classList.remove('initial'); - document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized'); - } else { - document.querySelector('.nav-menu').classList.toggle('nav-menu-minimized'); - document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized'); - } - let big = document.querySelectorAll('.logo.big'); - big.forEach(function(el) { - el.classList.toggle('visible'); - }); - let small = document.querySelectorAll('.logo.small'); - small.forEach(function(el) { - el.classList.toggle('visible'); - }); - }); - } - if (HeaderToggle) { - HeaderToggle.addEventListener('click', function() { - HeaderToggle.classList.toggle('arrow'); - }); - } - }); -})(document, window, domIsReady); \ No newline at end of file diff --git a/community_server/webroot/js/core.js b/community_server/webroot/js/core.js deleted file mode 100644 index 9678001c2..000000000 --- a/community_server/webroot/js/core.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(T,e){"use strict";var t=[],x=T.document,i=Object.getPrototypeOf,a=t.slice,g=t.concat,l=t.push,r=t.indexOf,n={},o=n.toString,m=n.hasOwnProperty,s=m.toString,u=s.call(Object),v={},y=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},_=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,noModule:!0};function b(e,t,n){var i,r=(t=t||x).createElement("script");if(r.text=e,n)for(i in c)n[i]&&(r[i]=n[i]);t.head.appendChild(r).parentNode.removeChild(r)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var C=function(e,t){return new C.fn.init(e,t)},f=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function h(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!y(e)&&!_(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+P+")"+P+"*"),K=new RegExp("="+P+"*([^\\]'\"]*?)"+P+"*\\]","g"),$=new RegExp(F),Q=new RegExp("^"+q+"$"),V={ID:new RegExp("^#("+q+")"),CLASS:new RegExp("^\\.("+q+")"),TAG:new RegExp("^("+q+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},z=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,X=/^[^{]+\{\s*\[native \w/,G=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),ee=function(e,t,n){var i="0x"+t-65536;return i!=i||n?t:i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ie=function(){E()},re=ye(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{O.apply(t=j.call(y.childNodes),y.childNodes),t[y.childNodes.length].nodeType}catch(n){O={apply:t.length?function(e,t){k.apply(e,j.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function oe(e,t,n,i){var r,o,s,a,l,u,c,f=t&&t.ownerDocument,h=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==h&&9!==h&&11!==h)return n;if(!i&&((t?t.ownerDocument||t:y)!==T&&E(t),t=t||T,x)){if(11!==h&&(l=G.exec(e)))if(r=l[1]){if(9===h){if(!(s=t.getElementById(r)))return n;if(s.id===r)return n.push(s),n}else if(f&&(s=f.getElementById(r))&&v(t,s)&&s.id===r)return n.push(s),n}else{if(l[2])return O.apply(n,t.getElementsByTagName(e)),n;if((r=l[3])&&d.getElementsByClassName&&t.getElementsByClassName)return O.apply(n,t.getElementsByClassName(r)),n}if(d.qsa&&!D[e+" "]&&(!m||!m.test(e))){if(1!==h)f=t,c=e;else if("object"!==t.nodeName.toLowerCase()){for((a=t.getAttribute("id"))?a=a.replace(te,ne):t.setAttribute("id",a=C),o=(u=p(e)).length;o--;)u[o]="#"+a+" "+ve(u[o]);c=u.join(","),f=J.test(e)&&ge(t.parentNode)||t}if(c)try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){}finally{a===C&&t.removeAttribute("id")}}}return g(e.replace(W,"$1"),t,n,i)}function se(){var i=[];return function e(t,n){return i.push(t+" ")>b.cacheLength&&delete e[i.shift()],e[t+" "]=n}}function ae(e){return e[C]=!0,e}function le(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ue(e,t){for(var n=e.split("|"),i=n.length;i--;)b.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function de(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&re(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function pe(s){return ae(function(o){return o=+o,ae(function(e,t){for(var n,i=s([],e.length,o),r=i.length;r--;)e[n=i[r]]&&(e[n]=!(t[n]=e[n]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in d=oe.support={},r=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},E=oe.setDocument=function(e){var t,n,i=e?e.ownerDocument||e:y;return i!==T&&9===i.nodeType&&i.documentElement&&(s=(T=i).documentElement,x=!r(T),y!==T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",ie,!1):n.attachEvent&&n.attachEvent("onunload",ie)),d.attributes=le(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=le(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=X.test(T.getElementsByClassName),d.getById=le(function(e){return s.appendChild(e).id=C,!T.getElementsByName||!T.getElementsByName(C).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(Z,ee);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n,i,r,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(r=t.getElementsByName(e),i=0;o=r[i++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],r=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[r++];)1===n.nodeType&&i.push(n);return i},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&x)return t.getElementsByClassName(e)},a=[],m=[],(d.qsa=X.test(T.querySelectorAll))&&(le(function(e){s.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+P+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+C+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+C+"+*").length||m.push(".#.+[+~]")}),le(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+P+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),s.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(d.matchesSelector=X.test(c=s.matches||s.webkitMatchesSelector||s.mozMatchesSelector||s.oMatchesSelector||s.msMatchesSelector))&&le(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),a.push("!=",F)}),m=m.length&&new RegExp(m.join("|")),a=a.length&&new RegExp(a.join("|")),t=X.test(s.compareDocumentPosition),v=t||X.test(s.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return u=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument===y&&v(y,e)?-1:t===T||t.ownerDocument===y&&v(y,t)?1:l?L(l,e)-L(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,i=0,r=e.parentNode,o=t.parentNode,s=[e],a=[t];if(!r||!o)return e===T?-1:t===T?1:r?-1:o?1:l?L(l,e)-L(l,t):0;if(r===o)return ce(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?ce(s[i],a[i]):s[i]===y?-1:a[i]===y?1:0}),T},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==T&&E(e),t=t.replace(K,"='$1']"),d.matchesSelector&&x&&!D[t+" "]&&(!a||!a.test(t))&&(!m||!m.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&$.test(n)&&(t=p(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=h[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&h(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,i,r){return function(e){var t=oe.attr(e,n);return null==t?"!="===i:!i||(t+="","="===i?t===r:"!="===i?t!==r:"^="===i?r&&0===t.indexOf(r):"*="===i?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(e,n,i){return y(n)?C.grep(e,function(e,t){return!!n.call(e,t,e)!==i}):n.nodeType?C.grep(e,function(e){return e===n!==i}):"string"!=typeof n?C.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(C.fn.init=function(e,t,n){var i,r;if(!e)return this;if(n=n||I,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this);if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:x,!0)),A.test(i[1])&&C.isPlainObject(t))for(i in t)y(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(r=x.getElementById(i[2]))&&(this[0]=r,this.length=1),this}).prototype=C.fn,I=C(x);var O=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function L(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]+)/i,ce=/^$|^module$|\/(?:java|ecma)script/i,fe={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function he(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?C.merge([e],n):n}function de(e,t){for(var n=0,i=e.length;nx",v.noCloneChecked=!!pe.cloneNode(!0).lastChild.defaultValue;var ye=x.documentElement,_e=/^key/,be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,we=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Te(){return!1}function xe(){try{return x.activeElement}catch(e){}}function Ce(e,t,n,i,r,o){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(i=i||n,n=void 0),t)Ce(e,a,n,i,t[a],o);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=Te;else if(!r)return e;return 1===o&&(s=r,(r=function(e){return C().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=C.guid++)),e.each(function(){C.event.add(this,t,r,i,n)})}C.event={global:{},add:function(t,e,n,i,r){var o,s,a,l,u,c,f,h,d,p,g,m=Y.get(t);if(m)for(n.handler&&(n=(o=n).handler,r=o.selector),r&&C.find.matchesSelector(ye,r),n.guid||(n.guid=C.guid++),(l=m.events)||(l=m.events={}),(s=m.handle)||(s=m.handle=function(e){return void 0!==C&&C.event.triggered!==e.type?C.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)d=g=(a=we.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),d&&(f=C.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,f=C.event.special[d]||{},c=C.extend({type:d,origType:g,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&C.expr.match.needsContext.test(r),namespace:p.join(".")},o),(h=l[d])||((h=l[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(d,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),r?h.splice(h.delegateCount++,0,c):h.push(c),C.event.global[d]=!0)},remove:function(e,t,n,i,r){var o,s,a,l,u,c,f,h,d,p,g,m=Y.hasData(e)&&Y.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(H)||[""]).length;u--;)if(d=g=(a=we.exec(t[u])||[])[1],p=(a[2]||"").split(".").sort(),d){for(f=C.event.special[d]||{},h=l[d=(i?f.delegateType:f.bindType)||d]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)c=h[o],!r&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(h.splice(o,1),c.selector&&h.delegateCount--,f.remove&&f.remove.call(e,c));s&&!h.length&&(f.teardown&&!1!==f.teardown.call(e,p,m.handle)||C.removeEvent(e,d,m.handle),delete l[d])}else for(d in l)C.event.remove(e,d+t[u],n,i,!0);C.isEmptyObject(l)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,o,s,a=C.event.fix(e),l=new Array(arguments.length),u=(Y.get(this,"events")||{})[a.type]||[],c=C.event.special[a.type]||{};for(l[0]=a,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,De=/\s*$/g;function Ie(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")&&C(e).children("tbody")[0]||e}function ke(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,i,r,o,s,a,l,u;if(1===t.nodeType){if(Y.hasData(e)&&(o=Y.access(e),s=Y.set(t,o),u=o.events))for(r in delete s.handle,s.events={},u)for(n=0,i=u[r].length;n")},clone:function(e,t,n){var i,r,o,s,a,l,u,c=e.cloneNode(!0),f=C.contains(e.ownerDocument,e);if(!(v.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(s=he(c),i=0,r=(o=he(e)).length;i").prop({charset:n.scriptCharset,src:n.url}).on("load error",r=function(e){i.remove(),r=null,e&&t("error"===e.type?404:200,e.type)}),x.head.appendChild(i[0])},abort:function(){r&&r()}}});var Bt,Ut=[],Kt=/(=)\?(?=&|$)|\?\?/;C.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Ut.pop()||C.expando+"_"+bt++;return this[e]=!0,e}}),C.ajaxPrefilter("json jsonp",function(e,t,n){var i,r,o,s=!1!==e.jsonp&&(Kt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Kt.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return i=e.jsonpCallback=y(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(Kt,"$1"+i):!1!==e.jsonp&&(e.url+=(wt.test(e.url)?"&":"?")+e.jsonp+"="+i),e.converters["script json"]=function(){return o||C.error(i+" was not called"),o[0]},e.dataTypes[0]="json",r=T[i],T[i]=function(){o=arguments},n.always(function(){void 0===r?C(T).removeProp(i):T[i]=r,e[i]&&(e.jsonpCallback=t.jsonpCallback,Ut.push(i)),o&&y(r)&&r(o[0]),o=r=void 0}),"script"}),v.createHTMLDocument=((Bt=x.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Bt.childNodes.length),C.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((i=(t=x.implementation.createHTMLDocument("")).createElement("base")).href=x.location.href,t.head.appendChild(i)):t=x),o=!n&&[],(r=A.exec(e))?[t.createElement(r[1])]:(r=ve([e],t,o),o&&o.length&&C(o).remove(),C.merge([],r.childNodes)));var i,r,o},C.fn.load=function(e,t,n){var i,r,o,s=this,a=e.indexOf(" ");return-1").append(C.parseHTML(e)).find(i):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.pseudos.animated=function(t){return C.grep(C.timers,function(e){return t===e.elem}).length},C.offset={setOffset:function(e,t,n){var i,r,o,s,a,l,u=C.css(e,"position"),c=C(e),f={};"static"===u&&(e.style.position="relative"),a=c.offset(),o=C.css(e,"top"),l=C.css(e,"left"),r=("absolute"===u||"fixed"===u)&&-1<(o+l).indexOf("auto")?(s=(i=c.position()).top,i.left):(s=parseFloat(o)||0,parseFloat(l)||0),y(t)&&(t=t.call(e,n,C.extend({},a))),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+r),"using"in t?t.using.call(e,f):c.css(f)}},C.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){C.offset.setOffset(this,t,e)});var e,n,i=this[0];return i?i.getClientRects().length?(e=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],r={top:0,left:0};if("fixed"===C.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===C.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((r=C(e).offset()).top+=C.css(e,"borderTopWidth",!0),r.left+=C.css(e,"borderLeftWidth",!0))}return{top:t.top-r.top-C.css(i,"marginTop",!0),left:t.left-r.left-C.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===C.css(e,"position");)e=e.offsetParent;return e||ye})}}),C.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,r){var o="pageYOffset"===r;C.fn[t]=function(e){return B(this,function(e,t,n){var i;if(_(e)?i=e:9===e.nodeType&&(i=e.defaultView),void 0===n)return i?i[r]:e[t];i?i.scrollTo(o?i.pageXOffset:n,o?n:i.pageYOffset):e[t]=n},t,e,arguments.length)}}),C.each(["top","left"],function(e,n){C.cssHooks[n]=Me(v.pixelPosition,function(e,t){if(t)return t=Fe(e,n),Pe.test(t)?C(e).position()[n]+"px":t})}),C.each({Height:"height",Width:"width"},function(s,a){C.each({padding:"inner"+s,content:a,"":"outer"+s},function(i,o){C.fn[o]=function(e,t){var n=arguments.length&&(i||"boolean"!=typeof e),r=i||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var i;return _(e)?0===o.indexOf("outer")?e["inner"+s]:e.document.documentElement["client"+s]:9===e.nodeType?(i=e.documentElement,Math.max(e.body["scroll"+s],i["scroll"+s],e.body["offset"+s],i["offset"+s],i["client"+s])):void 0===n?C.css(e,t,r):C.style(e,t,n,r)},a,n?e:void 0,n)}})}),C.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){C.fn[n]=function(e,t){return 0=i.clientWidth&&n>=i.clientHeight}),c=0l[e]&&!i.escapeWithReference&&(n=I(c[t],l[e]-("right"===e?c.width:c.height))),Q({},t,n)}};return u.forEach(function(e){var t=-1===["left","top"].indexOf(e)?"secondary":"primary";c=V({},c,f[t](e))}),e.offsets.popper=c,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,r=e.placement.split("-")[0],o=P,s=-1!==["top","bottom"].indexOf(r),a=s?"right":"bottom",l=s?"left":"top",u=s?"width":"height";return n[a]o(i[a])&&(e.offsets.popper[l]=o(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!A(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var r=e.placement.split("-")[0],o=e.offsets,s=o.popper,a=o.reference,l=-1!==["left","right"].indexOf(r),u=l?"height":"width",c=l?"Top":"Left",f=c.toLowerCase(),h=l?"left":"top",d=l?"bottom":"right",p=T(i)[u];a[d]-ps[d]&&(e.offsets.popper[f]+=a[f]+p-s[d]),e.offsets.popper=w(e.offsets.popper);var g=a[f]+a[u]/2-p/2,m=b(e.instance.popper),v=parseFloat(m["margin"+c],10),y=parseFloat(m["border"+c+"Width"],10),_=g-e.offsets.popper[f]-v-y;return _=k(I(s[u]-p,_),0),e.arrowElement=i,e.offsets.arrow=(Q(n={},f,q(_)),Q(n,h,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,g){if(e(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var m=h(p.instance.popper,p.instance.reference,g.padding,g.boundariesElement,p.positionFixed),v=p.placement.split("-")[0],y=x(v),_=p.placement.split("-")[1]||"",b=[];switch(g.behavior){case G:b=[v,y];break;case J:b=i(v);break;case Z:b=i(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return p;v=p.placement.split("-")[0],y=x(v);var n,i=p.offsets.popper,r=p.offsets.reference,o=P,s="left"===v&&o(i.right)>o(r.left)||"right"===v&&o(i.left)o(r.top)||"bottom"===v&&o(i.top)o(m.right),u=o(i.top)o(m.bottom),f="left"===v&&a||"right"===v&&l||"top"===v&&u||"bottom"===v&&c,h=-1!==["top","bottom"].indexOf(v),d=!!g.flipVariations&&(h&&"start"===_&&a||h&&"end"===_&&l||!h&&"start"===_&&u||!h&&"end"===_&&c);(s||f||d)&&(p.flipped=!0,(s||f)&&(v=b[t+1]),d&&(_="end"===(n=_)?"start":"start"===n?"end":n),p.placement=v+(_?"-"+_:""),p.offsets.popper=V({},p.offsets.popper,C(p.instance.popper,p.offsets.reference,p.placement)),p=S(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,r=i.popper,o=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return r[s?"left":"top"]=o[n]-(a?r[s?"width":"height"]:0),e.placement=x(t),e.offsets.popper=w(r),e}},hide:{order:800,enabled:!0,fn:function(e){if(!A(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=L(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.rightthis._items.length-1||e<0))if(this._isSliding)p(this._element).one(O.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]}},Re="show",Fe={HIDE:"hide"+Ie,HIDDEN:"hidden"+Ie,SHOW:"show"+Ie,SHOWN:"shown"+Ie,INSERTED:"inserted"+Ie,CLICK:"click"+Ie,FOCUSIN:"focusin"+Ie,FOCUSOUT:"focusout"+Ie,MOUSEENTER:"mouseenter"+Ie,MOUSELEAVE:"mouseleave"+Ie},Me="fade",We="show",Be="hover",Ue="focus",Ke=function(){function i(e,t){if(void 0===f)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(We))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=g.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var r=this.getTipElement(),o=g.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&p(r).addClass(Me);var s="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(r).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(r).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new f(this.element,r,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}}),p(r).addClass(We),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var u=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(p(this.tip).hasClass(Me)){var c=g.getTransitionDurationFromElement(this.tip);p(this.tip).one(g.TRANSITION_END,u).emulateTransitionEnd(c)}else u()}},e.hide=function(e){var t=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),r=function(){t._hoverState!==Re&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),p(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(We),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger.click=!1,this._activeTrigger[Ue]=!1,this._activeTrigger[Be]=!1,p(this.tip).hasClass(Me)){var o=g.getTransitionDurationFromElement(n);p(n).one(g.TRANSITION_END,r).emulateTransitionEnd(o)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Oe+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(".tooltip-inner")),this.getTitle()),p(e).removeClass(Me+" "+We)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=De(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:g.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Pe[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if("manual"!==e){var t=e===Be?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Be?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Ue:Be]=!0),p(t.getTipElement()).hasClass(We)||t._hoverState===Re?t._hoverState=Re:(clearTimeout(t._timeout),t._hoverState=Re,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Re&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Ue:Be]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){"out"===t._hoverState&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==Le.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,t,"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),g.typeCheckConfig(Ae,e,this.constructor.DefaultType),e.sanitize&&(e.template=De(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(je);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Me),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(Ne),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(Ne,e)),"string"==typeof n)){if(void 0===e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return qe}},{key:"NAME",get:function(){return Ae}},{key:"DATA_KEY",get:function(){return Ne}},{key:"Event",get:function(){return Fe}},{key:"EVENT_KEY",get:function(){return Ie}},{key:"DefaultType",get:function(){return He}}]),i}();p.fn[Ae]=Ke._jQueryInterface,p.fn[Ae].Constructor=Ke,p.fn[Ae].noConflict=function(){return p.fn[Ae]=ke,Ke._jQueryInterface};var $e="popover",Qe="bs.popover",Ve="."+Qe,ze=p.fn[$e],Ye="bs-popover",Xe=new RegExp("(^|\\s)"+Ye+"\\S+","g"),Ge=l({},Ke.Default,{placement:"right",trigger:"click",content:"",template:''}),Je=l({},Ke.DefaultType,{content:"(string|element|function)"}),Ze={HIDE:"hide"+Ve,HIDDEN:"hidden"+Ve,SHOW:"show"+Ve,SHOWN:"shown"+Ve,INSERTED:"inserted"+Ve,CLICK:"click"+Ve,FOCUSIN:"focusin"+Ve,FOCUSOUT:"focusout"+Ve,MOUSEENTER:"mouseenter"+Ve,MOUSELEAVE:"mouseleave"+Ve},et=function(e){var t,n;function i(){return e.apply(this,arguments)||this}n=e,(t=i).prototype=Object.create(n.prototype),(t.prototype.constructor=t).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ye+"-"+e)},r.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},r.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(".popover-header"),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(".popover-body"),t),e.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Xe);null!==t&&0=this._offsets[r]&&(void 0===this._offsets[r+1]||e li > .active",wt=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(yt)||p(this._element).hasClass("disabled"))){var e,i,t=p(this._element).closest(".nav, .list-group")[0],r=g.getSelectorFromElement(this._element);if(t){var o="UL"===t.nodeName||"OL"===t.nodeName?bt:_t;i=(i=p.makeArray(p(t).find(o)))[i.length-1]}var s=p.Event(vt.HIDE,{relatedTarget:this._element}),a=p.Event(vt.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,t);var l=function(){var e=p.Event(vt.HIDDEN,{relatedTarget:n._element}),t=p.Event(vt.SHOWN,{relatedTarget:i});p(i).trigger(e),p(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){p.removeData(this._element,pt),this._element=null},e._activate=function(e,t,n){var i=this,r=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?p(t).children(_t):p(t).find(bt))[0],o=n&&r&&p(r).hasClass("fade"),s=function(){return i._transitionComplete(e,r,n)};if(r&&o){var a=g.getTransitionDurationFromElement(r);p(r).removeClass("show").one(g.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},e._transitionComplete=function(e,t,n){if(t){p(t).removeClass(yt);var i=p(t.parentNode).find("> .dropdown-menu .active")[0];i&&p(i).removeClass(yt),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(p(e).addClass(yt),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),g.reflow(e),e.classList.contains("fade")&&e.classList.add("show"),e.parentNode&&p(e.parentNode).hasClass("dropdown-menu")){var r=p(e).closest(".dropdown")[0];if(r){var o=[].slice.call(r.querySelectorAll(".dropdown-toggle"));p(o).addClass(yt)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(pt);if(t||(t=new i(this),e.data(pt,t)),"string"==typeof n){if(void 0===t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(vt.CLICK_DATA_API,'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',function(e){e.preventDefault(),wt._jQueryInterface.call(p(this),"show")}),p.fn.tab=wt._jQueryInterface,p.fn.tab.Constructor=wt,p.fn.tab.noConflict=function(){return p.fn.tab=mt,wt._jQueryInterface};var Et="toast",Tt="bs.toast",xt="."+Tt,Ct=p.fn[Et],St={CLICK_DISMISS:"click.dismiss"+xt,HIDE:"hide"+xt,HIDDEN:"hidden"+xt,SHOW:"show"+xt,SHOWN:"shown"+xt},Dt="show",At="showing",Nt={animation:"boolean",autohide:"boolean",delay:"number"},It={animation:!0,autohide:!0,delay:500},kt=function(){function i(e,t){this._element=e,this._config=this._getConfig(t),this._timeout=null,this._setListeners()}var e=i.prototype;return e.show=function(){var e=this;p(this._element).trigger(St.SHOW),this._config.animation&&this._element.classList.add("fade");var t=function(){e._element.classList.remove(At),e._element.classList.add(Dt),p(e._element).trigger(St.SHOWN),e._config.autohide&&e.hide()};if(this._element.classList.remove("hide"),this._element.classList.add(At),this._config.animation){var n=g.getTransitionDurationFromElement(this._element);p(this._element).one(g.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},e.hide=function(e){var t=this;this._element.classList.contains(Dt)&&(p(this._element).trigger(St.HIDE),e?this._close():this._timeout=setTimeout(function(){t._close()},this._config.delay))},e.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Dt)&&this._element.classList.remove(Dt),p(this._element).off(St.CLICK_DISMISS),p.removeData(this._element,Tt),this._element=null,this._config=null},e._getConfig=function(e){return e=l({},It,p(this._element).data(),"object"==typeof e&&e?e:{}),g.typeCheckConfig(Et,e,this.constructor.DefaultType),e},e._setListeners=function(){var e=this;p(this._element).on(St.CLICK_DISMISS,'[data-dismiss="toast"]',function(){return e.hide(!0)})},e._close=function(){var e=this,t=function(){e._element.classList.add("hide"),p(e._element).trigger(St.HIDDEN)};if(this._element.classList.remove(Dt),this._config.animation){var n=g.getTransitionDurationFromElement(this._element);p(this._element).one(g.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(Tt);if(t||(t=new i(this,"object"==typeof n&&n),e.data(Tt,t)),"string"==typeof n){if(void 0===t[n])throw new TypeError('No method named "'+n+'"');t[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Nt}},{key:"Default",get:function(){return It}}]),i}();p.fn[Et]=kt._jQueryInterface,p.fn[Et].Constructor=kt,p.fn[Et].noConflict=function(){return p.fn[Et]=Ct,kt._jQueryInterface},function(){if(void 0===p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=p.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),e.Util=g,e.Alert=c,e.Button=E,e.Carousel=P,e.Collapse=Y,e.Dropdown=ce,e.Modal=Te,e.Popover=et,e.Scrollspy=dt,e.Tab=wt,e.Toast=kt,e.Tooltip=Ke,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/community_server/webroot/js/ensurePassphrase.js b/community_server/webroot/js/ensurePassphrase.js deleted file mode 100644 index e2f7a98bb..000000000 --- a/community_server/webroot/js/ensurePassphrase.js +++ /dev/null @@ -1,1927 +0,0 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],2:[function(require,module,exports){ -(function (setImmediate,clearImmediate){ -var nextTick = require('process/browser.js').nextTick; -var apply = Function.prototype.apply; -var slice = Array.prototype.slice; -var immediateIds = {}; -var nextImmediateId = 0; - -// DOM APIs, for completeness - -exports.setTimeout = function() { - return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); -}; -exports.setInterval = function() { - return new Timeout(apply.call(setInterval, window, arguments), clearInterval); -}; -exports.clearTimeout = -exports.clearInterval = function(timeout) { timeout.close(); }; - -function Timeout(id, clearFn) { - this._id = id; - this._clearFn = clearFn; -} -Timeout.prototype.unref = Timeout.prototype.ref = function() {}; -Timeout.prototype.close = function() { - this._clearFn.call(window, this._id); -}; - -// Does not start the time, just sets up the members needed. -exports.enroll = function(item, msecs) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = msecs; -}; - -exports.unenroll = function(item) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = -1; -}; - -exports._unrefActive = exports.active = function(item) { - clearTimeout(item._idleTimeoutId); - - var msecs = item._idleTimeout; - if (msecs >= 0) { - item._idleTimeoutId = setTimeout(function onTimeout() { - if (item._onTimeout) - item._onTimeout(); - }, msecs); - } -}; - -// That's not how node.js implements it but the exposed api is the same. -exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { - var id = nextImmediateId++; - var args = arguments.length < 2 ? false : slice.call(arguments, 1); - - immediateIds[id] = true; - - nextTick(function onNextTick() { - if (immediateIds[id]) { - // fn.call() is faster so we optimize for the common use-case - // @see http://jsperf.com/call-apply-segu - if (args) { - fn.apply(null, args); - } else { - fn.call(null); - } - // Prevent ids from leaking - exports.clearImmediate(id); - } - }); - - return id; -}; - -exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { - delete immediateIds[id]; -}; -}).call(this,require("timers").setImmediate,require("timers").clearImmediate) -},{"process/browser.js":1,"timers":2}],3:[function(require,module,exports){ -(function (global,setImmediate){ -new function() { - -function Vnode(tag, key, attrs0, children, text, dom) { - return {tag: tag, key: key, attrs: attrs0, children: children, text: text, dom: dom, domSize: undefined, state: {}, events: undefined, instance: undefined, skip: false} -} -Vnode.normalize = function(node) { - if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined) - if (node != null && typeof node !== "object") return Vnode("#", undefined, undefined, node === false ? "" : node, undefined, undefined) - return node -} -Vnode.normalizeChildren = function normalizeChildren(children) { - for (var i = 0; i < children.length; i++) { - children[i] = Vnode.normalize(children[i]) - } - return children -} -var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g -var selectorCache = {} -function hyperscript(selector) { - if (selector == null || typeof selector !== "string" && typeof selector.view !== "function") { - throw Error("The selector must be either a string or a component."); - } - if (typeof selector === "string" && selectorCache[selector] === undefined) { - var match, tag, classes = [], attributes = {} - while (match = selectorParser.exec(selector)) { - var type = match[1], value = match[2] - if (type === "" && value !== "") tag = value - else if (type === "#") attributes.id = value - else if (type === ".") classes.push(value) - else if (match[3][0] === "[") { - var attrValue = match[6] - if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\") - if (match[4] === "class") classes.push(attrValue) - else attributes[match[4]] = attrValue || true - } - } - if (classes.length > 0) attributes.className = classes.join(" ") - selectorCache[selector] = function(attrs, children) { - var hasAttrs = false, childList, text - var className = attrs.className || attrs.class - for (var key in attributes) attrs[key] = attributes[key] - if (className !== undefined) { - if (attrs.class !== undefined) { - attrs.class = undefined - attrs.className = className - } - if (attributes.className !== undefined) attrs.className = attributes.className + " " + className - } - for (var key in attrs) { - if (key !== "key") { - hasAttrs = true - break - } - } - if (Array.isArray(children) && children.length == 1 && children[0] != null && children[0].tag === "#") text = children[0].children - else childList = children - return Vnode(tag || "div", attrs.key, hasAttrs ? attrs : undefined, childList, text, undefined) - } - } - var attrs, children, childrenIndex - if (arguments[1] == null || typeof arguments[1] === "object" && arguments[1].tag === undefined && !Array.isArray(arguments[1])) { - attrs = arguments[1] - childrenIndex = 2 - } - else childrenIndex = 1 - if (arguments.length === childrenIndex + 1) { - children = Array.isArray(arguments[childrenIndex]) ? arguments[childrenIndex] : [arguments[childrenIndex]] - } - else { - children = [] - for (var i = childrenIndex; i < arguments.length; i++) children.push(arguments[i]) - } - if (typeof selector === "string") return selectorCache[selector](attrs || {}, Vnode.normalizeChildren(children)) - return Vnode(selector, attrs && attrs.key, attrs || {}, Vnode.normalizeChildren(children), undefined, undefined) -} -hyperscript.trust = function(html) { - if (html == null) html = "" - return Vnode("<", undefined, undefined, html, undefined, undefined) -} -hyperscript.fragment = function(attrs1, children) { - return Vnode("[", attrs1.key, attrs1, Vnode.normalizeChildren(children), undefined, undefined) -} -var m = hyperscript -/** @constructor */ -var PromisePolyfill = function(executor) { - if (!(this instanceof PromisePolyfill)) throw new Error("Promise must be called with `new`") - if (typeof executor !== "function") throw new TypeError("executor must be a function") - var self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false) - var instance = self._instance = {resolvers: resolvers, rejectors: rejectors} - var callAsync = typeof setImmediate === "function" ? setImmediate : setTimeout - function handler(list, shouldAbsorb) { - return function execute(value) { - var then - try { - if (shouldAbsorb && value != null && (typeof value === "object" || typeof value === "function") && typeof (then = value.then) === "function") { - if (value === self) throw new TypeError("Promise can't be resolved w/ itself") - executeOnce(then.bind(value)) - } - else { - callAsync(function() { - if (!shouldAbsorb && list.length === 0) console.error("Possible unhandled promise rejection:", value) - for (var i = 0; i < list.length; i++) list[i](value) - resolvers.length = 0, rejectors.length = 0 - instance.state = shouldAbsorb - instance.retry = function() {execute(value)} - }) - } - } - catch (e) { - rejectCurrent(e) - } - } - } - function executeOnce(then) { - var runs = 0 - function run(fn) { - return function(value) { - if (runs++ > 0) return - fn(value) - } - } - var onerror = run(rejectCurrent) - try {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)} - } - executeOnce(executor) -} -PromisePolyfill.prototype.then = function(onFulfilled, onRejection) { - var self = this, instance = self._instance - function handle(callback, list, next, state) { - list.push(function(value) { - if (typeof callback !== "function") next(value) - else try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)} - }) - if (typeof instance.retry === "function" && state === instance.state) instance.retry() - } - var resolveNext, rejectNext - var promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject}) - handle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false) - return promise -} -PromisePolyfill.prototype.catch = function(onRejection) { - return this.then(null, onRejection) -} -PromisePolyfill.resolve = function(value) { - if (value instanceof PromisePolyfill) return value - return new PromisePolyfill(function(resolve) {resolve(value)}) -} -PromisePolyfill.reject = function(value) { - return new PromisePolyfill(function(resolve, reject) {reject(value)}) -} -PromisePolyfill.all = function(list) { - return new PromisePolyfill(function(resolve, reject) { - var total = list.length, count = 0, values = [] - if (list.length === 0) resolve([]) - else for (var i = 0; i < list.length; i++) { - (function(i) { - function consume(value) { - count++ - values[i] = value - if (count === total) resolve(values) - } - if (list[i] != null && (typeof list[i] === "object" || typeof list[i] === "function") && typeof list[i].then === "function") { - list[i].then(consume, reject) - } - else consume(list[i]) - })(i) - } - }) -} -PromisePolyfill.race = function(list) { - return new PromisePolyfill(function(resolve, reject) { - for (var i = 0; i < list.length; i++) { - list[i].then(resolve, reject) - } - }) -} -if (typeof window !== "undefined") { - if (typeof window.Promise === "undefined") window.Promise = PromisePolyfill - var PromisePolyfill = window.Promise -} else if (typeof global !== "undefined") { - if (typeof global.Promise === "undefined") global.Promise = PromisePolyfill - var PromisePolyfill = global.Promise -} else { -} -var buildQueryString = function(object) { - if (Object.prototype.toString.call(object) !== "[object Object]") return "" - var args = [] - for (var key0 in object) { - destructure(key0, object[key0]) - } - return args.join("&") - function destructure(key0, value) { - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - destructure(key0 + "[" + i + "]", value[i]) - } - } - else if (Object.prototype.toString.call(value) === "[object Object]") { - for (var i in value) { - destructure(key0 + "[" + i + "]", value[i]) - } - } - else args.push(encodeURIComponent(key0) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")) - } -} -var _8 = function($window, Promise) { - var callbackCount = 0 - var oncompletion - function setCompletionCallback(callback) {oncompletion = callback} - function finalizer() { - var count = 0 - function complete() {if (--count === 0 && typeof oncompletion === "function") oncompletion()} - return function finalize(promise0) { - var then0 = promise0.then - promise0.then = function() { - count++ - var next = then0.apply(promise0, arguments) - next.then(complete, function(e) { - complete() - if (count === 0) throw e - }) - return finalize(next) - } - return promise0 - } - } - function normalize(args, extra) { - if (typeof args === "string") { - var url = args - args = extra || {} - if (args.url == null) args.url = url - } - return args - } - function request(args, extra) { - var finalize = finalizer() - args = normalize(args, extra) - var promise0 = new Promise(function(resolve, reject) { - if (args.method == null) args.method = "GET" - args.method = args.method.toUpperCase() - var useBody = typeof args.useBody === "boolean" ? args.useBody : args.method !== "GET" && args.method !== "TRACE" - if (typeof args.serialize !== "function") args.serialize = typeof FormData !== "undefined" && args.data instanceof FormData ? function(value) {return value} : JSON.stringify - if (typeof args.deserialize !== "function") args.deserialize = deserialize - if (typeof args.extract !== "function") args.extract = extract - args.url = interpolate(args.url, args.data) - if (useBody) args.data = args.serialize(args.data) - else args.url = assemble(args.url, args.data) - var xhr = new $window.XMLHttpRequest() - xhr.open(args.method, args.url, typeof args.async === "boolean" ? args.async : true, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined) - if (args.serialize === JSON.stringify && useBody) { - xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8") - } - if (args.deserialize === deserialize) { - xhr.setRequestHeader("Accept", "application/json, text/*") - } - if (args.withCredentials) xhr.withCredentials = args.withCredentials - for (var key in args.headers) if ({}.hasOwnProperty.call(args.headers, key)) { - xhr.setRequestHeader(key, args.headers[key]) - } - if (typeof args.config === "function") xhr = args.config(xhr, args) || xhr - xhr.onreadystatechange = function() { - // Don't throw errors on xhr.abort(). XMLHttpRequests ends up in a state of - // xhr.status == 0 and xhr.readyState == 4 if aborted after open, but before completion. - if (xhr.status && xhr.readyState === 4) { - try { - var response = (args.extract !== extract) ? args.extract(xhr, args) : args.deserialize(args.extract(xhr, args)) - if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { - resolve(cast(args.type, response)) - } - else { - var error = new Error(xhr.responseText) - for (var key in response) error[key] = response[key] - reject(error) - } - } - catch (e) { - reject(e) - } - } - } - if (useBody && (args.data != null)) xhr.send(args.data) - else xhr.send() - }) - return args.background === true ? promise0 : finalize(promise0) - } - function jsonp(args, extra) { - var finalize = finalizer() - args = normalize(args, extra) - var promise0 = new Promise(function(resolve, reject) { - var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++ - var script = $window.document.createElement("script") - $window[callbackName] = function(data) { - script.parentNode.removeChild(script) - resolve(cast(args.type, data)) - delete $window[callbackName] - } - script.onerror = function() { - script.parentNode.removeChild(script) - reject(new Error("JSONP request failed")) - delete $window[callbackName] - } - if (args.data == null) args.data = {} - args.url = interpolate(args.url, args.data) - args.data[args.callbackKey || "callback"] = callbackName - script.src = assemble(args.url, args.data) - $window.document.documentElement.appendChild(script) - }) - return args.background === true? promise0 : finalize(promise0) - } - function interpolate(url, data) { - if (data == null) return url - var tokens = url.match(/:[^\/]+/gi) || [] - for (var i = 0; i < tokens.length; i++) { - var key = tokens[i].slice(1) - if (data[key] != null) { - url = url.replace(tokens[i], data[key]) - } - } - return url - } - function assemble(url, data) { - var querystring = buildQueryString(data) - if (querystring !== "") { - var prefix = url.indexOf("?") < 0 ? "?" : "&" - url += prefix + querystring - } - return url - } - function deserialize(data) { - try {return data !== "" ? JSON.parse(data) : null} - catch (e) {throw new Error(data)} - } - function extract(xhr) {return xhr.responseText} - function cast(type0, data) { - if (typeof type0 === "function") { - if (Array.isArray(data)) { - for (var i = 0; i < data.length; i++) { - data[i] = new type0(data[i]) - } - } - else return new type0(data) - } - return data - } - return {request: request, jsonp: jsonp, setCompletionCallback: setCompletionCallback} -} -var requestService = _8(window, PromisePolyfill) -var coreRenderer = function($window) { - var $doc = $window.document - var $emptyFragment = $doc.createDocumentFragment() - var onevent - function setEventCallback(callback) {return onevent = callback} - //create - function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) { - for (var i = start; i < end; i++) { - var vnode = vnodes[i] - if (vnode != null) { - insertNode(parent, createNode(vnode, hooks, ns), nextSibling) - } - } - } - function createNode(vnode, hooks, ns) { - var tag = vnode.tag - if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks) - if (typeof tag === "string") { - switch (tag) { - case "#": return createText(vnode) - case "<": return createHTML(vnode) - case "[": return createFragment(vnode, hooks, ns) - default: return createElement(vnode, hooks, ns) - } - } - else return createComponent(vnode, hooks, ns) - } - function createText(vnode) { - return vnode.dom = $doc.createTextNode(vnode.children) - } - function createHTML(vnode) { - var match1 = vnode.children.match(/^\s*?<(\w+)/im) || [] - var parent = {caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup"}[match1[1]] || "div" - var temp = $doc.createElement(parent) - temp.innerHTML = vnode.children - vnode.dom = temp.firstChild - vnode.domSize = temp.childNodes.length - var fragment = $doc.createDocumentFragment() - var child - while (child = temp.firstChild) { - fragment.appendChild(child) - } - return fragment - } - function createFragment(vnode, hooks, ns) { - var fragment = $doc.createDocumentFragment() - if (vnode.children != null) { - var children = vnode.children - createNodes(fragment, children, 0, children.length, hooks, null, ns) - } - vnode.dom = fragment.firstChild - vnode.domSize = fragment.childNodes.length - return fragment - } - function createElement(vnode, hooks, ns) { - var tag = vnode.tag - switch (vnode.tag) { - case "svg": ns = "http://www.w3.org/2000/svg"; break - case "math": ns = "http://www.w3.org/1998/Math/MathML"; break - } - var attrs2 = vnode.attrs - var is = attrs2 && attrs2.is - var element = ns ? - is ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) : - is ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag) - vnode.dom = element - if (attrs2 != null) { - setAttrs(vnode, attrs2, ns) - } - if (vnode.attrs != null && vnode.attrs.contenteditable != null) { - setContentEditable(vnode) - } - else { - if (vnode.text != null) { - if (vnode.text !== "") element.textContent = vnode.text - else vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] - } - if (vnode.children != null) { - var children = vnode.children - createNodes(element, children, 0, children.length, hooks, null, ns) - setLateAttrs(vnode) - } - } - return element - } - function createComponent(vnode, hooks, ns) { - vnode.state = Object.create(vnode.tag) - var view = vnode.tag.view - if (view.reentrantLock != null) return $emptyFragment - view.reentrantLock = true - initLifecycle(vnode.tag, vnode, hooks) - vnode.instance = Vnode.normalize(view.call(vnode.state, vnode)) - view.reentrantLock = null - if (vnode.instance != null) { - if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as arguments") - var element = createNode(vnode.instance, hooks, ns) - vnode.dom = vnode.instance.dom - vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0 - return element - } - else { - vnode.domSize = 0 - return $emptyFragment - } - } - //update - function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) { - if (old === vnodes || old == null && vnodes == null) return - else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined) - else if (vnodes == null) removeNodes(old, 0, old.length, vnodes) - else { - if (old.length === vnodes.length) { - var isUnkeyed = false - for (var i = 0; i < vnodes.length; i++) { - if (vnodes[i] != null && old[i] != null) { - isUnkeyed = vnodes[i].key == null && old[i].key == null - break - } - } - if (isUnkeyed) { - for (var i = 0; i < old.length; i++) { - if (old[i] === vnodes[i]) continue - else if (old[i] == null && vnodes[i] != null) insertNode(parent, createNode(vnodes[i], hooks, ns), getNextSibling(old, i + 1, nextSibling)) - else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes) - else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns) - } - return - } - } - var recycling = isRecyclable(old, vnodes) - if (recycling) old = old.concat(old.pool) - var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map - while (oldEnd >= oldStart && end >= start) { - var o = old[oldStart], v = vnodes[start] - if (o === v && !recycling) oldStart++, start++ - else if (o == null) oldStart++ - else if (v == null) start++ - else if (o.key === v.key) { - oldStart++, start++ - updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), recycling, ns) - if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) - } - else { - var o = old[oldEnd] - if (o === v && !recycling) oldEnd--, start++ - else if (o == null) oldEnd-- - else if (v == null) start++ - else if (o.key === v.key) { - updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) - if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling)) - oldEnd--, start++ - } - else break - } - } - while (oldEnd >= oldStart && end >= start) { - var o = old[oldEnd], v = vnodes[end] - if (o === v && !recycling) oldEnd--, end-- - else if (o == null) oldEnd-- - else if (v == null) end-- - else if (o.key === v.key) { - updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) - if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) - if (o.dom != null) nextSibling = o.dom - oldEnd--, end-- - } - else { - if (!map) map = getKeyMap(old, oldEnd) - if (v != null) { - var oldIndex = map[v.key] - if (oldIndex != null) { - var movable = old[oldIndex] - updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) - insertNode(parent, toFragment(movable), nextSibling) - old[oldIndex].skip = true - if (movable.dom != null) nextSibling = movable.dom - } - else { - var dom = createNode(v, hooks, undefined) - insertNode(parent, dom, nextSibling) - nextSibling = dom - } - } - end-- - } - if (end < start) break - } - createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns) - removeNodes(old, oldStart, oldEnd + 1, vnodes) - } - } - function updateNode(parent, old, vnode, hooks, nextSibling, recycling, ns) { - var oldTag = old.tag, tag = vnode.tag - if (oldTag === tag) { - vnode.state = old.state - vnode.events = old.events - if (shouldUpdate(vnode, old)) return - if (vnode.attrs != null) { - updateLifecycle(vnode.attrs, vnode, hooks, recycling) - } - if (typeof oldTag === "string") { - switch (oldTag) { - case "#": updateText(old, vnode); break - case "<": updateHTML(parent, old, vnode, nextSibling); break - case "[": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break - default: updateElement(old, vnode, hooks, ns) - } - } - else updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) - } - else { - removeNode(old, null) - insertNode(parent, createNode(vnode, hooks, ns), nextSibling) - } - } - function updateText(old, vnode) { - if (old.children.toString() !== vnode.children.toString()) { - old.dom.nodeValue = vnode.children - } - vnode.dom = old.dom - } - function updateHTML(parent, old, vnode, nextSibling) { - if (old.children !== vnode.children) { - toFragment(old) - insertNode(parent, createHTML(vnode), nextSibling) - } - else vnode.dom = old.dom, vnode.domSize = old.domSize - } - function updateFragment(parent, old, vnode, hooks, nextSibling, ns) { - updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns) - var domSize = 0, children = vnode.children - vnode.dom = null - if (children != null) { - for (var i = 0; i < children.length; i++) { - var child = children[i] - if (child != null && child.dom != null) { - if (vnode.dom == null) vnode.dom = child.dom - domSize += child.domSize || 1 - } - } - if (domSize !== 1) vnode.domSize = domSize - } - } - function updateElement(old, vnode, hooks, ns) { - var element = vnode.dom = old.dom - switch (vnode.tag) { - case "svg": ns = "http://www.w3.org/2000/svg"; break - case "math": ns = "http://www.w3.org/1998/Math/MathML"; break - } - if (vnode.tag === "textarea") { - if (vnode.attrs == null) vnode.attrs = {} - if (vnode.text != null) { - vnode.attrs.value = vnode.text //FIXME handle0 multiple children - vnode.text = undefined - } - } - updateAttrs(vnode, old.attrs, vnode.attrs, ns) - if (vnode.attrs != null && vnode.attrs.contenteditable != null) { - setContentEditable(vnode) - } - else if (old.text != null && vnode.text != null && vnode.text !== "") { - if (old.text.toString() !== vnode.text.toString()) old.dom.firstChild.nodeValue = vnode.text - } - else { - if (old.text != null) old.children = [Vnode("#", undefined, undefined, old.text, undefined, old.dom.firstChild)] - if (vnode.text != null) vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] - updateNodes(element, old.children, vnode.children, hooks, null, ns) - } - } - function updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) { - vnode.instance = Vnode.normalize(vnode.tag.view.call(vnode.state, vnode)) - updateLifecycle(vnode.tag, vnode, hooks, recycling) - if (vnode.instance != null) { - if (old.instance == null) insertNode(parent, createNode(vnode.instance, hooks, ns), nextSibling) - else updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, recycling, ns) - vnode.dom = vnode.instance.dom - vnode.domSize = vnode.instance.domSize - } - else if (old.instance != null) { - removeNode(old.instance, null) - vnode.dom = undefined - vnode.domSize = 0 - } - else { - vnode.dom = old.dom - vnode.domSize = old.domSize - } - } - function isRecyclable(old, vnodes) { - if (old.pool != null && Math.abs(old.pool.length - vnodes.length) <= Math.abs(old.length - vnodes.length)) { - var oldChildrenLength = old[0] && old[0].children && old[0].children.length || 0 - var poolChildrenLength = old.pool[0] && old.pool[0].children && old.pool[0].children.length || 0 - var vnodesChildrenLength = vnodes[0] && vnodes[0].children && vnodes[0].children.length || 0 - if (Math.abs(poolChildrenLength - vnodesChildrenLength) <= Math.abs(oldChildrenLength - vnodesChildrenLength)) { - return true - } - } - return false - } - function getKeyMap(vnodes, end) { - var map = {}, i = 0 - for (var i = 0; i < end; i++) { - var vnode = vnodes[i] - if (vnode != null) { - var key2 = vnode.key - if (key2 != null) map[key2] = i - } - } - return map - } - function toFragment(vnode) { - var count0 = vnode.domSize - if (count0 != null || vnode.dom == null) { - var fragment = $doc.createDocumentFragment() - if (count0 > 0) { - var dom = vnode.dom - while (--count0) fragment.appendChild(dom.nextSibling) - fragment.insertBefore(dom, fragment.firstChild) - } - return fragment - } - else return vnode.dom - } - function getNextSibling(vnodes, i, nextSibling) { - for (; i < vnodes.length; i++) { - if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom - } - return nextSibling - } - function insertNode(parent, dom, nextSibling) { - if (nextSibling && nextSibling.parentNode) parent.insertBefore(dom, nextSibling) - else parent.appendChild(dom) - } - function setContentEditable(vnode) { - var children = vnode.children - if (children != null && children.length === 1 && children[0].tag === "<") { - var content = children[0].children - if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content - } - else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted") - } - //remove - function removeNodes(vnodes, start, end, context) { - for (var i = start; i < end; i++) { - var vnode = vnodes[i] - if (vnode != null) { - if (vnode.skip) vnode.skip = false - else removeNode(vnode, context) - } - } - } - function removeNode(vnode, context) { - var expected = 1, called = 0 - if (vnode.attrs && vnode.attrs.onbeforeremove) { - var result = vnode.attrs.onbeforeremove.call(vnode.state, vnode) - if (result != null && typeof result.then === "function") { - expected++ - result.then(continuation, continuation) - } - } - if (typeof vnode.tag !== "string" && vnode.tag.onbeforeremove) { - var result = vnode.tag.onbeforeremove.call(vnode.state, vnode) - if (result != null && typeof result.then === "function") { - expected++ - result.then(continuation, continuation) - } - } - continuation() - function continuation() { - if (++called === expected) { - onremove(vnode) - if (vnode.dom) { - var count0 = vnode.domSize || 1 - if (count0 > 1) { - var dom = vnode.dom - while (--count0) { - removeNodeFromDOM(dom.nextSibling) - } - } - removeNodeFromDOM(vnode.dom) - if (context != null && vnode.domSize == null && !hasIntegrationMethods(vnode.attrs) && typeof vnode.tag === "string") { //TODO test custom elements - if (!context.pool) context.pool = [vnode] - else context.pool.push(vnode) - } - } - } - } - } - function removeNodeFromDOM(node) { - var parent = node.parentNode - if (parent != null) parent.removeChild(node) - } - function onremove(vnode) { - if (vnode.attrs && vnode.attrs.onremove) vnode.attrs.onremove.call(vnode.state, vnode) - if (typeof vnode.tag !== "string" && vnode.tag.onremove) vnode.tag.onremove.call(vnode.state, vnode) - if (vnode.instance != null) onremove(vnode.instance) - else { - var children = vnode.children - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - var child = children[i] - if (child != null) onremove(child) - } - } - } - } - //attrs2 - function setAttrs(vnode, attrs2, ns) { - for (var key2 in attrs2) { - setAttr(vnode, key2, null, attrs2[key2], ns) - } - } - function setAttr(vnode, key2, old, value, ns) { - var element = vnode.dom - if (key2 === "key" || key2 === "is" || (old === value && !isFormAttribute(vnode, key2)) && typeof value !== "object" || typeof value === "undefined" || isLifecycleMethod(key2)) return - var nsLastIndex = key2.indexOf(":") - if (nsLastIndex > -1 && key2.substr(0, nsLastIndex) === "xlink") { - element.setAttributeNS("http://www.w3.org/1999/xlink", key2.slice(nsLastIndex + 1), value) - } - else if (key2[0] === "o" && key2[1] === "n" && typeof value === "function") updateEvent(vnode, key2, value) - else if (key2 === "style") updateStyle(element, old, value) - else if (key2 in element && !isAttribute(key2) && ns === undefined && !isCustomElement(vnode)) { - //setting input[value] to same value by typing on focused element moves cursor to end in Chrome - if (vnode.tag === "input" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return - //setting select[value] to same value while having select open blinks select dropdown in Chrome - if (vnode.tag === "select" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return - //setting option[value] to same value while having select open blinks select dropdown in Chrome - if (vnode.tag === "option" && key2 === "value" && vnode.dom.value === value) return - element[key2] = value - } - else { - if (typeof value === "boolean") { - if (value) element.setAttribute(key2, "") - else element.removeAttribute(key2) - } - else element.setAttribute(key2 === "className" ? "class" : key2, value) - } - } - function setLateAttrs(vnode) { - var attrs2 = vnode.attrs - if (vnode.tag === "select" && attrs2 != null) { - if ("value" in attrs2) setAttr(vnode, "value", null, attrs2.value, undefined) - if ("selectedIndex" in attrs2) setAttr(vnode, "selectedIndex", null, attrs2.selectedIndex, undefined) - } - } - function updateAttrs(vnode, old, attrs2, ns) { - if (attrs2 != null) { - for (var key2 in attrs2) { - setAttr(vnode, key2, old && old[key2], attrs2[key2], ns) - } - } - if (old != null) { - for (var key2 in old) { - if (attrs2 == null || !(key2 in attrs2)) { - if (key2 === "className") key2 = "class" - if (key2[0] === "o" && key2[1] === "n" && !isLifecycleMethod(key2)) updateEvent(vnode, key2, undefined) - else if (key2 !== "key") vnode.dom.removeAttribute(key2) - } - } - } - } - function isFormAttribute(vnode, attr) { - return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === $doc.activeElement - } - function isLifecycleMethod(attr) { - return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate" - } - function isAttribute(attr) { - return attr === "href" || attr === "list" || attr === "form" || attr === "width" || attr === "height"// || attr === "type" - } - function isCustomElement(vnode){ - return vnode.attrs.is || vnode.tag.indexOf("-") > -1 - } - function hasIntegrationMethods(source) { - return source != null && (source.oncreate || source.onupdate || source.onbeforeremove || source.onremove) - } - //style - function updateStyle(element, old, style) { - if (old === style) element.style.cssText = "", old = null - if (style == null) element.style.cssText = "" - else if (typeof style === "string") element.style.cssText = style - else { - if (typeof old === "string") element.style.cssText = "" - for (var key2 in style) { - element.style[key2] = style[key2] - } - if (old != null && typeof old !== "string") { - for (var key2 in old) { - if (!(key2 in style)) element.style[key2] = "" - } - } - } - } - //event - function updateEvent(vnode, key2, value) { - var element = vnode.dom - var callback = typeof onevent !== "function" ? value : function(e) { - var result = value.call(element, e) - onevent.call(element, e) - return result - } - if (key2 in element) element[key2] = typeof value === "function" ? callback : null - else { - var eventName = key2.slice(2) - if (vnode.events === undefined) vnode.events = {} - if (vnode.events[key2] === callback) return - if (vnode.events[key2] != null) element.removeEventListener(eventName, vnode.events[key2], false) - if (typeof value === "function") { - vnode.events[key2] = callback - element.addEventListener(eventName, vnode.events[key2], false) - } - } - } - //lifecycle - function initLifecycle(source, vnode, hooks) { - if (typeof source.oninit === "function") source.oninit.call(vnode.state, vnode) - if (typeof source.oncreate === "function") hooks.push(source.oncreate.bind(vnode.state, vnode)) - } - function updateLifecycle(source, vnode, hooks, recycling) { - if (recycling) initLifecycle(source, vnode, hooks) - else if (typeof source.onupdate === "function") hooks.push(source.onupdate.bind(vnode.state, vnode)) - } - function shouldUpdate(vnode, old) { - var forceVnodeUpdate, forceComponentUpdate - if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") forceVnodeUpdate = vnode.attrs.onbeforeupdate.call(vnode.state, vnode, old) - if (typeof vnode.tag !== "string" && typeof vnode.tag.onbeforeupdate === "function") forceComponentUpdate = vnode.tag.onbeforeupdate.call(vnode.state, vnode, old) - if (!(forceVnodeUpdate === undefined && forceComponentUpdate === undefined) && !forceVnodeUpdate && !forceComponentUpdate) { - vnode.dom = old.dom - vnode.domSize = old.domSize - vnode.instance = old.instance - return true - } - return false - } - function render(dom, vnodes) { - if (!dom) throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.") - var hooks = [] - var active = $doc.activeElement - // First time0 rendering into a node clears it out - if (dom.vnodes == null) dom.textContent = "" - if (!Array.isArray(vnodes)) vnodes = [vnodes] - updateNodes(dom, dom.vnodes, Vnode.normalizeChildren(vnodes), hooks, null, undefined) - dom.vnodes = vnodes - for (var i = 0; i < hooks.length; i++) hooks[i]() - if ($doc.activeElement !== active) active.focus() - } - return {render: render, setEventCallback: setEventCallback} -} -function throttle(callback) { - //60fps translates to 16.6ms, round it down since setTimeout requires int - var time = 16 - var last = 0, pending = null - var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout - return function() { - var now = Date.now() - if (last === 0 || now - last >= time) { - last = now - callback() - } - else if (pending === null) { - pending = timeout(function() { - pending = null - callback() - last = Date.now() - }, time - (now - last)) - } - } -} -var _11 = function($window) { - var renderService = coreRenderer($window) - renderService.setEventCallback(function(e) { - if (e.redraw !== false) redraw() - }) - - var callbacks = [] - function subscribe(key1, callback) { - unsubscribe(key1) - callbacks.push(key1, throttle(callback)) - } - function unsubscribe(key1) { - var index = callbacks.indexOf(key1) - if (index > -1) callbacks.splice(index, 2) - } - function redraw() { - for (var i = 1; i < callbacks.length; i += 2) { - callbacks[i]() - } - } - return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render} -} -var redrawService = _11(window) -requestService.setCompletionCallback(redrawService.redraw) -var _16 = function(redrawService0) { - return function(root, component) { - if (component === null) { - redrawService0.render(root, []) - redrawService0.unsubscribe(root) - return - } - - if (component.view == null) throw new Error("m.mount(element, component) expects a component, not a vnode") - - var run0 = function() { - redrawService0.render(root, Vnode(component)) - } - redrawService0.subscribe(root, run0) - redrawService0.redraw() - } -} -m.mount = _16(redrawService) -var Promise = PromisePolyfill -var parseQueryString = function(string) { - if (string === "" || string == null) return {} - if (string.charAt(0) === "?") string = string.slice(1) - var entries = string.split("&"), data0 = {}, counters = {} - for (var i = 0; i < entries.length; i++) { - var entry = entries[i].split("=") - var key5 = decodeURIComponent(entry[0]) - var value = entry.length === 2 ? decodeURIComponent(entry[1]) : "" - if (value === "true") value = true - else if (value === "false") value = false - var levels = key5.split(/\]\[?|\[/) - var cursor = data0 - if (key5.indexOf("[") > -1) levels.pop() - for (var j = 0; j < levels.length; j++) { - var level = levels[j], nextLevel = levels[j + 1] - var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)) - var isValue = j === levels.length - 1 - if (level === "") { - var key5 = levels.slice(0, j).join() - if (counters[key5] == null) counters[key5] = 0 - level = counters[key5]++ - } - if (cursor[level] == null) { - cursor[level] = isValue ? value : isNumber ? [] : {} - } - cursor = cursor[level] - } - } - return data0 -} -var coreRouter = function($window) { - var supportsPushState = typeof $window.history.pushState === "function" - var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout - function normalize1(fragment0) { - var data = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent) - if (fragment0 === "pathname" && data[0] !== "/") data = "/" + data - return data - } - var asyncId - function debounceAsync(callback0) { - return function() { - if (asyncId != null) return - asyncId = callAsync0(function() { - asyncId = null - callback0() - }) - } - } - function parsePath(path, queryData, hashData) { - var queryIndex = path.indexOf("?") - var hashIndex = path.indexOf("#") - var pathEnd = queryIndex > -1 ? queryIndex : hashIndex > -1 ? hashIndex : path.length - if (queryIndex > -1) { - var queryEnd = hashIndex > -1 ? hashIndex : path.length - var queryParams = parseQueryString(path.slice(queryIndex + 1, queryEnd)) - for (var key4 in queryParams) queryData[key4] = queryParams[key4] - } - if (hashIndex > -1) { - var hashParams = parseQueryString(path.slice(hashIndex + 1)) - for (var key4 in hashParams) hashData[key4] = hashParams[key4] - } - return path.slice(0, pathEnd) - } - var router = {prefix: "#!"} - router.getPath = function() { - var type2 = router.prefix.charAt(0) - switch (type2) { - case "#": return normalize1("hash").slice(router.prefix.length) - case "?": return normalize1("search").slice(router.prefix.length) + normalize1("hash") - default: return normalize1("pathname").slice(router.prefix.length) + normalize1("search") + normalize1("hash") - } - } - router.setPath = function(path, data, options) { - var queryData = {}, hashData = {} - path = parsePath(path, queryData, hashData) - if (data != null) { - for (var key4 in data) queryData[key4] = data[key4] - path = path.replace(/:([^\/]+)/g, function(match2, token) { - delete queryData[token] - return data[token] - }) - } - var query = buildQueryString(queryData) - if (query) path += "?" + query - var hash = buildQueryString(hashData) - if (hash) path += "#" + hash - if (supportsPushState) { - var state = options ? options.state : null - var title = options ? options.title : null - $window.onpopstate() - if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path) - else $window.history.pushState(state, title, router.prefix + path) - } - else $window.location.href = router.prefix + path - } - router.defineRoutes = function(routes, resolve, reject) { - function resolveRoute() { - var path = router.getPath() - var params = {} - var pathname = parsePath(path, params, params) - - var state = $window.history.state - if (state != null) { - for (var k in state) params[k] = state[k] - } - for (var route0 in routes) { - var matcher = new RegExp("^" + route0.replace(/:[^\/]+?\.{3}/g, "(.*?)").replace(/:[^\/]+/g, "([^\\/]+)") + "\/?$") - if (matcher.test(pathname)) { - pathname.replace(matcher, function() { - var keys = route0.match(/:[^\/]+/g) || [] - var values = [].slice.call(arguments, 1, -2) - for (var i = 0; i < keys.length; i++) { - params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i]) - } - resolve(routes[route0], params, path, route0) - }) - return - } - } - reject(path, params) - } - - if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute) - else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute - resolveRoute() - } - - return router -} -var _20 = function($window, redrawService0) { - var routeService = coreRouter($window) - var identity = function(v) {return v} - var render1, component, attrs3, currentPath, lastUpdate - var route = function(root, defaultRoute, routes) { - if (root == null) throw new Error("Ensure the DOM element that was passed to `m.route` is not undefined") - var run1 = function() { - if (render1 != null) redrawService0.render(root, render1(Vnode(component, attrs3.key, attrs3))) - } - var bail = function() { - routeService.setPath(defaultRoute, null, {replace: true}) - } - routeService.defineRoutes(routes, function(payload, params, path) { - var update = lastUpdate = function(routeResolver, comp) { - if (update !== lastUpdate) return - component = comp != null && typeof comp.view === "function" ? comp : "div", attrs3 = params, currentPath = path, lastUpdate = null - render1 = (routeResolver.render || identity).bind(routeResolver) - run1() - } - if (payload.view) update({}, payload) - else { - if (payload.onmatch) { - Promise.resolve(payload.onmatch(params, path)).then(function(resolved) { - update(payload, resolved) - }, bail) - } - else update(payload, "div") - } - }, bail) - redrawService0.subscribe(root, run1) - } - route.set = function(path, data, options) { - if (lastUpdate != null) options = {replace: true} - lastUpdate = null - routeService.setPath(path, data, options) - } - route.get = function() {return currentPath} - route.prefix = function(prefix0) {routeService.prefix = prefix0} - route.link = function(vnode1) { - vnode1.dom.setAttribute("href", routeService.prefix + vnode1.attrs.href) - vnode1.dom.onclick = function(e) { - if (e.ctrlKey || e.metaKey || e.shiftKey || e.which === 2) return - e.preventDefault() - e.redraw = false - var href = this.getAttribute("href") - if (href.indexOf(routeService.prefix) === 0) href = href.slice(routeService.prefix.length) - route.set(href, undefined, undefined) - } - } - route.param = function(key3) { - if(typeof attrs3 !== "undefined" && typeof key3 !== "undefined") return attrs3[key3] - return attrs3 - } - return route -} -m.route = _20(window, redrawService) -m.withAttr = function(attrName, callback1, context) { - return function(e) { - callback1.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName)) - } -} -var _28 = coreRenderer(window) -m.render = _28.render -m.redraw = redrawService.redraw -m.request = requestService.request -m.jsonp = requestService.jsonp -m.parseQueryString = parseQueryString -m.buildQueryString = buildQueryString -m.version = "1.0.0" -m.vnode = Vnode -if (typeof module !== "undefined") module["exports"] = m -else window.m = m -} -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) -},{"timers":2}],4:[function(require,module,exports){ -'use strict'; - -var _mithril = _interopRequireDefault(require("mithril")); - -var _view = _interopRequireDefault(require("./view")); - -var _de = _interopRequireDefault(require("./texte/de")); - -var _en = _interopRequireDefault(require("./texte/en")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function launch() { - //m.mount(window.document.getElementById('canvas'), view) - if (window.language === 'en') { - window.texte = _en["default"]; - } else { - window.texte = _de["default"]; - } - - _mithril["default"].mount(window.document.getElementById('gradido-mithril-passphrase'), _view["default"]); -} // cross browser dom is ready module from: -// https://www.competa.com/blog/cross-browser-document-ready-with-vanilla-javascript/ - - -var domIsReady = function (domIsReady) { - var isBrowserIeOrNot = function isBrowserIeOrNot() { - return !document.attachEvent || typeof document.attachEvent === "undefined" ? 'not-ie' : 'ie'; - }; - - domIsReady = function domIsReady(callback) { - if (callback && typeof callback === 'function') { - if (isBrowserIeOrNot() !== 'ie') { - document.addEventListener("DOMContentLoaded", function () { - return callback(); - }); - } else { - document.attachEvent("onreadystatechange", function () { - if (document.readyState === "complete") { - return callback(); - } - }); - } - } else { - console.error('The callback is not a function!'); - } - }; - - return domIsReady; -}(domIsReady || {}); // DOM ready without jquery, loaded from basic.js -// cross browser dom is ready - - -(function (document, window, domIsReady, undefined) { - domIsReady(function () { - launch(); - }); -})(document, window, domIsReady); - -},{"./texte/de":7,"./texte/en":8,"./view":10,"mithril":3}],5:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _mithril = _interopRequireDefault(require("mithril")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function oninit(vnode) {} - -function view(vnode) { - return (0, _mithril["default"])('div.modal.visible-modal', { - tabindex: '-1', - role: 'dialog' - }, (0, _mithril["default"])('div.modal-dialog', { - role: 'document' - }, (0, _mithril["default"])('div.modal-content', [(0, _mithril["default"])('p.grid-header', vnode.attrs.title), (0, _mithril["default"])('div.modal-body', vnode.attrs.body), (0, _mithril["default"])('div.modal-footer', [(0, _mithril["default"])('button.btn.btn-primary', { - type: 'button', - 'data-dismiss': 'modal', - onclick: vnode.attrs.dismiss - }, 'Ok')])]))); -} - -var _default = { - view: view, - oninit: oninit -}; -exports["default"] = _default; - -},{"mithril":3}],6:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -function getEntities() { - return [['auml', 'ä'], ['ouml', 'ö'], ['uuml', 'ü'], ['Auml', 'Ä'], ['Ouml', 'Ö'], ['Uuml', 'Ü'], ['szlig', 'ß']]; -} - -function decodeHTMLEntities(text) { - var entities = getEntities(); - - for (var i = 0, max = entities.length; i < max; ++i) { - text = text.replace(new RegExp('&' + entities[i][0] + ';', 'g'), entities[i][1]); - } - - return text; -} - -function encodeHTMLEntities(text) { - var entities = getEntities(); - - for (var i = 0, max = entities.length; i < max; ++i) { - //text = text.replace(new RegExp('&'+entities[i][0]+';', 'g'), entities[i][1]); - text = text.replace(new RegExp(entities[i][1], 'g'), '&' + entities[i][0] + ';'); - } - - return text; -} - -var _default = { - decodeHTMLEntities: decodeHTMLEntities, - encodeHTMLEntities: encodeHTMLEntities -}; -exports["default"] = _default; - -},{}],7:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -var _default = { - INVALID_PASSPHRASE: 'Das ist nicht deine Passphrase, Möchtest du nochmal schauen wie sie hieß?', - SHOW_PASSPHRASE: 'Passphrase nochmal anzeigen', - DIALOG_SHOW_PASSPHRASE_TITLE: 'Passphrase', - YES: 'Ja', - NEXT: 'Weiter' -}; -exports["default"] = _default; - -},{}],8:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -var _default = { - INVALID_PASSPHRASE: 'This is not the correct passphrase. This is not your passphrase, would you like to see what its name was again?', - SHOW_PASSPHRASE: 'Show Passphrase again', - DIALOG_SHOW_PASSPHRASE_TITLE: 'Passphrase', - YES: 'Yes', - NEXT: 'Next' -}; -exports["default"] = _default; - -},{}],9:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _mithril = _interopRequireDefault(require("mithril")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -function oninit(vnode) {//vnode.state.disabled = false -} - -function clickHandler(vnode) { - vnode.attrs.addWordCallback(vnode.attrs.word); //vnode.state.disabled = true -} - -function view(vnode) { - var classes = '.btn.btn-sm'; - - if (vnode.attrs.disabled) { - classes += '.disabled'; - return (0, _mithril["default"])('span'); - } else { - if (vnode.attrs.btnColor !== undefined) { - classes += '.' + vnode.attrs.btnColor; - } - } - - return (0, _mithril["default"])('button' + classes, { - type: 'button', - disabled: vnode.attrs.disabled, - onclick: function onclick(e) { - clickHandler(vnode); - } - }, vnode.attrs.word); -} - -var _default = { - view: view, - oninit: oninit -}; -exports["default"] = _default; - -},{"mithril":3}],10:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _mithril = _interopRequireDefault(require("mithril")); - -var _button = _interopRequireDefault(require("./button")); - -var _dialog = _interopRequireDefault(require("../lib/dialog")); - -var _htmlEntities = _interopRequireDefault(require("../lib/htmlEntities")); - -var _passphrase = _interopRequireDefault(require("./passphrase")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function oninit(vnode) { - vnode.state.passphraseIndices = []; - vnode.state.passphraseIndicesSorted = []; - vnode.state.textboxContent = ''; - vnode.state.btnDisableArray = []; - vnode.state.countValidWords = 0; - var passphraseArray = passphrase.split(' '); - - for (var i in passphraseArray) { - var word = passphraseArray[i]; - var index = mnemonicWords.indexOf(word); - - if (-1 === index) { - if (65533 !== word.charCodeAt(0)) { - console.error("invalid index: %o for word: %o", index, word); - } - } else { - vnode.state.passphraseIndices[i] = index; - } - } - - passphraseArray.sort(); - - for (var _i in passphraseArray) { - var _word = passphraseArray[_i]; - - var _index = mnemonicWords.indexOf(_word); - - if (-1 === _index) { - if (65533 !== _word.charCodeAt(0)) { - console.error("invalid index: %o for word: %o", _index, _word); - } - } else { - vnode.state.passphraseIndicesSorted[_i] = _index; - vnode.state.btnDisableArray[_i] = false; - } - } //console.log("Passphrase: %s", passphrase) - //console.log("Passphrase indices: %o", vnode.state.passphraseIndices) - //console.log("Passphrase sorted indices: %o", vnode.state.passphraseIndicesSorted) - - - vnode.state.valid = true; - vnode.state.complete = false; - vnode.state.showPassphrase = false; -} -/* - *
    - - - - - - -
    -
    -
    - -
    -
    - - Weiter - */ - - -function addWordToTextbox(vnode, word) { - if (vnode.state.textboxContent.length > 1 && vnode.state.textboxContent.slice(-1) != ' ') { - vnode.state.textboxContent += ' '; - } - - vnode.state.textboxContent += word; - checkValidationTextbox(vnode); -} - -function onUpdateText(vnode, newContent) { - //console.log("e: %o", newContent.target.value) - vnode.state.textboxContent = newContent.replace(/[^\S ]+/g, ''); - - if (newContent === '') { - vnode.state.valid = true; - } else { - //if(newContent.slice(-1) === ' ') { - //const words = newContent.split(' ') - checkValidationTextbox(vnode); - } //} - -} - -function checkValidationTextbox(vnode) { - //console.log('checkValidationTextbox') - var words = vnode.state.textboxContent.split(' '); - var countValidWords = 0; - vnode.state.valid = true; //console.log("words: %o", words) - - for (var i in vnode.state.btnDisableArray) { - vnode.state.btnDisableArray[i] = false; - } - - for (var _i2 in words) { - var word = _htmlEntities["default"].encodeHTMLEntities(words[_i2]); - - if (word === "") continue; - var index = mnemonicWords.indexOf(word); //console.log("index of word: %o = %o", word, index) - - if (index !== -1) { - if (vnode.state.passphraseIndices[countValidWords] !== index) { - vnode.state.valid = false; - break; - } else { - countValidWords++; - } - - var sortedIndex = vnode.state.passphraseIndicesSorted.indexOf(index); //console.log("sortedIndex: %o", sortedIndex) - - if (-1 !== sortedIndex) { - vnode.state.btnDisableArray[sortedIndex] = true; - } - } - } - - if (countValidWords === vnode.state.passphraseIndices.length) { - vnode.state.complete = true; - } else { - vnode.state.complete = false; - } - - vnode.state.countValidWords = countValidWords; //console.log("count valid words: %o / %o", countValidWords, vnode.state.passphraseIndices.length) -} - -function view(vnode) { - var classes = '.form-control'; - - if (vnode.state.valid === false) { - classes += '.is-invalid'; - } else if (vnode.state.complete) { - classes += '.is-valid'; - } - - var choosenWords = []; - - for (var i = 0; i < vnode.state.countValidWords; i++) { - choosenWords.push(vnode.state.passphraseIndices[i]); - } - - return (0, _mithril["default"])('div', [(0, _mithril["default"])('div.col-md-12.showcase_content_area.mb-0', [vnode.state.passphraseIndicesSorted.map(function (val, i) { - return (0, _mithril["default"])(_button["default"], { - btnColor: 'btn-outline-warning', - word: _htmlEntities["default"].decodeHTMLEntities(mnemonicWords[val]), - addWordCallback: function addWordCallback(word) { - addWordToTextbox(vnode, word); - }, - disabled: vnode.state.btnDisableArray[i] - }); - }), choosenWords.map(function (val) { - return (0, _mithril["default"])('button.btn.btn-sm.btn-outline-success.disabled', { - disabled: true - }, _htmlEntities["default"].decodeHTMLEntities(mnemonicWords[val])); - })]), (0, _mithril["default"])('div.form-group.row-showcase_row_area', (0, _mithril["default"])('div.col-lg-8.col-md-9.mx-auto', [(0, _mithril["default"])('textarea' + classes + '#inputPassphrase', { - name: 'inputPassphrase', - cols: 10, - rows: 5, - value: vnode.state.textboxContent, - onchange: function onchange(e) { - onUpdateText(vnode, e.target.value); - }, - onkeyup: function onkeyup(e) { - onUpdateText(vnode, e.target.value); - }, - onpaste: function onpaste(e) { - onUpdateText(vnode, e.target.value); - } - }), vnode.state.valid === false ? (0, _mithril["default"])('.invalid-feedback', [window.texte.INVALID_PASSPHRASE, (0, _mithril["default"])('button.btn.btn-primary', { - onclick: function onclick() { - vnode.state.showPassphrase = true; - return false; - } - }, [(0, _mithril["default"])('i.mdi.mdi-eye'), (0, _mithril["default"])('span', _mithril["default"].trust(' ')), (0, _mithril["default"])('span', window.texte.SHOW_PASSPHRASE)])]) : null])), //Weiter - //<%= gettext("Ja") %> - vnode.state.complete ? (0, _mithril["default"])('input.btn.btn-sm.btn-success.pull-right', { - name: 'btnChecked', - type: 'submit', - value: window.texte.NEXT - }) : null], vnode.state.showPassphrase === true ? (0, _mithril["default"])(_dialog["default"], { - title: window.texte.DIALOG_SHOW_PASSPHRASE_TITLE, - body: (0, _mithril["default"])(_passphrase["default"]), - dismiss: function dismiss() { - vnode.state.showPassphrase = false; - } - }) : null); -} - -var _default = { - view: view, - oninit: oninit -}; -exports["default"] = _default; - -},{"../lib/dialog":5,"../lib/htmlEntities":6,"./button":9,"./passphrase":11,"mithril":3}],11:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _mithril = _interopRequireDefault(require("mithril")); - -var _htmlEntities = _interopRequireDefault(require("../lib/htmlEntities")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - -/* - *
    -
    Passphrase
    -

    Hallo Miau Das sind Wörter einer Passphrase Miau Hilfe Ich mag dich nicht Abenteuer Haus Zoo Garten Ziegel Tisch Auto Husten Hüpfburg Teezeit

    -
    - * - */ -function oninit(vnode) {//vnode.state.disabled = false -} - -function view(vnode) { - var passphraseString = passphrase; - - if (passphrase.slice(-1).charCodeAt(0) === 65533) { - passphraseString = passphrase.substring(0, passphrase.length - 1); - } - - return (0, _mithril["default"])('.col-lg-8.col-md-10.mx-auto.alert.alert-primary', { - style: { - 'text-align': 'center' - } - }, _htmlEntities["default"].decodeHTMLEntities(passphraseString)); -} - -var _default = { - view: view, - oninit: oninit -}; -exports["default"] = _default; - -},{"../lib/htmlEntities":6,"mithril":3}]},{},[4]); diff --git a/community_server/webroot/js/ensurePassphrase.min.js b/community_server/webroot/js/ensurePassphrase.min.js deleted file mode 100644 index 37ae8461f..000000000 --- a/community_server/webroot/js/ensurePassphrase.min.js +++ /dev/null @@ -1 +0,0 @@ -!function i(a,l,u){function s(t,e){if(!l[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=l[t]={exports:{}};a[t][0].call(o.exports,function(e){return s(a[t][1][e]||e)},o,o.exports,i,a,l,u)}return l[t].exports}for(var c="function"==typeof require&&require,e=0;e(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",l)):Object.assign({},r,((t={})[h]=a?u+"px":"",t[m]=d?e+"px":"",t.transform="",t))}function E(e){return e.replace(/left|right|bottom|top/g,(function(e){return _[e]}))}function D(e){return e.replace(/start|end/g,(function(e){return U[e]}))}function P(e,t){var n=!(!t.getRootNode||!t.getRootNode().host);if(e.contains(t))return!0;if(n)do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function L(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function k(e,o){if("viewport"===o){var a=n(e);e=a.visualViewport,o=a.innerWidth,a=a.innerHeight,e&&/iPhone|iPod|iPad/.test(navigator.platform)&&(o=e.width,a=e.height),e=L({width:o,height:a,x:0,y:0})}else i(o)?e=t(o):(e=n(a=s(e)),o=r(a),(a=u(s(a),e)).height=Math.max(a.height,e.innerHeight),a.width=Math.max(a.width,e.innerWidth),a.x=-o.scrollLeft,a.y=-o.scrollTop,e=L(a));return e}function B(e,t,r){return t="clippingParents"===t?function(e){var t=m(e),n=0<=["absolute","fixed"].indexOf(p(e).position)&&i(e)?v(e):e;return o(n)?t.filter((function(e){return o(e)&&P(e,n)})):[]}(e):[].concat(t),(r=(r=[].concat(t,[r])).reduce((function(t,r){var o=k(e,r),c=n(r=i(r)?r:s(e)),u=i(r)?p(r):{};parseFloat(u.borderTopWidth);var d=parseFloat(u.borderRightWidth)||0,l=parseFloat(u.borderBottomWidth)||0,m=parseFloat(u.borderLeftWidth)||0;u="html"===a(r);var h=f(r),v=r.clientWidth+d,g=r.clientHeight+l;return u&&50m?d:u?c.innerWidth-v-h:r.offsetWidth-v,c=u?c.innerHeight-g:r.offsetHeight-g,r=u?h:r.clientLeft,t.top=Math.max(o.top+l,t.top),t.right=Math.min(o.right-d,t.right),t.bottom=Math.min(o.bottom-c,t.bottom),t.left=Math.max(o.left+r,t.left),t}),k(e,r[0]))).width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}function W(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},{},e)}function A(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function H(e,n){void 0===n&&(n={});var r=n;n=void 0===(n=r.placement)?e.placement:n;var i=r.boundary,a=void 0===i?"clippingParents":i,f=void 0===(i=r.rootBoundary)?"viewport":i;i=void 0===(i=r.elementContext)?"popper":i;var p=r.altBoundary,c=void 0!==p&&p;r=W("number"!=typeof(r=void 0===(r=r.padding)?0:r)?r:A(r,q));var u=e.elements.reference;p=e.rects.popper,a=B(o(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||s(e.elements.popper),a,f),c=M({reference:f=t(u),element:p,strategy:"absolute",placement:n}),p=L(Object.assign({},p,{},c)),f="popper"===i?p:f;var d={top:a.top-f.top+r.top,bottom:f.bottom-a.bottom+r.bottom,left:a.left-f.left+r.left,right:f.right-a.right+r.right};if(e=e.modifiersData.offset,"popper"===i&&e){var l=e[n];Object.keys(d).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";d[e]+=l[n]*t}))}return d}function T(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function R(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var q=["top","bottom","right","left"],S=q.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),C=[].concat(q,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),F="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),N={placement:"bottom",modifiers:[],strategy:"absolute"},V={passive:!0},I={top:"auto",right:"auto",bottom:"auto",left:"auto"},_={left:"right",right:"left",bottom:"top",top:"bottom"},U={start:"end",end:"start"},z=[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,r=e.instance,o=(e=e.options).scroll,i=void 0===o||o,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",r.update,V)})),a&&s.addEventListener("resize",r.update,V),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",r.update,V)})),a&&s.removeEventListener("resize",r.update,V)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=M({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e,n=void 0===(n=n.adaptive)||n,e={placement:y(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,{},j(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,{},j(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];i(o)&&a(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(r)&&a(r)&&(Object.assign(r.style,e),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,r=void 0===(e=e.options.offset)?[0,0]:e,o=(e=C.reduce((function(e,n){var o=t.rects,i=y(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof r?r(Object.assign({},o,{placement:n})):r;return o=(o=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:o}:{x:o,y:s},e[n]=i,e}),{}))[t.placement],i=o.x;o=o.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=o),t.modifiersData[n]=e}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var r=n.mainAxis;r=void 0===r||r;var o=n.altAxis;o=void 0===o||o;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,u=void 0===c||c,d=n.allowedAutoPlacements;c=y(n=t.options.placement),i=i||(c!==n&&u?function(e){if("auto"===y(e))return[];var t=E(e);return[D(e),t,D(t)]}(n):[E(n)]);var l=[n].concat(i).reduce((function(e,n){return e.concat("auto"===y(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,r=t.rootBoundary,o=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?C:a,f=t.placement.split("-")[1],p=(f?i?S:S.filter((function(e){return e.split("-")[1]===f})):q).filter((function(e){return 0<=s.indexOf(e)})).reduce((function(t,i){return t[i]=H(e,{placement:i,boundary:n,rootBoundary:r,padding:o})[y(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:u,allowedAutoPlacements:d}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=l[0],v=0;vi[O]&&(x=E(x)),O=E(x),w=[],r&&w.push(0>=M[b]),o&&w.push(0>=M[x],0>=M[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(r=function(e){var t=l.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},o=u?3:1;0 SECONDS_TO[i]) { - var partIndexName = i.toLowerCase() + 's'; - parts[partIndexName] = Math.floor(parts.seconds / SECONDS_TO[i]); - parts.seconds -= parts[partIndexName] * SECONDS_TO[i]; - if(durationString.length > 0) { - durationString += ', '; - } - var unitName = partIndexName; - if(parts[partIndexName] === 1) { - unitName = partIndexName.substring(0, partIndexName.length-1); - } - durationString += parts[partIndexName] + ' ' + unitName; - break; - } - - } - return durationString; - -} \ No newline at end of file diff --git a/community_server/webroot/js/tippy-bundle.umd.min.js b/community_server/webroot/js/tippy-bundle.umd.min.js deleted file mode 100644 index e0c7b943a..000000000 --- a/community_server/webroot/js/tippy-bundle.umd.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t=t||self).tippy=e(t.Popper)}(this,(function(t){"use strict";var e="undefined"!=typeof window&&"undefined"!=typeof document,n=e?navigator.userAgent:"",i=/MSIE |Trident\//.test(n),r={passive:!0,capture:!0};function o(t,e,n){if(Array.isArray(t)){var i=t[e];return null==i?Array.isArray(n)?n[e]:n:i}return t}function a(t,e){var n={}.toString.call(t);return 0===n.indexOf("[object")&&n.indexOf(e+"]")>-1}function s(t,e){return"function"==typeof t?t.apply(void 0,e):t}function p(t,e){return 0===e?t:function(i){clearTimeout(n),n=setTimeout((function(){t(i)}),e)};var n}function u(t,e){var n=Object.assign({},t);return e.forEach((function(t){delete n[t]})),n}function c(t){return[].concat(t)}function f(t,e){-1===t.indexOf(e)&&t.push(e)}function l(t){return t.split("-")[0]}function d(t){return[].slice.call(t)}function v(){return document.createElement("div")}function m(t){return["Element","Fragment"].some((function(e){return a(t,e)}))}function g(t){return a(t,"MouseEvent")}function h(t){return!(!t||!t._tippy||t._tippy.reference!==t)}function b(t){return m(t)?[t]:function(t){return a(t,"NodeList")}(t)?d(t):Array.isArray(t)?t:d(document.querySelectorAll(t))}function y(t,e){t.forEach((function(t){t&&(t.style.transitionDuration=e+"ms")}))}function x(t,e){t.forEach((function(t){t&&t.setAttribute("data-state",e)}))}function w(t){var e=c(t)[0];return e&&e.ownerDocument||document}function E(t,e,n){var i=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(e){t[i](e,n)}))}var T={isTouch:!1},A=0;function C(){T.isTouch||(T.isTouch=!0,window.performance&&document.addEventListener("mousemove",O))}function O(){var t=performance.now();t-A<20&&(T.isTouch=!1,document.removeEventListener("mousemove",O)),A=t}function L(){var t=document.activeElement;if(h(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}var D=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(D);function M(t){var e=(t.plugins||[]).reduce((function(e,n){var i=n.name,r=n.defaultValue;return i&&(e[i]=void 0!==t[i]?t[i]:r),e}),{});return Object.assign({},t,{},e)}function V(t,e){var n=Object.assign({},e,{content:s(e.content,[t])},e.ignoreAttributes?{}:function(t,e){return(e?Object.keys(M(Object.assign({},D,{plugins:e}))):k).reduce((function(e,n){var i=(t.getAttribute("data-tippy-"+n)||"").trim();if(!i)return e;if("content"===n)e[n]=i;else try{e[n]=JSON.parse(i)}catch(t){e[n]=i}return e}),{})}(t,e.plugins));return n.aria=Object.assign({},D.aria,{},n.aria),n.aria={expanded:"auto"===n.aria.expanded?e.interactive:n.aria.expanded,content:"auto"===n.aria.content?e.interactive?null:"describedby":n.aria.content},n}function R(t,e){t.innerHTML=e}function j(t){var e=v();return!0===t?e.className="tippy-arrow":(e.className="tippy-svg-arrow",m(t)?e.appendChild(t):R(e,t)),e}function P(t,e){m(e.content)?(R(t,""),t.appendChild(e.content)):"function"!=typeof e.content&&(e.allowHTML?R(t,e.content):t.textContent=e.content)}function I(t){var e=t.firstElementChild,n=d(e.children);return{box:e,content:n.find((function(t){return t.classList.contains("tippy-content")})),arrow:n.find((function(t){return t.classList.contains("tippy-arrow")||t.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(t){return t.classList.contains("tippy-backdrop")}))}}function S(t){var e=v(),n=v();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var i=v();function r(n,i){var r=I(e),o=r.box,a=r.content,s=r.arrow;i.theme?o.setAttribute("data-theme",i.theme):o.removeAttribute("data-theme"),"string"==typeof i.animation?o.setAttribute("data-animation",i.animation):o.removeAttribute("data-animation"),i.inertia?o.setAttribute("data-inertia",""):o.removeAttribute("data-inertia"),o.style.maxWidth="number"==typeof i.maxWidth?i.maxWidth+"px":i.maxWidth,i.role?o.setAttribute("role",i.role):o.removeAttribute("role"),n.content===i.content&&n.allowHTML===i.allowHTML||P(a,t.props),i.arrow?s?n.arrow!==i.arrow&&(o.removeChild(s),o.appendChild(j(i.arrow))):o.appendChild(j(i.arrow)):s&&o.removeChild(s)}return i.className="tippy-content",i.setAttribute("data-state","hidden"),P(i,t.props),e.appendChild(n),n.appendChild(i),r(t.props,t.props),{popper:e,onUpdate:r}}S.$$tippy=!0;var B=1,H=[],U=[];function N(e,n){var a,u,m,h,b,A,C,O,L=V(e,Object.assign({},D,{},M(n))),k=!1,R=!1,j=!1,P=!1,S=[],N=p(ht,L.interactiveDebounce),X=w(L.triggerTarget||e),Y=B++,_=(O=L.plugins).filter((function(t,e){return O.indexOf(t)===e})),z={id:Y,reference:e,popper:v(),popperInstance:null,props:L,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:_,clearDelayTimeouts:function(){clearTimeout(a),clearTimeout(u),cancelAnimationFrame(m)},setProps:function(t){if(z.state.isDestroyed)return;it("onBeforeUpdate",[z,t]),mt();var n=z.props,i=V(e,Object.assign({},z.props,{},t,{ignoreAttributes:!0}));z.props=i,vt(),n.interactiveDebounce!==i.interactiveDebounce&&(at(),N=p(ht,i.interactiveDebounce));n.triggerTarget&&!i.triggerTarget?c(n.triggerTarget).forEach((function(t){t.removeAttribute("aria-expanded")})):i.triggerTarget&&e.removeAttribute("aria-expanded");ot(),nt(),q&&q(n,i);z.popperInstance&&(wt(),Tt().forEach((function(t){requestAnimationFrame(t._tippy.popperInstance.forceUpdate)})));it("onAfterUpdate",[z,t])},setContent:function(t){z.setProps({content:t})},show:function(){var t=z.state.isVisible,e=z.state.isDestroyed,n=!z.state.isEnabled,i=T.isTouch&&!z.props.touch,r=o(z.props.duration,0,D.duration);if(t||e||n||i)return;if(Z().hasAttribute("disabled"))return;if(it("onShow",[z],!1),!1===z.props.onShow(z))return;z.state.isVisible=!0,Q()&&(W.style.visibility="visible");nt(),ct(),z.state.isMounted||(W.style.transition="none");if(Q()){var a=tt(),p=a.box,u=a.content;y([p,u],0)}A=function(){if(z.state.isVisible&&!P){if(P=!0,W.offsetHeight,W.style.transition=z.props.moveTransition,Q()&&z.props.animation){var t=tt(),e=t.box,n=t.content;y([e,n],r),x([e,n],"visible")}rt(),ot(),f(U,z),z.state.isMounted=!0,it("onMount",[z]),z.props.animation&&Q()&&function(t,e){lt(t,e)}(r,(function(){z.state.isShown=!0,it("onShown",[z])}))}},function(){var t,e=z.props.appendTo,n=Z();t=z.props.interactive&&e===D.appendTo||"parent"===e?n.parentNode:s(e,[n]);t.contains(W)||t.appendChild(W);wt()}()},hide:function(){var t=!z.state.isVisible,e=z.state.isDestroyed,n=!z.state.isEnabled,i=o(z.props.duration,1,D.duration);if(t||e||n)return;if(it("onHide",[z],!1),!1===z.props.onHide(z))return;z.state.isVisible=!1,z.state.isShown=!1,P=!1,Q()&&(W.style.visibility="hidden");if(at(),ft(),nt(),Q()){var r=tt(),a=r.box,s=r.content;z.props.animation&&(y([a,s],i),x([a,s],"hidden"))}rt(),ot(),z.props.animation?Q()&&function(t,e){lt(t,(function(){!z.state.isVisible&&W.parentNode&&W.parentNode.contains(W)&&e()}))}(i,z.unmount):z.unmount()},hideWithInteractivity:function(t){X.body.addEventListener("mouseleave",Ct),X.addEventListener("mousemove",N),f(H,N),N(t)},enable:function(){z.state.isEnabled=!0},disable:function(){z.hide(),z.state.isEnabled=!1},unmount:function(){z.state.isVisible&&z.hide();if(!z.state.isMounted)return;Et(),Tt().forEach((function(t){t._tippy.unmount()})),W.parentNode&&W.parentNode.removeChild(W);U=U.filter((function(t){return t!==z})),z.state.isMounted=!1,it("onHidden",[z])},destroy:function(){if(z.state.isDestroyed)return;z.clearDelayTimeouts(),z.unmount(),mt(),delete e._tippy,z.state.isDestroyed=!0,it("onDestroy",[z])}};if(!L.render)return z;var F=L.render(z),W=F.popper,q=F.onUpdate;W.setAttribute("data-tippy-root",""),W.id="tippy-"+z.id,z.popper=W,e._tippy=z,W._tippy=z;var $=_.map((function(t){return t.fn(z)})),J=e.hasAttribute("aria-expanded");return vt(),ot(),nt(),it("onCreate",[z]),L.showOnCreate&&At(),W.addEventListener("mouseenter",(function(){z.props.interactive&&z.state.isVisible&&z.clearDelayTimeouts()})),W.addEventListener("mouseleave",(function(t){z.props.interactive&&z.props.trigger.indexOf("mouseenter")>=0&&(X.addEventListener("mousemove",N),N(t))})),z;function G(){var t=z.props.touch;return Array.isArray(t)?t:[t,0]}function K(){return"hold"===G()[0]}function Q(){var t;return!!(null==(t=z.props.render)?void 0:t.$$tippy)}function Z(){return C||e}function tt(){return I(W)}function et(t){return z.state.isMounted&&!z.state.isVisible||T.isTouch||h&&"focus"===h.type?0:o(z.props.delay,t?0:1,D.delay)}function nt(){W.style.pointerEvents=z.props.interactive&&z.state.isVisible?"":"none",W.style.zIndex=""+z.props.zIndex}function it(t,e,n){var i;(void 0===n&&(n=!0),$.forEach((function(n){n[t]&&n[t].apply(void 0,e)})),n)&&(i=z.props)[t].apply(i,e)}function rt(){var t=z.props.aria;if(t.content){var n="aria-"+t.content,i=W.id;c(z.props.triggerTarget||e).forEach((function(t){var e=t.getAttribute(n);if(z.state.isVisible)t.setAttribute(n,e?e+" "+i:i);else{var r=e&&e.replace(i,"").trim();r?t.setAttribute(n,r):t.removeAttribute(n)}}))}}function ot(){!J&&z.props.aria.expanded&&c(z.props.triggerTarget||e).forEach((function(t){z.props.interactive?t.setAttribute("aria-expanded",z.state.isVisible&&t===Z()?"true":"false"):t.removeAttribute("aria-expanded")}))}function at(){X.body.removeEventListener("mouseleave",Ct),X.removeEventListener("mousemove",N),H=H.filter((function(t){return t!==N}))}function st(t){if(!(T.isTouch&&(j||"mousedown"===t.type)||z.props.interactive&&W.contains(t.target))){if(Z().contains(t.target)){if(T.isTouch)return;if(z.state.isVisible&&z.props.trigger.indexOf("click")>=0)return}else it("onClickOutside",[z,t]);!0===z.props.hideOnClick&&(k=!1,z.clearDelayTimeouts(),z.hide(),R=!0,setTimeout((function(){R=!1})),z.state.isMounted||ft())}}function pt(){j=!0}function ut(){j=!1}function ct(){X.addEventListener("mousedown",st,!0),X.addEventListener("touchend",st,r),X.addEventListener("touchstart",ut,r),X.addEventListener("touchmove",pt,r)}function ft(){X.removeEventListener("mousedown",st,!0),X.removeEventListener("touchend",st,r),X.removeEventListener("touchstart",ut,r),X.removeEventListener("touchmove",pt,r)}function lt(t,e){var n=tt().box;function i(t){t.target===n&&(E(n,"remove",i),e())}if(0===t)return e();E(n,"remove",b),E(n,"add",i),b=i}function dt(t,n,i){void 0===i&&(i=!1),c(z.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,i),S.push({node:e,eventType:t,handler:n,options:i})}))}function vt(){var t;K()&&(dt("touchstart",gt,{passive:!0}),dt("touchend",bt,{passive:!0})),(t=z.props.trigger,t.split(/\s+/).filter(Boolean)).forEach((function(t){if("manual"!==t)switch(dt(t,gt),t){case"mouseenter":dt("mouseleave",bt);break;case"focus":dt(i?"focusout":"blur",yt);break;case"focusin":dt("focusout",yt)}}))}function mt(){S.forEach((function(t){var e=t.node,n=t.eventType,i=t.handler,r=t.options;e.removeEventListener(n,i,r)})),S=[]}function gt(t){var e,n=!1;if(z.state.isEnabled&&!xt(t)&&!R){var i="focus"===(null==(e=h)?void 0:e.type);h=t,C=t.currentTarget,ot(),!z.state.isVisible&&g(t)&&H.forEach((function(e){return e(t)})),"click"===t.type&&(z.props.trigger.indexOf("mouseenter")<0||k)&&!1!==z.props.hideOnClick&&z.state.isVisible?n=!0:At(t),"click"===t.type&&(k=!n),n&&!i&&Ct(t)}}function ht(t){var n=t.target,i=e.contains(n)||W.contains(n);"mousemove"===t.type&&i||function(t,e){var n=e.clientX,i=e.clientY;return t.every((function(t){var e=t.popperRect,r=t.popperState,o=t.props.interactiveBorder,a=l(r.placement),s=r.modifiersData.offset;if(!s)return!0;var p="bottom"===a?s.top.y:0,u="top"===a?s.bottom.y:0,c="right"===a?s.left.x:0,f="left"===a?s.right.x:0,d=e.top-i+p>o,v=i-e.bottom-u>o,m=e.left-n+c>o,g=n-e.right-f>o;return d||v||m||g}))}(Tt().concat(W).map((function(t){var e,n=null==(e=t._tippy.popperInstance)?void 0:e.state;return n?{popperRect:t.getBoundingClientRect(),popperState:n,props:L}:null})).filter(Boolean),t)&&(at(),Ct(t))}function bt(t){xt(t)||z.props.trigger.indexOf("click")>=0&&k||(z.props.interactive?z.hideWithInteractivity(t):Ct(t))}function yt(t){z.props.trigger.indexOf("focusin")<0&&t.target!==Z()||z.props.interactive&&t.relatedTarget&&W.contains(t.relatedTarget)||Ct(t)}function xt(t){return!!T.isTouch&&K()!==t.type.indexOf("touch")>=0}function wt(){Et();var n=z.props,i=n.popperOptions,r=n.placement,o=n.offset,a=n.getReferenceClientRect,s=n.moveTransition,p=Q()?I(W).arrow:null,u=a?{getBoundingClientRect:a,contextElement:a.contextElement||Z()}:e,c=[{name:"offset",options:{offset:o}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(t){var e=t.state;if(Q()){var n=tt().box;["placement","reference-hidden","escaped"].forEach((function(t){"placement"===t?n.setAttribute("data-placement",e.placement):e.attributes.popper["data-popper-"+t]?n.setAttribute("data-"+t,""):n.removeAttribute("data-"+t)})),e.attributes.popper={}}}}];Q()&&p&&c.push({name:"arrow",options:{element:p,padding:3}}),c.push.apply(c,(null==i?void 0:i.modifiers)||[]),z.popperInstance=t.createPopper(u,W,Object.assign({},i,{placement:r,onFirstUpdate:A,modifiers:c}))}function Et(){z.popperInstance&&(z.popperInstance.destroy(),z.popperInstance=null)}function Tt(){return d(W.querySelectorAll("[data-tippy-root]"))}function At(t){z.clearDelayTimeouts(),t&&it("onTrigger",[z,t]),ct();var e=et(!0),n=G(),i=n[0],r=n[1];T.isTouch&&"hold"===i&&r&&(e=r),e?a=setTimeout((function(){z.show()}),e):z.show()}function Ct(t){if(z.clearDelayTimeouts(),it("onUntrigger",[z,t]),z.state.isVisible){if(!(z.props.trigger.indexOf("mouseenter")>=0&&z.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(t.type)>=0&&k)){var e=et(!1);e?u=setTimeout((function(){z.state.isVisible&&z.hide()}),e):m=requestAnimationFrame((function(){z.hide()}))}}else ft()}}function X(t,e){void 0===e&&(e={});var n=D.plugins.concat(e.plugins||[]);document.addEventListener("touchstart",C,r),window.addEventListener("blur",L);var i=Object.assign({},e,{plugins:n}),o=b(t).reduce((function(t,e){var n=e&&N(e,i);return n&&t.push(n),t}),[]);return m(t)?o[0]:o}X.defaultProps=D,X.setDefaultProps=function(t){Object.keys(t).forEach((function(e){D[e]=t[e]}))},X.currentInput=T;var Y={mouseover:"mouseenter",focusin:"focus",click:"click"};var _={name:"animateFill",defaultValue:!1,fn:function(t){var e;if(!(null==(e=t.props.render)?void 0:e.$$tippy))return{};var n=I(t.popper),i=n.box,r=n.content,o=t.props.animateFill?function(){var t=v();return t.className="tippy-backdrop",x([t],"hidden"),t}():null;return{onCreate:function(){o&&(i.insertBefore(o,i.firstElementChild),i.setAttribute("data-animatefill",""),i.style.overflow="hidden",t.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(o){var t=i.style.transitionDuration,e=Number(t.replace("ms",""));r.style.transitionDelay=Math.round(e/10)+"ms",o.style.transitionDuration=t,x([o],"visible")}},onShow:function(){o&&(o.style.transitionDuration="0ms")},onHide:function(){o&&x([o],"hidden")}}}};var z={name:"followCursor",defaultValue:!1,fn:function(t){var e=t.reference,n=w(t.props.triggerTarget||e),i=null;function r(){return"manual"===t.props.trigger.trim()}function o(){var e=!!r()||null!==i&&!(0===i.clientX&&0===i.clientY);return t.props.followCursor&&e}function a(e){e&&t.setProps({getReferenceClientRect:null})}function s(){o()?n.addEventListener("mousemove",u):a(t.props.followCursor)}function p(){n.removeEventListener("mousemove",u)}function u(n){i={clientX:n.clientX,clientY:n.clientY};var r=!n.target||e.contains(n.target),o=t.props.followCursor,a=n.clientX,s=n.clientY,u=e.getBoundingClientRect(),c=a-u.left,f=s-u.top;!r&&t.props.interactive||t.setProps({getReferenceClientRect:function(){var t=e.getBoundingClientRect(),n=a,i=s;"initial"===o&&(n=t.left+c,i=t.top+f);var r="horizontal"===o?t.top:i,p="vertical"===o?t.right:n,u="horizontal"===o?t.bottom:i,l="vertical"===o?t.left:n;return{width:p-l,height:u-r,top:r,right:p,bottom:u,left:l}}}),(T.isTouch||"initial"===t.props.followCursor&&t.state.isVisible)&&p()}return{onAfterUpdate:function(t,e){var n=e.followCursor;void 0===n||n||a(!0)},onMount:function(){o()&&u(i)},onShow:function(){r()&&(i={clientX:0,clientY:0},s())},onTrigger:function(t,e){i||(g(e)&&(i={clientX:e.clientX,clientY:e.clientY}),s())},onUntrigger:function(){t.state.isVisible||(p(),i=null)},onHidden:function(){p(),i=null}}}};var F={name:"inlinePositioning",defaultValue:!1,fn:function(t){var e,n=t.reference;var i=-1,r=!1,o={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(r){var o=r.state;t.props.inlinePositioning&&(e!==o.placement&&t.setProps({getReferenceClientRect:function(){return function(t){return function(t,e,n,i){if(n.length<2||null===t)return e;if(2===n.length&&i>=0&&n[0].left>n[1].right)return n[i]||e;switch(t){case"top":case"bottom":var r=n[0],o=n[n.length-1],a="top"===t,s=r.top,p=o.bottom,u=a?r.left:o.left,c=a?r.right:o.right;return{top:s,bottom:p,left:u,right:c,width:c-u,height:p-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(t){return t.left}))),l=Math.max.apply(Math,n.map((function(t){return t.right}))),d=n.filter((function(e){return"left"===t?e.left===f:e.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return e}}(l(t),n.getBoundingClientRect(),d(n.getClientRects()),i)}(o.placement)}}),e=o.placement)}};function a(){var e;r||(e=function(t,e){var n;return{popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat(((null==(n=t.popperOptions)?void 0:n.modifiers)||[]).filter((function(t){return t.name!==e.name})),[e])})}}(t.props,o),r=!0,t.setProps(e),r=!1)}return{onCreate:a,onAfterUpdate:a,onTrigger:function(e,n){if(g(n)){var r=d(t.reference.getClientRects()),o=r.find((function(t){return t.left-2<=n.clientX&&t.right+2>=n.clientX&&t.top-2<=n.clientY&&t.bottom+2>=n.clientY}));i=r.indexOf(o)}},onUntrigger:function(){i=-1}}}};var W={name:"sticky",defaultValue:!1,fn:function(t){var e=t.reference,n=t.popper;function i(e){return!0===t.props.sticky||t.props.sticky===e}var r=null,o=null;function a(){var s=i("reference")?(t.popperInstance?t.popperInstance.state.elements.reference:e).getBoundingClientRect():null,p=i("popper")?n.getBoundingClientRect():null;(s&&q(r,s)||p&&q(o,p))&&t.popperInstance&&t.popperInstance.update(),r=s,o=p,t.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){t.props.sticky&&a()}}}};function q(t,e){return!t||!e||(t.top!==e.top||t.right!==e.right||t.bottom!==e.bottom||t.left!==e.left)}return e&&function(t){var e=document.createElement("style");e.textContent=t,e.setAttribute("data-tippy-stylesheet","");var n=document.head,i=document.querySelector("head>style,head>link");i?n.insertBefore(e,i):n.appendChild(e)}('.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}'),X.setDefaultProps({plugins:[_,z,F,W],render:S}),X.createSingleton=function(t,e){void 0===e&&(e={});var n,i=t,r=[],o=e.overrides;function a(){r=i.map((function(t){return t.reference}))}function s(t){i.forEach((function(e){t?e.enable():e.disable()}))}s(!1),a();var p={fn:function(){return{onDestroy:function(){s(!0)},onTrigger:function(t,e){var a=e.currentTarget,s=r.indexOf(a);if(a!==n){n=a;var p=(o||[]).concat("content").reduce((function(t,e){return t[e]=i[s].props[e],t}),{});t.setProps(Object.assign({},p,{getReferenceClientRect:function(){return a.getBoundingClientRect()}}))}}}}},c=X(v(),Object.assign({},u(e,["overrides"]),{plugins:[p].concat(e.plugins||[]),triggerTarget:r})),f=c.setProps;return c.setProps=function(t){o=t.overrides||o,f(t)},c.setInstances=function(t){s(!0),i=t,s(!1),a(),c.setProps({triggerTarget:r})},c},X.delegate=function(t,e){var n=[],i=[],r=e.target,o=u(e,["target"]),a=Object.assign({},o,{trigger:"manual",touch:!1}),s=Object.assign({},o,{showOnCreate:!0}),p=X(t,a);function f(t){if(t.target){var n=t.target.closest(r);if(n){var o=n.getAttribute("data-tippy-trigger")||e.trigger||D.trigger;if(!n._tippy&&!("touchstart"===t.type&&"boolean"==typeof s.touch||"touchstart"!==t.type&&o.indexOf(Y[t.type]))){var a=X(n,s);a&&(i=i.concat(a))}}}}function l(t,e,i,r){void 0===r&&(r=!1),t.addEventListener(e,i,r),n.push({node:t,eventType:e,handler:i,options:r})}return c(p).forEach((function(t){var e=t.destroy;t.destroy=function(t){void 0===t&&(t=!0),t&&i.forEach((function(t){t.destroy()})),i=[],n.forEach((function(t){var e=t.node,n=t.eventType,i=t.handler,r=t.options;e.removeEventListener(n,i,r)})),n=[],e()},function(t){var e=t.reference;l(e,"touchstart",f),l(e,"mouseover",f),l(e,"focusin",f),l(e,"click",f)}(t)})),p},X.hideAll=function(t){var e=void 0===t?{}:t,n=e.exclude,i=e.duration;U.forEach((function(t){var e=!1;if(n&&(e=h(n)?t.reference===n:t.popper===n.popper),!e){var r=t.props.duration;t.setProps({duration:i}),t.hide(),t.state.isDestroyed||t.setProps({duration:r})}}))},X.roundArrow='',X})); -//# sourceMappingURL=tippy-bundle.umd.min.js.map diff --git a/community_server/webroot/js/userSearch.js b/community_server/webroot/js/userSearch.js deleted file mode 100644 index 993c05ab0..000000000 --- a/community_server/webroot/js/userSearch.js +++ /dev/null @@ -1,9185 +0,0 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],2:[function(require,module,exports){ -(function (setImmediate,clearImmediate){(function (){ -var nextTick = require('process/browser.js').nextTick; -var apply = Function.prototype.apply; -var slice = Array.prototype.slice; -var immediateIds = {}; -var nextImmediateId = 0; - -// DOM APIs, for completeness - -exports.setTimeout = function() { - return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); -}; -exports.setInterval = function() { - return new Timeout(apply.call(setInterval, window, arguments), clearInterval); -}; -exports.clearTimeout = -exports.clearInterval = function(timeout) { timeout.close(); }; - -function Timeout(id, clearFn) { - this._id = id; - this._clearFn = clearFn; -} -Timeout.prototype.unref = Timeout.prototype.ref = function() {}; -Timeout.prototype.close = function() { - this._clearFn.call(window, this._id); -}; - -// Does not start the time, just sets up the members needed. -exports.enroll = function(item, msecs) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = msecs; -}; - -exports.unenroll = function(item) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = -1; -}; - -exports._unrefActive = exports.active = function(item) { - clearTimeout(item._idleTimeoutId); - - var msecs = item._idleTimeout; - if (msecs >= 0) { - item._idleTimeoutId = setTimeout(function onTimeout() { - if (item._onTimeout) - item._onTimeout(); - }, msecs); - } -}; - -// That's not how node.js implements it but the exposed api is the same. -exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { - var id = nextImmediateId++; - var args = arguments.length < 2 ? false : slice.call(arguments, 1); - - immediateIds[id] = true; - - nextTick(function onNextTick() { - if (immediateIds[id]) { - // fn.call() is faster so we optimize for the common use-case - // @see http://jsperf.com/call-apply-segu - if (args) { - fn.apply(null, args); - } else { - fn.call(null); - } - // Prevent ids from leaking - exports.clearImmediate(id); - } - }); - - return id; -}; - -exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { - delete immediateIds[id]; -}; -}).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate) -},{"process/browser.js":1,"timers":2}],3:[function(require,module,exports){ -(function (global,setImmediate){(function (){ -new function() { - -function Vnode(tag, key, attrs0, children, text, dom) { - return {tag: tag, key: key, attrs: attrs0, children: children, text: text, dom: dom, domSize: undefined, state: {}, events: undefined, instance: undefined, skip: false} -} -Vnode.normalize = function(node) { - if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined) - if (node != null && typeof node !== "object") return Vnode("#", undefined, undefined, node === false ? "" : node, undefined, undefined) - return node -} -Vnode.normalizeChildren = function normalizeChildren(children) { - for (var i = 0; i < children.length; i++) { - children[i] = Vnode.normalize(children[i]) - } - return children -} -var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g -var selectorCache = {} -function hyperscript(selector) { - if (selector == null || typeof selector !== "string" && typeof selector.view !== "function") { - throw Error("The selector must be either a string or a component."); - } - if (typeof selector === "string" && selectorCache[selector] === undefined) { - var match, tag, classes = [], attributes = {} - while (match = selectorParser.exec(selector)) { - var type = match[1], value = match[2] - if (type === "" && value !== "") tag = value - else if (type === "#") attributes.id = value - else if (type === ".") classes.push(value) - else if (match[3][0] === "[") { - var attrValue = match[6] - if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\") - if (match[4] === "class") classes.push(attrValue) - else attributes[match[4]] = attrValue || true - } - } - if (classes.length > 0) attributes.className = classes.join(" ") - selectorCache[selector] = function(attrs, children) { - var hasAttrs = false, childList, text - var className = attrs.className || attrs.class - for (var key in attributes) attrs[key] = attributes[key] - if (className !== undefined) { - if (attrs.class !== undefined) { - attrs.class = undefined - attrs.className = className - } - if (attributes.className !== undefined) attrs.className = attributes.className + " " + className - } - for (var key in attrs) { - if (key !== "key") { - hasAttrs = true - break - } - } - if (Array.isArray(children) && children.length == 1 && children[0] != null && children[0].tag === "#") text = children[0].children - else childList = children - return Vnode(tag || "div", attrs.key, hasAttrs ? attrs : undefined, childList, text, undefined) - } - } - var attrs, children, childrenIndex - if (arguments[1] == null || typeof arguments[1] === "object" && arguments[1].tag === undefined && !Array.isArray(arguments[1])) { - attrs = arguments[1] - childrenIndex = 2 - } - else childrenIndex = 1 - if (arguments.length === childrenIndex + 1) { - children = Array.isArray(arguments[childrenIndex]) ? arguments[childrenIndex] : [arguments[childrenIndex]] - } - else { - children = [] - for (var i = childrenIndex; i < arguments.length; i++) children.push(arguments[i]) - } - if (typeof selector === "string") return selectorCache[selector](attrs || {}, Vnode.normalizeChildren(children)) - return Vnode(selector, attrs && attrs.key, attrs || {}, Vnode.normalizeChildren(children), undefined, undefined) -} -hyperscript.trust = function(html) { - if (html == null) html = "" - return Vnode("<", undefined, undefined, html, undefined, undefined) -} -hyperscript.fragment = function(attrs1, children) { - return Vnode("[", attrs1.key, attrs1, Vnode.normalizeChildren(children), undefined, undefined) -} -var m = hyperscript -/** @constructor */ -var PromisePolyfill = function(executor) { - if (!(this instanceof PromisePolyfill)) throw new Error("Promise must be called with `new`") - if (typeof executor !== "function") throw new TypeError("executor must be a function") - var self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false) - var instance = self._instance = {resolvers: resolvers, rejectors: rejectors} - var callAsync = typeof setImmediate === "function" ? setImmediate : setTimeout - function handler(list, shouldAbsorb) { - return function execute(value) { - var then - try { - if (shouldAbsorb && value != null && (typeof value === "object" || typeof value === "function") && typeof (then = value.then) === "function") { - if (value === self) throw new TypeError("Promise can't be resolved w/ itself") - executeOnce(then.bind(value)) - } - else { - callAsync(function() { - if (!shouldAbsorb && list.length === 0) console.error("Possible unhandled promise rejection:", value) - for (var i = 0; i < list.length; i++) list[i](value) - resolvers.length = 0, rejectors.length = 0 - instance.state = shouldAbsorb - instance.retry = function() {execute(value)} - }) - } - } - catch (e) { - rejectCurrent(e) - } - } - } - function executeOnce(then) { - var runs = 0 - function run(fn) { - return function(value) { - if (runs++ > 0) return - fn(value) - } - } - var onerror = run(rejectCurrent) - try {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)} - } - executeOnce(executor) -} -PromisePolyfill.prototype.then = function(onFulfilled, onRejection) { - var self = this, instance = self._instance - function handle(callback, list, next, state) { - list.push(function(value) { - if (typeof callback !== "function") next(value) - else try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)} - }) - if (typeof instance.retry === "function" && state === instance.state) instance.retry() - } - var resolveNext, rejectNext - var promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject}) - handle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false) - return promise -} -PromisePolyfill.prototype.catch = function(onRejection) { - return this.then(null, onRejection) -} -PromisePolyfill.resolve = function(value) { - if (value instanceof PromisePolyfill) return value - return new PromisePolyfill(function(resolve) {resolve(value)}) -} -PromisePolyfill.reject = function(value) { - return new PromisePolyfill(function(resolve, reject) {reject(value)}) -} -PromisePolyfill.all = function(list) { - return new PromisePolyfill(function(resolve, reject) { - var total = list.length, count = 0, values = [] - if (list.length === 0) resolve([]) - else for (var i = 0; i < list.length; i++) { - (function(i) { - function consume(value) { - count++ - values[i] = value - if (count === total) resolve(values) - } - if (list[i] != null && (typeof list[i] === "object" || typeof list[i] === "function") && typeof list[i].then === "function") { - list[i].then(consume, reject) - } - else consume(list[i]) - })(i) - } - }) -} -PromisePolyfill.race = function(list) { - return new PromisePolyfill(function(resolve, reject) { - for (var i = 0; i < list.length; i++) { - list[i].then(resolve, reject) - } - }) -} -if (typeof window !== "undefined") { - if (typeof window.Promise === "undefined") window.Promise = PromisePolyfill - var PromisePolyfill = window.Promise -} else if (typeof global !== "undefined") { - if (typeof global.Promise === "undefined") global.Promise = PromisePolyfill - var PromisePolyfill = global.Promise -} else { -} -var buildQueryString = function(object) { - if (Object.prototype.toString.call(object) !== "[object Object]") return "" - var args = [] - for (var key0 in object) { - destructure(key0, object[key0]) - } - return args.join("&") - function destructure(key0, value) { - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - destructure(key0 + "[" + i + "]", value[i]) - } - } - else if (Object.prototype.toString.call(value) === "[object Object]") { - for (var i in value) { - destructure(key0 + "[" + i + "]", value[i]) - } - } - else args.push(encodeURIComponent(key0) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")) - } -} -var _8 = function($window, Promise) { - var callbackCount = 0 - var oncompletion - function setCompletionCallback(callback) {oncompletion = callback} - function finalizer() { - var count = 0 - function complete() {if (--count === 0 && typeof oncompletion === "function") oncompletion()} - return function finalize(promise0) { - var then0 = promise0.then - promise0.then = function() { - count++ - var next = then0.apply(promise0, arguments) - next.then(complete, function(e) { - complete() - if (count === 0) throw e - }) - return finalize(next) - } - return promise0 - } - } - function normalize(args, extra) { - if (typeof args === "string") { - var url = args - args = extra || {} - if (args.url == null) args.url = url - } - return args - } - function request(args, extra) { - var finalize = finalizer() - args = normalize(args, extra) - var promise0 = new Promise(function(resolve, reject) { - if (args.method == null) args.method = "GET" - args.method = args.method.toUpperCase() - var useBody = typeof args.useBody === "boolean" ? args.useBody : args.method !== "GET" && args.method !== "TRACE" - if (typeof args.serialize !== "function") args.serialize = typeof FormData !== "undefined" && args.data instanceof FormData ? function(value) {return value} : JSON.stringify - if (typeof args.deserialize !== "function") args.deserialize = deserialize - if (typeof args.extract !== "function") args.extract = extract - args.url = interpolate(args.url, args.data) - if (useBody) args.data = args.serialize(args.data) - else args.url = assemble(args.url, args.data) - var xhr = new $window.XMLHttpRequest() - xhr.open(args.method, args.url, typeof args.async === "boolean" ? args.async : true, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined) - if (args.serialize === JSON.stringify && useBody) { - xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8") - } - if (args.deserialize === deserialize) { - xhr.setRequestHeader("Accept", "application/json, text/*") - } - if (args.withCredentials) xhr.withCredentials = args.withCredentials - for (var key in args.headers) if ({}.hasOwnProperty.call(args.headers, key)) { - xhr.setRequestHeader(key, args.headers[key]) - } - if (typeof args.config === "function") xhr = args.config(xhr, args) || xhr - xhr.onreadystatechange = function() { - // Don't throw errors on xhr.abort(). XMLHttpRequests ends up in a state of - // xhr.status == 0 and xhr.readyState == 4 if aborted after open, but before completion. - if (xhr.status && xhr.readyState === 4) { - try { - var response = (args.extract !== extract) ? args.extract(xhr, args) : args.deserialize(args.extract(xhr, args)) - if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { - resolve(cast(args.type, response)) - } - else { - var error = new Error(xhr.responseText) - for (var key in response) error[key] = response[key] - reject(error) - } - } - catch (e) { - reject(e) - } - } - } - if (useBody && (args.data != null)) xhr.send(args.data) - else xhr.send() - }) - return args.background === true ? promise0 : finalize(promise0) - } - function jsonp(args, extra) { - var finalize = finalizer() - args = normalize(args, extra) - var promise0 = new Promise(function(resolve, reject) { - var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++ - var script = $window.document.createElement("script") - $window[callbackName] = function(data) { - script.parentNode.removeChild(script) - resolve(cast(args.type, data)) - delete $window[callbackName] - } - script.onerror = function() { - script.parentNode.removeChild(script) - reject(new Error("JSONP request failed")) - delete $window[callbackName] - } - if (args.data == null) args.data = {} - args.url = interpolate(args.url, args.data) - args.data[args.callbackKey || "callback"] = callbackName - script.src = assemble(args.url, args.data) - $window.document.documentElement.appendChild(script) - }) - return args.background === true? promise0 : finalize(promise0) - } - function interpolate(url, data) { - if (data == null) return url - var tokens = url.match(/:[^\/]+/gi) || [] - for (var i = 0; i < tokens.length; i++) { - var key = tokens[i].slice(1) - if (data[key] != null) { - url = url.replace(tokens[i], data[key]) - } - } - return url - } - function assemble(url, data) { - var querystring = buildQueryString(data) - if (querystring !== "") { - var prefix = url.indexOf("?") < 0 ? "?" : "&" - url += prefix + querystring - } - return url - } - function deserialize(data) { - try {return data !== "" ? JSON.parse(data) : null} - catch (e) {throw new Error(data)} - } - function extract(xhr) {return xhr.responseText} - function cast(type0, data) { - if (typeof type0 === "function") { - if (Array.isArray(data)) { - for (var i = 0; i < data.length; i++) { - data[i] = new type0(data[i]) - } - } - else return new type0(data) - } - return data - } - return {request: request, jsonp: jsonp, setCompletionCallback: setCompletionCallback} -} -var requestService = _8(window, PromisePolyfill) -var coreRenderer = function($window) { - var $doc = $window.document - var $emptyFragment = $doc.createDocumentFragment() - var onevent - function setEventCallback(callback) {return onevent = callback} - //create - function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) { - for (var i = start; i < end; i++) { - var vnode = vnodes[i] - if (vnode != null) { - insertNode(parent, createNode(vnode, hooks, ns), nextSibling) - } - } - } - function createNode(vnode, hooks, ns) { - var tag = vnode.tag - if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks) - if (typeof tag === "string") { - switch (tag) { - case "#": return createText(vnode) - case "<": return createHTML(vnode) - case "[": return createFragment(vnode, hooks, ns) - default: return createElement(vnode, hooks, ns) - } - } - else return createComponent(vnode, hooks, ns) - } - function createText(vnode) { - return vnode.dom = $doc.createTextNode(vnode.children) - } - function createHTML(vnode) { - var match1 = vnode.children.match(/^\s*?<(\w+)/im) || [] - var parent = {caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup"}[match1[1]] || "div" - var temp = $doc.createElement(parent) - temp.innerHTML = vnode.children - vnode.dom = temp.firstChild - vnode.domSize = temp.childNodes.length - var fragment = $doc.createDocumentFragment() - var child - while (child = temp.firstChild) { - fragment.appendChild(child) - } - return fragment - } - function createFragment(vnode, hooks, ns) { - var fragment = $doc.createDocumentFragment() - if (vnode.children != null) { - var children = vnode.children - createNodes(fragment, children, 0, children.length, hooks, null, ns) - } - vnode.dom = fragment.firstChild - vnode.domSize = fragment.childNodes.length - return fragment - } - function createElement(vnode, hooks, ns) { - var tag = vnode.tag - switch (vnode.tag) { - case "svg": ns = "http://www.w3.org/2000/svg"; break - case "math": ns = "http://www.w3.org/1998/Math/MathML"; break - } - var attrs2 = vnode.attrs - var is = attrs2 && attrs2.is - var element = ns ? - is ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) : - is ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag) - vnode.dom = element - if (attrs2 != null) { - setAttrs(vnode, attrs2, ns) - } - if (vnode.attrs != null && vnode.attrs.contenteditable != null) { - setContentEditable(vnode) - } - else { - if (vnode.text != null) { - if (vnode.text !== "") element.textContent = vnode.text - else vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] - } - if (vnode.children != null) { - var children = vnode.children - createNodes(element, children, 0, children.length, hooks, null, ns) - setLateAttrs(vnode) - } - } - return element - } - function createComponent(vnode, hooks, ns) { - vnode.state = Object.create(vnode.tag) - var view = vnode.tag.view - if (view.reentrantLock != null) return $emptyFragment - view.reentrantLock = true - initLifecycle(vnode.tag, vnode, hooks) - vnode.instance = Vnode.normalize(view.call(vnode.state, vnode)) - view.reentrantLock = null - if (vnode.instance != null) { - if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as arguments") - var element = createNode(vnode.instance, hooks, ns) - vnode.dom = vnode.instance.dom - vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0 - return element - } - else { - vnode.domSize = 0 - return $emptyFragment - } - } - //update - function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) { - if (old === vnodes || old == null && vnodes == null) return - else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined) - else if (vnodes == null) removeNodes(old, 0, old.length, vnodes) - else { - if (old.length === vnodes.length) { - var isUnkeyed = false - for (var i = 0; i < vnodes.length; i++) { - if (vnodes[i] != null && old[i] != null) { - isUnkeyed = vnodes[i].key == null && old[i].key == null - break - } - } - if (isUnkeyed) { - for (var i = 0; i < old.length; i++) { - if (old[i] === vnodes[i]) continue - else if (old[i] == null && vnodes[i] != null) insertNode(parent, createNode(vnodes[i], hooks, ns), getNextSibling(old, i + 1, nextSibling)) - else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes) - else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), false, ns) - } - return - } - } - var recycling = isRecyclable(old, vnodes) - if (recycling) old = old.concat(old.pool) - var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map - while (oldEnd >= oldStart && end >= start) { - var o = old[oldStart], v = vnodes[start] - if (o === v && !recycling) oldStart++, start++ - else if (o == null) oldStart++ - else if (v == null) start++ - else if (o.key === v.key) { - oldStart++, start++ - updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), recycling, ns) - if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) - } - else { - var o = old[oldEnd] - if (o === v && !recycling) oldEnd--, start++ - else if (o == null) oldEnd-- - else if (v == null) start++ - else if (o.key === v.key) { - updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) - if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling)) - oldEnd--, start++ - } - else break - } - } - while (oldEnd >= oldStart && end >= start) { - var o = old[oldEnd], v = vnodes[end] - if (o === v && !recycling) oldEnd--, end-- - else if (o == null) oldEnd-- - else if (v == null) end-- - else if (o.key === v.key) { - updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) - if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling) - if (o.dom != null) nextSibling = o.dom - oldEnd--, end-- - } - else { - if (!map) map = getKeyMap(old, oldEnd) - if (v != null) { - var oldIndex = map[v.key] - if (oldIndex != null) { - var movable = old[oldIndex] - updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns) - insertNode(parent, toFragment(movable), nextSibling) - old[oldIndex].skip = true - if (movable.dom != null) nextSibling = movable.dom - } - else { - var dom = createNode(v, hooks, undefined) - insertNode(parent, dom, nextSibling) - nextSibling = dom - } - } - end-- - } - if (end < start) break - } - createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns) - removeNodes(old, oldStart, oldEnd + 1, vnodes) - } - } - function updateNode(parent, old, vnode, hooks, nextSibling, recycling, ns) { - var oldTag = old.tag, tag = vnode.tag - if (oldTag === tag) { - vnode.state = old.state - vnode.events = old.events - if (shouldUpdate(vnode, old)) return - if (vnode.attrs != null) { - updateLifecycle(vnode.attrs, vnode, hooks, recycling) - } - if (typeof oldTag === "string") { - switch (oldTag) { - case "#": updateText(old, vnode); break - case "<": updateHTML(parent, old, vnode, nextSibling); break - case "[": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break - default: updateElement(old, vnode, hooks, ns) - } - } - else updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) - } - else { - removeNode(old, null) - insertNode(parent, createNode(vnode, hooks, ns), nextSibling) - } - } - function updateText(old, vnode) { - if (old.children.toString() !== vnode.children.toString()) { - old.dom.nodeValue = vnode.children - } - vnode.dom = old.dom - } - function updateHTML(parent, old, vnode, nextSibling) { - if (old.children !== vnode.children) { - toFragment(old) - insertNode(parent, createHTML(vnode), nextSibling) - } - else vnode.dom = old.dom, vnode.domSize = old.domSize - } - function updateFragment(parent, old, vnode, hooks, nextSibling, ns) { - updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns) - var domSize = 0, children = vnode.children - vnode.dom = null - if (children != null) { - for (var i = 0; i < children.length; i++) { - var child = children[i] - if (child != null && child.dom != null) { - if (vnode.dom == null) vnode.dom = child.dom - domSize += child.domSize || 1 - } - } - if (domSize !== 1) vnode.domSize = domSize - } - } - function updateElement(old, vnode, hooks, ns) { - var element = vnode.dom = old.dom - switch (vnode.tag) { - case "svg": ns = "http://www.w3.org/2000/svg"; break - case "math": ns = "http://www.w3.org/1998/Math/MathML"; break - } - if (vnode.tag === "textarea") { - if (vnode.attrs == null) vnode.attrs = {} - if (vnode.text != null) { - vnode.attrs.value = vnode.text //FIXME handle0 multiple children - vnode.text = undefined - } - } - updateAttrs(vnode, old.attrs, vnode.attrs, ns) - if (vnode.attrs != null && vnode.attrs.contenteditable != null) { - setContentEditable(vnode) - } - else if (old.text != null && vnode.text != null && vnode.text !== "") { - if (old.text.toString() !== vnode.text.toString()) old.dom.firstChild.nodeValue = vnode.text - } - else { - if (old.text != null) old.children = [Vnode("#", undefined, undefined, old.text, undefined, old.dom.firstChild)] - if (vnode.text != null) vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)] - updateNodes(element, old.children, vnode.children, hooks, null, ns) - } - } - function updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) { - vnode.instance = Vnode.normalize(vnode.tag.view.call(vnode.state, vnode)) - updateLifecycle(vnode.tag, vnode, hooks, recycling) - if (vnode.instance != null) { - if (old.instance == null) insertNode(parent, createNode(vnode.instance, hooks, ns), nextSibling) - else updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, recycling, ns) - vnode.dom = vnode.instance.dom - vnode.domSize = vnode.instance.domSize - } - else if (old.instance != null) { - removeNode(old.instance, null) - vnode.dom = undefined - vnode.domSize = 0 - } - else { - vnode.dom = old.dom - vnode.domSize = old.domSize - } - } - function isRecyclable(old, vnodes) { - if (old.pool != null && Math.abs(old.pool.length - vnodes.length) <= Math.abs(old.length - vnodes.length)) { - var oldChildrenLength = old[0] && old[0].children && old[0].children.length || 0 - var poolChildrenLength = old.pool[0] && old.pool[0].children && old.pool[0].children.length || 0 - var vnodesChildrenLength = vnodes[0] && vnodes[0].children && vnodes[0].children.length || 0 - if (Math.abs(poolChildrenLength - vnodesChildrenLength) <= Math.abs(oldChildrenLength - vnodesChildrenLength)) { - return true - } - } - return false - } - function getKeyMap(vnodes, end) { - var map = {}, i = 0 - for (var i = 0; i < end; i++) { - var vnode = vnodes[i] - if (vnode != null) { - var key2 = vnode.key - if (key2 != null) map[key2] = i - } - } - return map - } - function toFragment(vnode) { - var count0 = vnode.domSize - if (count0 != null || vnode.dom == null) { - var fragment = $doc.createDocumentFragment() - if (count0 > 0) { - var dom = vnode.dom - while (--count0) fragment.appendChild(dom.nextSibling) - fragment.insertBefore(dom, fragment.firstChild) - } - return fragment - } - else return vnode.dom - } - function getNextSibling(vnodes, i, nextSibling) { - for (; i < vnodes.length; i++) { - if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom - } - return nextSibling - } - function insertNode(parent, dom, nextSibling) { - if (nextSibling && nextSibling.parentNode) parent.insertBefore(dom, nextSibling) - else parent.appendChild(dom) - } - function setContentEditable(vnode) { - var children = vnode.children - if (children != null && children.length === 1 && children[0].tag === "<") { - var content = children[0].children - if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content - } - else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted") - } - //remove - function removeNodes(vnodes, start, end, context) { - for (var i = start; i < end; i++) { - var vnode = vnodes[i] - if (vnode != null) { - if (vnode.skip) vnode.skip = false - else removeNode(vnode, context) - } - } - } - function removeNode(vnode, context) { - var expected = 1, called = 0 - if (vnode.attrs && vnode.attrs.onbeforeremove) { - var result = vnode.attrs.onbeforeremove.call(vnode.state, vnode) - if (result != null && typeof result.then === "function") { - expected++ - result.then(continuation, continuation) - } - } - if (typeof vnode.tag !== "string" && vnode.tag.onbeforeremove) { - var result = vnode.tag.onbeforeremove.call(vnode.state, vnode) - if (result != null && typeof result.then === "function") { - expected++ - result.then(continuation, continuation) - } - } - continuation() - function continuation() { - if (++called === expected) { - onremove(vnode) - if (vnode.dom) { - var count0 = vnode.domSize || 1 - if (count0 > 1) { - var dom = vnode.dom - while (--count0) { - removeNodeFromDOM(dom.nextSibling) - } - } - removeNodeFromDOM(vnode.dom) - if (context != null && vnode.domSize == null && !hasIntegrationMethods(vnode.attrs) && typeof vnode.tag === "string") { //TODO test custom elements - if (!context.pool) context.pool = [vnode] - else context.pool.push(vnode) - } - } - } - } - } - function removeNodeFromDOM(node) { - var parent = node.parentNode - if (parent != null) parent.removeChild(node) - } - function onremove(vnode) { - if (vnode.attrs && vnode.attrs.onremove) vnode.attrs.onremove.call(vnode.state, vnode) - if (typeof vnode.tag !== "string" && vnode.tag.onremove) vnode.tag.onremove.call(vnode.state, vnode) - if (vnode.instance != null) onremove(vnode.instance) - else { - var children = vnode.children - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - var child = children[i] - if (child != null) onremove(child) - } - } - } - } - //attrs2 - function setAttrs(vnode, attrs2, ns) { - for (var key2 in attrs2) { - setAttr(vnode, key2, null, attrs2[key2], ns) - } - } - function setAttr(vnode, key2, old, value, ns) { - var element = vnode.dom - if (key2 === "key" || key2 === "is" || (old === value && !isFormAttribute(vnode, key2)) && typeof value !== "object" || typeof value === "undefined" || isLifecycleMethod(key2)) return - var nsLastIndex = key2.indexOf(":") - if (nsLastIndex > -1 && key2.substr(0, nsLastIndex) === "xlink") { - element.setAttributeNS("http://www.w3.org/1999/xlink", key2.slice(nsLastIndex + 1), value) - } - else if (key2[0] === "o" && key2[1] === "n" && typeof value === "function") updateEvent(vnode, key2, value) - else if (key2 === "style") updateStyle(element, old, value) - else if (key2 in element && !isAttribute(key2) && ns === undefined && !isCustomElement(vnode)) { - //setting input[value] to same value by typing on focused element moves cursor to end in Chrome - if (vnode.tag === "input" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return - //setting select[value] to same value while having select open blinks select dropdown in Chrome - if (vnode.tag === "select" && key2 === "value" && vnode.dom.value === value && vnode.dom === $doc.activeElement) return - //setting option[value] to same value while having select open blinks select dropdown in Chrome - if (vnode.tag === "option" && key2 === "value" && vnode.dom.value === value) return - element[key2] = value - } - else { - if (typeof value === "boolean") { - if (value) element.setAttribute(key2, "") - else element.removeAttribute(key2) - } - else element.setAttribute(key2 === "className" ? "class" : key2, value) - } - } - function setLateAttrs(vnode) { - var attrs2 = vnode.attrs - if (vnode.tag === "select" && attrs2 != null) { - if ("value" in attrs2) setAttr(vnode, "value", null, attrs2.value, undefined) - if ("selectedIndex" in attrs2) setAttr(vnode, "selectedIndex", null, attrs2.selectedIndex, undefined) - } - } - function updateAttrs(vnode, old, attrs2, ns) { - if (attrs2 != null) { - for (var key2 in attrs2) { - setAttr(vnode, key2, old && old[key2], attrs2[key2], ns) - } - } - if (old != null) { - for (var key2 in old) { - if (attrs2 == null || !(key2 in attrs2)) { - if (key2 === "className") key2 = "class" - if (key2[0] === "o" && key2[1] === "n" && !isLifecycleMethod(key2)) updateEvent(vnode, key2, undefined) - else if (key2 !== "key") vnode.dom.removeAttribute(key2) - } - } - } - } - function isFormAttribute(vnode, attr) { - return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === $doc.activeElement - } - function isLifecycleMethod(attr) { - return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate" - } - function isAttribute(attr) { - return attr === "href" || attr === "list" || attr === "form" || attr === "width" || attr === "height"// || attr === "type" - } - function isCustomElement(vnode){ - return vnode.attrs.is || vnode.tag.indexOf("-") > -1 - } - function hasIntegrationMethods(source) { - return source != null && (source.oncreate || source.onupdate || source.onbeforeremove || source.onremove) - } - //style - function updateStyle(element, old, style) { - if (old === style) element.style.cssText = "", old = null - if (style == null) element.style.cssText = "" - else if (typeof style === "string") element.style.cssText = style - else { - if (typeof old === "string") element.style.cssText = "" - for (var key2 in style) { - element.style[key2] = style[key2] - } - if (old != null && typeof old !== "string") { - for (var key2 in old) { - if (!(key2 in style)) element.style[key2] = "" - } - } - } - } - //event - function updateEvent(vnode, key2, value) { - var element = vnode.dom - var callback = typeof onevent !== "function" ? value : function(e) { - var result = value.call(element, e) - onevent.call(element, e) - return result - } - if (key2 in element) element[key2] = typeof value === "function" ? callback : null - else { - var eventName = key2.slice(2) - if (vnode.events === undefined) vnode.events = {} - if (vnode.events[key2] === callback) return - if (vnode.events[key2] != null) element.removeEventListener(eventName, vnode.events[key2], false) - if (typeof value === "function") { - vnode.events[key2] = callback - element.addEventListener(eventName, vnode.events[key2], false) - } - } - } - //lifecycle - function initLifecycle(source, vnode, hooks) { - if (typeof source.oninit === "function") source.oninit.call(vnode.state, vnode) - if (typeof source.oncreate === "function") hooks.push(source.oncreate.bind(vnode.state, vnode)) - } - function updateLifecycle(source, vnode, hooks, recycling) { - if (recycling) initLifecycle(source, vnode, hooks) - else if (typeof source.onupdate === "function") hooks.push(source.onupdate.bind(vnode.state, vnode)) - } - function shouldUpdate(vnode, old) { - var forceVnodeUpdate, forceComponentUpdate - if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") forceVnodeUpdate = vnode.attrs.onbeforeupdate.call(vnode.state, vnode, old) - if (typeof vnode.tag !== "string" && typeof vnode.tag.onbeforeupdate === "function") forceComponentUpdate = vnode.tag.onbeforeupdate.call(vnode.state, vnode, old) - if (!(forceVnodeUpdate === undefined && forceComponentUpdate === undefined) && !forceVnodeUpdate && !forceComponentUpdate) { - vnode.dom = old.dom - vnode.domSize = old.domSize - vnode.instance = old.instance - return true - } - return false - } - function render(dom, vnodes) { - if (!dom) throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.") - var hooks = [] - var active = $doc.activeElement - // First time0 rendering into a node clears it out - if (dom.vnodes == null) dom.textContent = "" - if (!Array.isArray(vnodes)) vnodes = [vnodes] - updateNodes(dom, dom.vnodes, Vnode.normalizeChildren(vnodes), hooks, null, undefined) - dom.vnodes = vnodes - for (var i = 0; i < hooks.length; i++) hooks[i]() - if ($doc.activeElement !== active) active.focus() - } - return {render: render, setEventCallback: setEventCallback} -} -function throttle(callback) { - //60fps translates to 16.6ms, round it down since setTimeout requires int - var time = 16 - var last = 0, pending = null - var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout - return function() { - var now = Date.now() - if (last === 0 || now - last >= time) { - last = now - callback() - } - else if (pending === null) { - pending = timeout(function() { - pending = null - callback() - last = Date.now() - }, time - (now - last)) - } - } -} -var _11 = function($window) { - var renderService = coreRenderer($window) - renderService.setEventCallback(function(e) { - if (e.redraw !== false) redraw() - }) - - var callbacks = [] - function subscribe(key1, callback) { - unsubscribe(key1) - callbacks.push(key1, throttle(callback)) - } - function unsubscribe(key1) { - var index = callbacks.indexOf(key1) - if (index > -1) callbacks.splice(index, 2) - } - function redraw() { - for (var i = 1; i < callbacks.length; i += 2) { - callbacks[i]() - } - } - return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render} -} -var redrawService = _11(window) -requestService.setCompletionCallback(redrawService.redraw) -var _16 = function(redrawService0) { - return function(root, component) { - if (component === null) { - redrawService0.render(root, []) - redrawService0.unsubscribe(root) - return - } - - if (component.view == null) throw new Error("m.mount(element, component) expects a component, not a vnode") - - var run0 = function() { - redrawService0.render(root, Vnode(component)) - } - redrawService0.subscribe(root, run0) - redrawService0.redraw() - } -} -m.mount = _16(redrawService) -var Promise = PromisePolyfill -var parseQueryString = function(string) { - if (string === "" || string == null) return {} - if (string.charAt(0) === "?") string = string.slice(1) - var entries = string.split("&"), data0 = {}, counters = {} - for (var i = 0; i < entries.length; i++) { - var entry = entries[i].split("=") - var key5 = decodeURIComponent(entry[0]) - var value = entry.length === 2 ? decodeURIComponent(entry[1]) : "" - if (value === "true") value = true - else if (value === "false") value = false - var levels = key5.split(/\]\[?|\[/) - var cursor = data0 - if (key5.indexOf("[") > -1) levels.pop() - for (var j = 0; j < levels.length; j++) { - var level = levels[j], nextLevel = levels[j + 1] - var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)) - var isValue = j === levels.length - 1 - if (level === "") { - var key5 = levels.slice(0, j).join() - if (counters[key5] == null) counters[key5] = 0 - level = counters[key5]++ - } - if (cursor[level] == null) { - cursor[level] = isValue ? value : isNumber ? [] : {} - } - cursor = cursor[level] - } - } - return data0 -} -var coreRouter = function($window) { - var supportsPushState = typeof $window.history.pushState === "function" - var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout - function normalize1(fragment0) { - var data = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent) - if (fragment0 === "pathname" && data[0] !== "/") data = "/" + data - return data - } - var asyncId - function debounceAsync(callback0) { - return function() { - if (asyncId != null) return - asyncId = callAsync0(function() { - asyncId = null - callback0() - }) - } - } - function parsePath(path, queryData, hashData) { - var queryIndex = path.indexOf("?") - var hashIndex = path.indexOf("#") - var pathEnd = queryIndex > -1 ? queryIndex : hashIndex > -1 ? hashIndex : path.length - if (queryIndex > -1) { - var queryEnd = hashIndex > -1 ? hashIndex : path.length - var queryParams = parseQueryString(path.slice(queryIndex + 1, queryEnd)) - for (var key4 in queryParams) queryData[key4] = queryParams[key4] - } - if (hashIndex > -1) { - var hashParams = parseQueryString(path.slice(hashIndex + 1)) - for (var key4 in hashParams) hashData[key4] = hashParams[key4] - } - return path.slice(0, pathEnd) - } - var router = {prefix: "#!"} - router.getPath = function() { - var type2 = router.prefix.charAt(0) - switch (type2) { - case "#": return normalize1("hash").slice(router.prefix.length) - case "?": return normalize1("search").slice(router.prefix.length) + normalize1("hash") - default: return normalize1("pathname").slice(router.prefix.length) + normalize1("search") + normalize1("hash") - } - } - router.setPath = function(path, data, options) { - var queryData = {}, hashData = {} - path = parsePath(path, queryData, hashData) - if (data != null) { - for (var key4 in data) queryData[key4] = data[key4] - path = path.replace(/:([^\/]+)/g, function(match2, token) { - delete queryData[token] - return data[token] - }) - } - var query = buildQueryString(queryData) - if (query) path += "?" + query - var hash = buildQueryString(hashData) - if (hash) path += "#" + hash - if (supportsPushState) { - var state = options ? options.state : null - var title = options ? options.title : null - $window.onpopstate() - if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path) - else $window.history.pushState(state, title, router.prefix + path) - } - else $window.location.href = router.prefix + path - } - router.defineRoutes = function(routes, resolve, reject) { - function resolveRoute() { - var path = router.getPath() - var params = {} - var pathname = parsePath(path, params, params) - - var state = $window.history.state - if (state != null) { - for (var k in state) params[k] = state[k] - } - for (var route0 in routes) { - var matcher = new RegExp("^" + route0.replace(/:[^\/]+?\.{3}/g, "(.*?)").replace(/:[^\/]+/g, "([^\\/]+)") + "\/?$") - if (matcher.test(pathname)) { - pathname.replace(matcher, function() { - var keys = route0.match(/:[^\/]+/g) || [] - var values = [].slice.call(arguments, 1, -2) - for (var i = 0; i < keys.length; i++) { - params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i]) - } - resolve(routes[route0], params, path, route0) - }) - return - } - } - reject(path, params) - } - - if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute) - else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute - resolveRoute() - } - - return router -} -var _20 = function($window, redrawService0) { - var routeService = coreRouter($window) - var identity = function(v) {return v} - var render1, component, attrs3, currentPath, lastUpdate - var route = function(root, defaultRoute, routes) { - if (root == null) throw new Error("Ensure the DOM element that was passed to `m.route` is not undefined") - var run1 = function() { - if (render1 != null) redrawService0.render(root, render1(Vnode(component, attrs3.key, attrs3))) - } - var bail = function() { - routeService.setPath(defaultRoute, null, {replace: true}) - } - routeService.defineRoutes(routes, function(payload, params, path) { - var update = lastUpdate = function(routeResolver, comp) { - if (update !== lastUpdate) return - component = comp != null && typeof comp.view === "function" ? comp : "div", attrs3 = params, currentPath = path, lastUpdate = null - render1 = (routeResolver.render || identity).bind(routeResolver) - run1() - } - if (payload.view) update({}, payload) - else { - if (payload.onmatch) { - Promise.resolve(payload.onmatch(params, path)).then(function(resolved) { - update(payload, resolved) - }, bail) - } - else update(payload, "div") - } - }, bail) - redrawService0.subscribe(root, run1) - } - route.set = function(path, data, options) { - if (lastUpdate != null) options = {replace: true} - lastUpdate = null - routeService.setPath(path, data, options) - } - route.get = function() {return currentPath} - route.prefix = function(prefix0) {routeService.prefix = prefix0} - route.link = function(vnode1) { - vnode1.dom.setAttribute("href", routeService.prefix + vnode1.attrs.href) - vnode1.dom.onclick = function(e) { - if (e.ctrlKey || e.metaKey || e.shiftKey || e.which === 2) return - e.preventDefault() - e.redraw = false - var href = this.getAttribute("href") - if (href.indexOf(routeService.prefix) === 0) href = href.slice(routeService.prefix.length) - route.set(href, undefined, undefined) - } - } - route.param = function(key3) { - if(typeof attrs3 !== "undefined" && typeof key3 !== "undefined") return attrs3[key3] - return attrs3 - } - return route -} -m.route = _20(window, redrawService) -m.withAttr = function(attrName, callback1, context) { - return function(e) { - callback1.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName)) - } -} -var _28 = coreRenderer(window) -m.render = _28.render -m.redraw = redrawService.redraw -m.request = requestService.request -m.jsonp = requestService.jsonp -m.parseQueryString = parseQueryString -m.buildQueryString = buildQueryString -m.version = "1.0.0" -m.vnode = Vnode -if (typeof module !== "undefined") module["exports"] = m -else window.m = m -} -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) -},{"timers":2}],4:[function(require,module,exports){ -/*! @preserve - * numeral.js - * version : 2.0.6 - * author : Adam Draper - * license : MIT - * http://adamwdraper.github.com/Numeral-js/ - */ - -(function (global, factory) { - if (typeof define === 'function' && define.amd) { - define(factory); - } else if (typeof module === 'object' && module.exports) { - module.exports = factory(); - } else { - global.numeral = factory(); - } -}(this, function () { - /************************************ - Variables - ************************************/ - - var numeral, - _, - VERSION = '2.0.6', - formats = {}, - locales = {}, - defaults = { - currentLocale: 'en', - zeroFormat: null, - nullFormat: null, - defaultFormat: '0,0', - scalePercentBy100: true - }, - options = { - currentLocale: defaults.currentLocale, - zeroFormat: defaults.zeroFormat, - nullFormat: defaults.nullFormat, - defaultFormat: defaults.defaultFormat, - scalePercentBy100: defaults.scalePercentBy100 - }; - - - /************************************ - Constructors - ************************************/ - - // Numeral prototype object - function Numeral(input, number) { - this._input = input; - - this._value = number; - } - - numeral = function(input) { - var value, - kind, - unformatFunction, - regexp; - - if (numeral.isNumeral(input)) { - value = input.value(); - } else if (input === 0 || typeof input === 'undefined') { - value = 0; - } else if (input === null || _.isNaN(input)) { - value = null; - } else if (typeof input === 'string') { - if (options.zeroFormat && input === options.zeroFormat) { - value = 0; - } else if (options.nullFormat && input === options.nullFormat || !input.replace(/[^0-9]+/g, '').length) { - value = null; - } else { - for (kind in formats) { - regexp = typeof formats[kind].regexps.unformat === 'function' ? formats[kind].regexps.unformat() : formats[kind].regexps.unformat; - - if (regexp && input.match(regexp)) { - unformatFunction = formats[kind].unformat; - - break; - } - } - - unformatFunction = unformatFunction || numeral._.stringToNumber; - - value = unformatFunction(input); - } - } else { - value = Number(input)|| null; - } - - return new Numeral(input, value); - }; - - // version number - numeral.version = VERSION; - - // compare numeral object - numeral.isNumeral = function(obj) { - return obj instanceof Numeral; - }; - - // helper functions - numeral._ = _ = { - // formats numbers separators, decimals places, signs, abbreviations - numberToFormat: function(value, format, roundingFunction) { - var locale = locales[numeral.options.currentLocale], - negP = false, - optDec = false, - leadingCount = 0, - abbr = '', - trillion = 1000000000000, - billion = 1000000000, - million = 1000000, - thousand = 1000, - decimal = '', - neg = false, - abbrForce, // force abbreviation - abs, - min, - max, - power, - int, - precision, - signed, - thousands, - output; - - // make sure we never format a null value - value = value || 0; - - abs = Math.abs(value); - - // see if we should use parentheses for negative number or if we should prefix with a sign - // if both are present we default to parentheses - if (numeral._.includes(format, '(')) { - negP = true; - format = format.replace(/[\(|\)]/g, ''); - } else if (numeral._.includes(format, '+') || numeral._.includes(format, '-')) { - signed = numeral._.includes(format, '+') ? format.indexOf('+') : value < 0 ? format.indexOf('-') : -1; - format = format.replace(/[\+|\-]/g, ''); - } - - // see if abbreviation is wanted - if (numeral._.includes(format, 'a')) { - abbrForce = format.match(/a(k|m|b|t)?/); - - abbrForce = abbrForce ? abbrForce[1] : false; - - // check for space before abbreviation - if (numeral._.includes(format, ' a')) { - abbr = ' '; - } - - format = format.replace(new RegExp(abbr + 'a[kmbt]?'), ''); - - if (abs >= trillion && !abbrForce || abbrForce === 't') { - // trillion - abbr += locale.abbreviations.trillion; - value = value / trillion; - } else if (abs < trillion && abs >= billion && !abbrForce || abbrForce === 'b') { - // billion - abbr += locale.abbreviations.billion; - value = value / billion; - } else if (abs < billion && abs >= million && !abbrForce || abbrForce === 'm') { - // million - abbr += locale.abbreviations.million; - value = value / million; - } else if (abs < million && abs >= thousand && !abbrForce || abbrForce === 'k') { - // thousand - abbr += locale.abbreviations.thousand; - value = value / thousand; - } - } - - // check for optional decimals - if (numeral._.includes(format, '[.]')) { - optDec = true; - format = format.replace('[.]', '.'); - } - - // break number and format - int = value.toString().split('.')[0]; - precision = format.split('.')[1]; - thousands = format.indexOf(','); - leadingCount = (format.split('.')[0].split(',')[0].match(/0/g) || []).length; - - if (precision) { - if (numeral._.includes(precision, '[')) { - precision = precision.replace(']', ''); - precision = precision.split('['); - decimal = numeral._.toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length); - } else { - decimal = numeral._.toFixed(value, precision.length, roundingFunction); - } - - int = decimal.split('.')[0]; - - if (numeral._.includes(decimal, '.')) { - decimal = locale.delimiters.decimal + decimal.split('.')[1]; - } else { - decimal = ''; - } - - if (optDec && Number(decimal.slice(1)) === 0) { - decimal = ''; - } - } else { - int = numeral._.toFixed(value, 0, roundingFunction); - } - - // check abbreviation again after rounding - if (abbr && !abbrForce && Number(int) >= 1000 && abbr !== locale.abbreviations.trillion) { - int = String(Number(int) / 1000); - - switch (abbr) { - case locale.abbreviations.thousand: - abbr = locale.abbreviations.million; - break; - case locale.abbreviations.million: - abbr = locale.abbreviations.billion; - break; - case locale.abbreviations.billion: - abbr = locale.abbreviations.trillion; - break; - } - } - - - // format number - if (numeral._.includes(int, '-')) { - int = int.slice(1); - neg = true; - } - - if (int.length < leadingCount) { - for (var i = leadingCount - int.length; i > 0; i--) { - int = '0' + int; - } - } - - if (thousands > -1) { - int = int.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + locale.delimiters.thousands); - } - - if (format.indexOf('.') === 0) { - int = ''; - } - - output = int + decimal + (abbr ? abbr : ''); - - if (negP) { - output = (negP && neg ? '(' : '') + output + (negP && neg ? ')' : ''); - } else { - if (signed >= 0) { - output = signed === 0 ? (neg ? '-' : '+') + output : output + (neg ? '-' : '+'); - } else if (neg) { - output = '-' + output; - } - } - - return output; - }, - // unformats numbers separators, decimals places, signs, abbreviations - stringToNumber: function(string) { - var locale = locales[options.currentLocale], - stringOriginal = string, - abbreviations = { - thousand: 3, - million: 6, - billion: 9, - trillion: 12 - }, - abbreviation, - value, - i, - regexp; - - if (options.zeroFormat && string === options.zeroFormat) { - value = 0; - } else if (options.nullFormat && string === options.nullFormat || !string.replace(/[^0-9]+/g, '').length) { - value = null; - } else { - value = 1; - - if (locale.delimiters.decimal !== '.') { - string = string.replace(/\./g, '').replace(locale.delimiters.decimal, '.'); - } - - for (abbreviation in abbreviations) { - regexp = new RegExp('[^a-zA-Z]' + locale.abbreviations[abbreviation] + '(?:\\)|(\\' + locale.currency.symbol + ')?(?:\\))?)?$'); - - if (stringOriginal.match(regexp)) { - value *= Math.pow(10, abbreviations[abbreviation]); - break; - } - } - - // check for negative number - value *= (string.split('-').length + Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2 ? 1 : -1; - - // remove non numbers - string = string.replace(/[^0-9\.]+/g, ''); - - value *= Number(string); - } - - return value; - }, - isNaN: function(value) { - return typeof value === 'number' && isNaN(value); - }, - includes: function(string, search) { - return string.indexOf(search) !== -1; - }, - insert: function(string, subString, start) { - return string.slice(0, start) + subString + string.slice(start); - }, - reduce: function(array, callback /*, initialValue*/) { - if (this === null) { - throw new TypeError('Array.prototype.reduce called on null or undefined'); - } - - if (typeof callback !== 'function') { - throw new TypeError(callback + ' is not a function'); - } - - var t = Object(array), - len = t.length >>> 0, - k = 0, - value; - - if (arguments.length === 3) { - value = arguments[2]; - } else { - while (k < len && !(k in t)) { - k++; - } - - if (k >= len) { - throw new TypeError('Reduce of empty array with no initial value'); - } - - value = t[k++]; - } - for (; k < len; k++) { - if (k in t) { - value = callback(value, t[k], k, t); - } - } - return value; - }, - /** - * Computes the multiplier necessary to make x >= 1, - * effectively eliminating miscalculations caused by - * finite precision. - */ - multiplier: function (x) { - var parts = x.toString().split('.'); - - return parts.length < 2 ? 1 : Math.pow(10, parts[1].length); - }, - /** - * Given a variable number of arguments, returns the maximum - * multiplier that must be used to normalize an operation involving - * all of them. - */ - correctionFactor: function () { - var args = Array.prototype.slice.call(arguments); - - return args.reduce(function(accum, next) { - var mn = _.multiplier(next); - return accum > mn ? accum : mn; - }, 1); - }, - /** - * Implementation of toFixed() that treats floats more like decimals - * - * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present - * problems for accounting- and finance-related software. - */ - toFixed: function(value, maxDecimals, roundingFunction, optionals) { - var splitValue = value.toString().split('.'), - minDecimals = maxDecimals - (optionals || 0), - boundedPrecision, - optionalsRegExp, - power, - output; - - // Use the smallest precision value possible to avoid errors from floating point representation - if (splitValue.length === 2) { - boundedPrecision = Math.min(Math.max(splitValue[1].length, minDecimals), maxDecimals); - } else { - boundedPrecision = minDecimals; - } - - power = Math.pow(10, boundedPrecision); - - // Multiply up by precision, round accurately, then divide and use native toFixed(): - output = (roundingFunction(value + 'e+' + boundedPrecision) / power).toFixed(boundedPrecision); - - if (optionals > maxDecimals - boundedPrecision) { - optionalsRegExp = new RegExp('\\.?0{1,' + (optionals - (maxDecimals - boundedPrecision)) + '}$'); - output = output.replace(optionalsRegExp, ''); - } - - return output; - } - }; - - // avaliable options - numeral.options = options; - - // avaliable formats - numeral.formats = formats; - - // avaliable formats - numeral.locales = locales; - - // This function sets the current locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - numeral.locale = function(key) { - if (key) { - options.currentLocale = key.toLowerCase(); - } - - return options.currentLocale; - }; - - // This function provides access to the loaded locale data. If - // no arguments are passed in, it will simply return the current - // global locale object. - numeral.localeData = function(key) { - if (!key) { - return locales[options.currentLocale]; - } - - key = key.toLowerCase(); - - if (!locales[key]) { - throw new Error('Unknown locale : ' + key); - } - - return locales[key]; - }; - - numeral.reset = function() { - for (var property in defaults) { - options[property] = defaults[property]; - } - }; - - numeral.zeroFormat = function(format) { - options.zeroFormat = typeof(format) === 'string' ? format : null; - }; - - numeral.nullFormat = function (format) { - options.nullFormat = typeof(format) === 'string' ? format : null; - }; - - numeral.defaultFormat = function(format) { - options.defaultFormat = typeof(format) === 'string' ? format : '0.0'; - }; - - numeral.register = function(type, name, format) { - name = name.toLowerCase(); - - if (this[type + 's'][name]) { - throw new TypeError(name + ' ' + type + ' already registered.'); - } - - this[type + 's'][name] = format; - - return format; - }; - - - numeral.validate = function(val, culture) { - var _decimalSep, - _thousandSep, - _currSymbol, - _valArray, - _abbrObj, - _thousandRegEx, - localeData, - temp; - - //coerce val to string - if (typeof val !== 'string') { - val += ''; - - if (console.warn) { - console.warn('Numeral.js: Value is not string. It has been co-erced to: ', val); - } - } - - //trim whitespaces from either sides - val = val.trim(); - - //if val is just digits return true - if (!!val.match(/^\d+$/)) { - return true; - } - - //if val is empty return false - if (val === '') { - return false; - } - - //get the decimal and thousands separator from numeral.localeData - try { - //check if the culture is understood by numeral. if not, default it to current locale - localeData = numeral.localeData(culture); - } catch (e) { - localeData = numeral.localeData(numeral.locale()); - } - - //setup the delimiters and currency symbol based on culture/locale - _currSymbol = localeData.currency.symbol; - _abbrObj = localeData.abbreviations; - _decimalSep = localeData.delimiters.decimal; - if (localeData.delimiters.thousands === '.') { - _thousandSep = '\\.'; - } else { - _thousandSep = localeData.delimiters.thousands; - } - - // validating currency symbol - temp = val.match(/^[^\d]+/); - if (temp !== null) { - val = val.substr(1); - if (temp[0] !== _currSymbol) { - return false; - } - } - - //validating abbreviation symbol - temp = val.match(/[^\d]+$/); - if (temp !== null) { - val = val.slice(0, -1); - if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million && temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) { - return false; - } - } - - _thousandRegEx = new RegExp(_thousandSep + '{2}'); - - if (!val.match(/[^\d.,]/g)) { - _valArray = val.split(_decimalSep); - if (_valArray.length > 2) { - return false; - } else { - if (_valArray.length < 2) { - return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx)); - } else { - if (_valArray[0].length === 1) { - return ( !! _valArray[0].match(/^\d+$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/)); - } else { - return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/)); - } - } - } - } - - return false; - }; - - - /************************************ - Numeral Prototype - ************************************/ - - numeral.fn = Numeral.prototype = { - clone: function() { - return numeral(this); - }, - format: function(inputString, roundingFunction) { - var value = this._value, - format = inputString || options.defaultFormat, - kind, - output, - formatFunction; - - // make sure we have a roundingFunction - roundingFunction = roundingFunction || Math.round; - - // format based on value - if (value === 0 && options.zeroFormat !== null) { - output = options.zeroFormat; - } else if (value === null && options.nullFormat !== null) { - output = options.nullFormat; - } else { - for (kind in formats) { - if (format.match(formats[kind].regexps.format)) { - formatFunction = formats[kind].format; - - break; - } - } - - formatFunction = formatFunction || numeral._.numberToFormat; - - output = formatFunction(value, format, roundingFunction); - } - - return output; - }, - value: function() { - return this._value; - }, - input: function() { - return this._input; - }, - set: function(value) { - this._value = Number(value); - - return this; - }, - add: function(value) { - var corrFactor = _.correctionFactor.call(null, this._value, value); - - function cback(accum, curr, currI, O) { - return accum + Math.round(corrFactor * curr); - } - - this._value = _.reduce([this._value, value], cback, 0) / corrFactor; - - return this; - }, - subtract: function(value) { - var corrFactor = _.correctionFactor.call(null, this._value, value); - - function cback(accum, curr, currI, O) { - return accum - Math.round(corrFactor * curr); - } - - this._value = _.reduce([value], cback, Math.round(this._value * corrFactor)) / corrFactor; - - return this; - }, - multiply: function(value) { - function cback(accum, curr, currI, O) { - var corrFactor = _.correctionFactor(accum, curr); - return Math.round(accum * corrFactor) * Math.round(curr * corrFactor) / Math.round(corrFactor * corrFactor); - } - - this._value = _.reduce([this._value, value], cback, 1); - - return this; - }, - divide: function(value) { - function cback(accum, curr, currI, O) { - var corrFactor = _.correctionFactor(accum, curr); - return Math.round(accum * corrFactor) / Math.round(curr * corrFactor); - } - - this._value = _.reduce([this._value, value], cback); - - return this; - }, - difference: function(value) { - return Math.abs(numeral(this._value).subtract(value).value()); - } - }; - - /************************************ - Default Locale && Format - ************************************/ - - numeral.register('locale', 'en', { - delimiters: { - thousands: ',', - decimal: '.' - }, - abbreviations: { - thousand: 'k', - million: 'm', - billion: 'b', - trillion: 't' - }, - ordinal: function(number) { - var b = number % 10; - return (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - }, - currency: { - symbol: '$' - } - }); - - - -(function() { - numeral.register('format', 'bps', { - regexps: { - format: /(BPS)/, - unformat: /(BPS)/ - }, - format: function(value, format, roundingFunction) { - var space = numeral._.includes(format, ' BPS') ? ' ' : '', - output; - - value = value * 10000; - - // check for space before BPS - format = format.replace(/\s?BPS/, ''); - - output = numeral._.numberToFormat(value, format, roundingFunction); - - if (numeral._.includes(output, ')')) { - output = output.split(''); - - output.splice(-1, 0, space + 'BPS'); - - output = output.join(''); - } else { - output = output + space + 'BPS'; - } - - return output; - }, - unformat: function(string) { - return +(numeral._.stringToNumber(string) * 0.0001).toFixed(15); - } - }); -})(); - - -(function() { - var decimal = { - base: 1000, - suffixes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] - }, - binary = { - base: 1024, - suffixes: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] - }; - - var allSuffixes = decimal.suffixes.concat(binary.suffixes.filter(function (item) { - return decimal.suffixes.indexOf(item) < 0; - })); - var unformatRegex = allSuffixes.join('|'); - // Allow support for BPS (http://www.investopedia.com/terms/b/basispoint.asp) - unformatRegex = '(' + unformatRegex.replace('B', 'B(?!PS)') + ')'; - - numeral.register('format', 'bytes', { - regexps: { - format: /([0\s]i?b)/, - unformat: new RegExp(unformatRegex) - }, - format: function(value, format, roundingFunction) { - var output, - bytes = numeral._.includes(format, 'ib') ? binary : decimal, - suffix = numeral._.includes(format, ' b') || numeral._.includes(format, ' ib') ? ' ' : '', - power, - min, - max; - - // check for space before - format = format.replace(/\s?i?b/, ''); - - for (power = 0; power <= bytes.suffixes.length; power++) { - min = Math.pow(bytes.base, power); - max = Math.pow(bytes.base, power + 1); - - if (value === null || value === 0 || value >= min && value < max) { - suffix += bytes.suffixes[power]; - - if (min > 0) { - value = value / min; - } - - break; - } - } - - output = numeral._.numberToFormat(value, format, roundingFunction); - - return output + suffix; - }, - unformat: function(string) { - var value = numeral._.stringToNumber(string), - power, - bytesMultiplier; - - if (value) { - for (power = decimal.suffixes.length - 1; power >= 0; power--) { - if (numeral._.includes(string, decimal.suffixes[power])) { - bytesMultiplier = Math.pow(decimal.base, power); - - break; - } - - if (numeral._.includes(string, binary.suffixes[power])) { - bytesMultiplier = Math.pow(binary.base, power); - - break; - } - } - - value *= (bytesMultiplier || 1); - } - - return value; - } - }); -})(); - - -(function() { - numeral.register('format', 'currency', { - regexps: { - format: /(\$)/ - }, - format: function(value, format, roundingFunction) { - var locale = numeral.locales[numeral.options.currentLocale], - symbols = { - before: format.match(/^([\+|\-|\(|\s|\$]*)/)[0], - after: format.match(/([\+|\-|\)|\s|\$]*)$/)[0] - }, - output, - symbol, - i; - - // strip format of spaces and $ - format = format.replace(/\s?\$\s?/, ''); - - // format the number - output = numeral._.numberToFormat(value, format, roundingFunction); - - // update the before and after based on value - if (value >= 0) { - symbols.before = symbols.before.replace(/[\-\(]/, ''); - symbols.after = symbols.after.replace(/[\-\)]/, ''); - } else if (value < 0 && (!numeral._.includes(symbols.before, '-') && !numeral._.includes(symbols.before, '('))) { - symbols.before = '-' + symbols.before; - } - - // loop through each before symbol - for (i = 0; i < symbols.before.length; i++) { - symbol = symbols.before[i]; - - switch (symbol) { - case '$': - output = numeral._.insert(output, locale.currency.symbol, i); - break; - case ' ': - output = numeral._.insert(output, ' ', i + locale.currency.symbol.length - 1); - break; - } - } - - // loop through each after symbol - for (i = symbols.after.length - 1; i >= 0; i--) { - symbol = symbols.after[i]; - - switch (symbol) { - case '$': - output = i === symbols.after.length - 1 ? output + locale.currency.symbol : numeral._.insert(output, locale.currency.symbol, -(symbols.after.length - (1 + i))); - break; - case ' ': - output = i === symbols.after.length - 1 ? output + ' ' : numeral._.insert(output, ' ', -(symbols.after.length - (1 + i) + locale.currency.symbol.length - 1)); - break; - } - } - - - return output; - } - }); -})(); - - -(function() { - numeral.register('format', 'exponential', { - regexps: { - format: /(e\+|e-)/, - unformat: /(e\+|e-)/ - }, - format: function(value, format, roundingFunction) { - var output, - exponential = typeof value === 'number' && !numeral._.isNaN(value) ? value.toExponential() : '0e+0', - parts = exponential.split('e'); - - format = format.replace(/e[\+|\-]{1}0/, ''); - - output = numeral._.numberToFormat(Number(parts[0]), format, roundingFunction); - - return output + 'e' + parts[1]; - }, - unformat: function(string) { - var parts = numeral._.includes(string, 'e+') ? string.split('e+') : string.split('e-'), - value = Number(parts[0]), - power = Number(parts[1]); - - power = numeral._.includes(string, 'e-') ? power *= -1 : power; - - function cback(accum, curr, currI, O) { - var corrFactor = numeral._.correctionFactor(accum, curr), - num = (accum * corrFactor) * (curr * corrFactor) / (corrFactor * corrFactor); - return num; - } - - return numeral._.reduce([value, Math.pow(10, power)], cback, 1); - } - }); -})(); - - -(function() { - numeral.register('format', 'ordinal', { - regexps: { - format: /(o)/ - }, - format: function(value, format, roundingFunction) { - var locale = numeral.locales[numeral.options.currentLocale], - output, - ordinal = numeral._.includes(format, ' o') ? ' ' : ''; - - // check for space before - format = format.replace(/\s?o/, ''); - - ordinal += locale.ordinal(value); - - output = numeral._.numberToFormat(value, format, roundingFunction); - - return output + ordinal; - } - }); -})(); - - -(function() { - numeral.register('format', 'percentage', { - regexps: { - format: /(%)/, - unformat: /(%)/ - }, - format: function(value, format, roundingFunction) { - var space = numeral._.includes(format, ' %') ? ' ' : '', - output; - - if (numeral.options.scalePercentBy100) { - value = value * 100; - } - - // check for space before % - format = format.replace(/\s?\%/, ''); - - output = numeral._.numberToFormat(value, format, roundingFunction); - - if (numeral._.includes(output, ')')) { - output = output.split(''); - - output.splice(-1, 0, space + '%'); - - output = output.join(''); - } else { - output = output + space + '%'; - } - - return output; - }, - unformat: function(string) { - var number = numeral._.stringToNumber(string); - if (numeral.options.scalePercentBy100) { - return number * 0.01; - } - return number; - } - }); -})(); - - -(function() { - numeral.register('format', 'time', { - regexps: { - format: /(:)/, - unformat: /(:)/ - }, - format: function(value, format, roundingFunction) { - var hours = Math.floor(value / 60 / 60), - minutes = Math.floor((value - (hours * 60 * 60)) / 60), - seconds = Math.round(value - (hours * 60 * 60) - (minutes * 60)); - - return hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds); - }, - unformat: function(string) { - var timeArray = string.split(':'), - seconds = 0; - - // turn hours and minutes into seconds and add them all up - if (timeArray.length === 3) { - // hours - seconds = seconds + (Number(timeArray[0]) * 60 * 60); - // minutes - seconds = seconds + (Number(timeArray[1]) * 60); - // seconds - seconds = seconds + Number(timeArray[2]); - } else if (timeArray.length === 2) { - // minutes - seconds = seconds + (Number(timeArray[0]) * 60); - // seconds - seconds = seconds + Number(timeArray[1]); - } - return Number(seconds); - } - }); -})(); - -return numeral; -})); - -},{}],5:[function(require,module,exports){ -(function (global){(function (){ -/**! - * @fileOverview Kickass library to create and place poppers near their reference elements. - * @version 1.16.1 - * @license - * Copyright (c) 2016 Federico Zivolo and contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.Popper = factory()); -}(this, (function () { 'use strict'; - -var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined'; - -var timeoutDuration = function () { - var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; - for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { - if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) { - return 1; - } - } - return 0; -}(); - -function microtaskDebounce(fn) { - var called = false; - return function () { - if (called) { - return; - } - called = true; - window.Promise.resolve().then(function () { - called = false; - fn(); - }); - }; -} - -function taskDebounce(fn) { - var scheduled = false; - return function () { - if (!scheduled) { - scheduled = true; - setTimeout(function () { - scheduled = false; - fn(); - }, timeoutDuration); - } - }; -} - -var supportsMicroTasks = isBrowser && window.Promise; - -/** -* Create a debounced version of a method, that's asynchronously deferred -* but called in the minimum time possible. -* -* @method -* @memberof Popper.Utils -* @argument {Function} fn -* @returns {Function} -*/ -var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; - -/** - * Check if the given variable is a function - * @method - * @memberof Popper.Utils - * @argument {Any} functionToCheck - variable to check - * @returns {Boolean} answer to: is a function? - */ -function isFunction(functionToCheck) { - var getType = {}; - return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; -} - -/** - * Get CSS computed property of the given element - * @method - * @memberof Popper.Utils - * @argument {Eement} element - * @argument {String} property - */ -function getStyleComputedProperty(element, property) { - if (element.nodeType !== 1) { - return []; - } - // NOTE: 1 DOM access here - var window = element.ownerDocument.defaultView; - var css = window.getComputedStyle(element, null); - return property ? css[property] : css; -} - -/** - * Returns the parentNode or the host of the element - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} parent - */ -function getParentNode(element) { - if (element.nodeName === 'HTML') { - return element; - } - return element.parentNode || element.host; -} - -/** - * Returns the scrolling parent of the given element - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} scroll parent - */ -function getScrollParent(element) { - // Return body, `getScroll` will take care to get the correct `scrollTop` from it - if (!element) { - return document.body; - } - - switch (element.nodeName) { - case 'HTML': - case 'BODY': - return element.ownerDocument.body; - case '#document': - return element.body; - } - - // Firefox want us to check `-x` and `-y` variations as well - - var _getStyleComputedProp = getStyleComputedProperty(element), - overflow = _getStyleComputedProp.overflow, - overflowX = _getStyleComputedProp.overflowX, - overflowY = _getStyleComputedProp.overflowY; - - if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { - return element; - } - - return getScrollParent(getParentNode(element)); -} - -/** - * Returns the reference node of the reference object, or the reference object itself. - * @method - * @memberof Popper.Utils - * @param {Element|Object} reference - the reference element (the popper will be relative to this) - * @returns {Element} parent - */ -function getReferenceNode(reference) { - return reference && reference.referenceNode ? reference.referenceNode : reference; -} - -var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); -var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); - -/** - * Determines if the browser is Internet Explorer - * @method - * @memberof Popper.Utils - * @param {Number} version to check - * @returns {Boolean} isIE - */ -function isIE(version) { - if (version === 11) { - return isIE11; - } - if (version === 10) { - return isIE10; - } - return isIE11 || isIE10; -} - -/** - * Returns the offset parent of the given element - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} offset parent - */ -function getOffsetParent(element) { - if (!element) { - return document.documentElement; - } - - var noOffsetParent = isIE(10) ? document.body : null; - - // NOTE: 1 DOM access here - var offsetParent = element.offsetParent || null; - // Skip hidden elements which don't have an offsetParent - while (offsetParent === noOffsetParent && element.nextElementSibling) { - offsetParent = (element = element.nextElementSibling).offsetParent; - } - - var nodeName = offsetParent && offsetParent.nodeName; - - if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { - return element ? element.ownerDocument.documentElement : document.documentElement; - } - - // .offsetParent will return the closest TH, TD or TABLE in case - // no offsetParent is present, I hate this job... - if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { - return getOffsetParent(offsetParent); - } - - return offsetParent; -} - -function isOffsetContainer(element) { - var nodeName = element.nodeName; - - if (nodeName === 'BODY') { - return false; - } - return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; -} - -/** - * Finds the root node (document, shadowDOM root) of the given element - * @method - * @memberof Popper.Utils - * @argument {Element} node - * @returns {Element} root node - */ -function getRoot(node) { - if (node.parentNode !== null) { - return getRoot(node.parentNode); - } - - return node; -} - -/** - * Finds the offset parent common to the two provided nodes - * @method - * @memberof Popper.Utils - * @argument {Element} element1 - * @argument {Element} element2 - * @returns {Element} common offset parent - */ -function findCommonOffsetParent(element1, element2) { - // This check is needed to avoid errors in case one of the elements isn't defined for any reason - if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { - return document.documentElement; - } - - // Here we make sure to give as "start" the element that comes first in the DOM - var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; - var start = order ? element1 : element2; - var end = order ? element2 : element1; - - // Get common ancestor container - var range = document.createRange(); - range.setStart(start, 0); - range.setEnd(end, 0); - var commonAncestorContainer = range.commonAncestorContainer; - - // Both nodes are inside #document - - if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { - if (isOffsetContainer(commonAncestorContainer)) { - return commonAncestorContainer; - } - - return getOffsetParent(commonAncestorContainer); - } - - // one of the nodes is inside shadowDOM, find which one - var element1root = getRoot(element1); - if (element1root.host) { - return findCommonOffsetParent(element1root.host, element2); - } else { - return findCommonOffsetParent(element1, getRoot(element2).host); - } -} - -/** - * Gets the scroll value of the given element in the given side (top and left) - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @argument {String} side `top` or `left` - * @returns {number} amount of scrolled pixels - */ -function getScroll(element) { - var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; - - var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; - var nodeName = element.nodeName; - - if (nodeName === 'BODY' || nodeName === 'HTML') { - var html = element.ownerDocument.documentElement; - var scrollingElement = element.ownerDocument.scrollingElement || html; - return scrollingElement[upperSide]; - } - - return element[upperSide]; -} - -/* - * Sum or subtract the element scroll values (left and top) from a given rect object - * @method - * @memberof Popper.Utils - * @param {Object} rect - Rect object you want to change - * @param {HTMLElement} element - The element from the function reads the scroll values - * @param {Boolean} subtract - set to true if you want to subtract the scroll values - * @return {Object} rect - The modifier rect object - */ -function includeScroll(rect, element) { - var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var scrollTop = getScroll(element, 'top'); - var scrollLeft = getScroll(element, 'left'); - var modifier = subtract ? -1 : 1; - rect.top += scrollTop * modifier; - rect.bottom += scrollTop * modifier; - rect.left += scrollLeft * modifier; - rect.right += scrollLeft * modifier; - return rect; -} - -/* - * Helper to detect borders of a given element - * @method - * @memberof Popper.Utils - * @param {CSSStyleDeclaration} styles - * Result of `getStyleComputedProperty` on the given element - * @param {String} axis - `x` or `y` - * @return {number} borders - The borders size of the given axis - */ - -function getBordersSize(styles, axis) { - var sideA = axis === 'x' ? 'Left' : 'Top'; - var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; - - return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']); -} - -function getSize(axis, body, html, computedStyle) { - return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); -} - -function getWindowSizes(document) { - var body = document.body; - var html = document.documentElement; - var computedStyle = isIE(10) && getComputedStyle(html); - - return { - height: getSize('Height', body, html, computedStyle), - width: getSize('Width', body, html, computedStyle) - }; -} - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - -var defineProperty = function (obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -}; - -var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; -}; - -/** - * Given element offsets, generate an output similar to getBoundingClientRect - * @method - * @memberof Popper.Utils - * @argument {Object} offsets - * @returns {Object} ClientRect like output - */ -function getClientRect(offsets) { - return _extends({}, offsets, { - right: offsets.left + offsets.width, - bottom: offsets.top + offsets.height - }); -} - -/** - * Get bounding client rect of given element - * @method - * @memberof Popper.Utils - * @param {HTMLElement} element - * @return {Object} client rect - */ -function getBoundingClientRect(element) { - var rect = {}; - - // IE10 10 FIX: Please, don't ask, the element isn't - // considered in DOM in some circumstances... - // This isn't reproducible in IE10 compatibility mode of IE11 - try { - if (isIE(10)) { - rect = element.getBoundingClientRect(); - var scrollTop = getScroll(element, 'top'); - var scrollLeft = getScroll(element, 'left'); - rect.top += scrollTop; - rect.left += scrollLeft; - rect.bottom += scrollTop; - rect.right += scrollLeft; - } else { - rect = element.getBoundingClientRect(); - } - } catch (e) {} - - var result = { - left: rect.left, - top: rect.top, - width: rect.right - rect.left, - height: rect.bottom - rect.top - }; - - // subtract scrollbar size from sizes - var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; - var width = sizes.width || element.clientWidth || result.width; - var height = sizes.height || element.clientHeight || result.height; - - var horizScrollbar = element.offsetWidth - width; - var vertScrollbar = element.offsetHeight - height; - - // if an hypothetical scrollbar is detected, we must be sure it's not a `border` - // we make this check conditional for performance reasons - if (horizScrollbar || vertScrollbar) { - var styles = getStyleComputedProperty(element); - horizScrollbar -= getBordersSize(styles, 'x'); - vertScrollbar -= getBordersSize(styles, 'y'); - - result.width -= horizScrollbar; - result.height -= vertScrollbar; - } - - return getClientRect(result); -} - -function getOffsetRectRelativeToArbitraryNode(children, parent) { - var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var isIE10 = isIE(10); - var isHTML = parent.nodeName === 'HTML'; - var childrenRect = getBoundingClientRect(children); - var parentRect = getBoundingClientRect(parent); - var scrollParent = getScrollParent(children); - - var styles = getStyleComputedProperty(parent); - var borderTopWidth = parseFloat(styles.borderTopWidth); - var borderLeftWidth = parseFloat(styles.borderLeftWidth); - - // In cases where the parent is fixed, we must ignore negative scroll in offset calc - if (fixedPosition && isHTML) { - parentRect.top = Math.max(parentRect.top, 0); - parentRect.left = Math.max(parentRect.left, 0); - } - var offsets = getClientRect({ - top: childrenRect.top - parentRect.top - borderTopWidth, - left: childrenRect.left - parentRect.left - borderLeftWidth, - width: childrenRect.width, - height: childrenRect.height - }); - offsets.marginTop = 0; - offsets.marginLeft = 0; - - // Subtract margins of documentElement in case it's being used as parent - // we do this only on HTML because it's the only element that behaves - // differently when margins are applied to it. The margins are included in - // the box of the documentElement, in the other cases not. - if (!isIE10 && isHTML) { - var marginTop = parseFloat(styles.marginTop); - var marginLeft = parseFloat(styles.marginLeft); - - offsets.top -= borderTopWidth - marginTop; - offsets.bottom -= borderTopWidth - marginTop; - offsets.left -= borderLeftWidth - marginLeft; - offsets.right -= borderLeftWidth - marginLeft; - - // Attach marginTop and marginLeft because in some circumstances we may need them - offsets.marginTop = marginTop; - offsets.marginLeft = marginLeft; - } - - if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { - offsets = includeScroll(offsets, parent); - } - - return offsets; -} - -function getViewportOffsetRectRelativeToArtbitraryNode(element) { - var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var html = element.ownerDocument.documentElement; - var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); - var width = Math.max(html.clientWidth, window.innerWidth || 0); - var height = Math.max(html.clientHeight, window.innerHeight || 0); - - var scrollTop = !excludeScroll ? getScroll(html) : 0; - var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; - - var offset = { - top: scrollTop - relativeOffset.top + relativeOffset.marginTop, - left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, - width: width, - height: height - }; - - return getClientRect(offset); -} - -/** - * Check if the given element is fixed or is inside a fixed parent - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @argument {Element} customContainer - * @returns {Boolean} answer to "isFixed?" - */ -function isFixed(element) { - var nodeName = element.nodeName; - if (nodeName === 'BODY' || nodeName === 'HTML') { - return false; - } - if (getStyleComputedProperty(element, 'position') === 'fixed') { - return true; - } - var parentNode = getParentNode(element); - if (!parentNode) { - return false; - } - return isFixed(parentNode); -} - -/** - * Finds the first parent of an element that has a transformed property defined - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Element} first transformed parent or documentElement - */ - -function getFixedPositionOffsetParent(element) { - // This check is needed to avoid errors in case one of the elements isn't defined for any reason - if (!element || !element.parentElement || isIE()) { - return document.documentElement; - } - var el = element.parentElement; - while (el && getStyleComputedProperty(el, 'transform') === 'none') { - el = el.parentElement; - } - return el || document.documentElement; -} - -/** - * Computed the boundaries limits and return them - * @method - * @memberof Popper.Utils - * @param {HTMLElement} popper - * @param {HTMLElement} reference - * @param {number} padding - * @param {HTMLElement} boundariesElement - Element used to define the boundaries - * @param {Boolean} fixedPosition - Is in fixed position mode - * @returns {Object} Coordinates of the boundaries - */ -function getBoundaries(popper, reference, padding, boundariesElement) { - var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - - // NOTE: 1 DOM access here - - var boundaries = { top: 0, left: 0 }; - var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); - - // Handle viewport case - if (boundariesElement === 'viewport') { - boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); - } else { - // Handle other cases based on DOM element used as boundaries - var boundariesNode = void 0; - if (boundariesElement === 'scrollParent') { - boundariesNode = getScrollParent(getParentNode(reference)); - if (boundariesNode.nodeName === 'BODY') { - boundariesNode = popper.ownerDocument.documentElement; - } - } else if (boundariesElement === 'window') { - boundariesNode = popper.ownerDocument.documentElement; - } else { - boundariesNode = boundariesElement; - } - - var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); - - // In case of HTML, we need a different computation - if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { - var _getWindowSizes = getWindowSizes(popper.ownerDocument), - height = _getWindowSizes.height, - width = _getWindowSizes.width; - - boundaries.top += offsets.top - offsets.marginTop; - boundaries.bottom = height + offsets.top; - boundaries.left += offsets.left - offsets.marginLeft; - boundaries.right = width + offsets.left; - } else { - // for all the other DOM elements, this one is good - boundaries = offsets; - } - } - - // Add paddings - padding = padding || 0; - var isPaddingNumber = typeof padding === 'number'; - boundaries.left += isPaddingNumber ? padding : padding.left || 0; - boundaries.top += isPaddingNumber ? padding : padding.top || 0; - boundaries.right -= isPaddingNumber ? padding : padding.right || 0; - boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; - - return boundaries; -} - -function getArea(_ref) { - var width = _ref.width, - height = _ref.height; - - return width * height; -} - -/** - * Utility used to transform the `auto` placement to the placement with more - * available space. - * @method - * @memberof Popper.Utils - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { - var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - - if (placement.indexOf('auto') === -1) { - return placement; - } - - var boundaries = getBoundaries(popper, reference, padding, boundariesElement); - - var rects = { - top: { - width: boundaries.width, - height: refRect.top - boundaries.top - }, - right: { - width: boundaries.right - refRect.right, - height: boundaries.height - }, - bottom: { - width: boundaries.width, - height: boundaries.bottom - refRect.bottom - }, - left: { - width: refRect.left - boundaries.left, - height: boundaries.height - } - }; - - var sortedAreas = Object.keys(rects).map(function (key) { - return _extends({ - key: key - }, rects[key], { - area: getArea(rects[key]) - }); - }).sort(function (a, b) { - return b.area - a.area; - }); - - var filteredAreas = sortedAreas.filter(function (_ref2) { - var width = _ref2.width, - height = _ref2.height; - return width >= popper.clientWidth && height >= popper.clientHeight; - }); - - var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; - - var variation = placement.split('-')[1]; - - return computedPlacement + (variation ? '-' + variation : ''); -} - -/** - * Get offsets to the reference element - * @method - * @memberof Popper.Utils - * @param {Object} state - * @param {Element} popper - the popper element - * @param {Element} reference - the reference element (the popper will be relative to this) - * @param {Element} fixedPosition - is in fixed position mode - * @returns {Object} An object containing the offsets which will be applied to the popper - */ -function getReferenceOffsets(state, popper, reference) { - var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; - - var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); - return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); -} - -/** - * Get the outer sizes of the given element (offset size + margins) - * @method - * @memberof Popper.Utils - * @argument {Element} element - * @returns {Object} object containing width and height properties - */ -function getOuterSizes(element) { - var window = element.ownerDocument.defaultView; - var styles = window.getComputedStyle(element); - var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0); - var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0); - var result = { - width: element.offsetWidth + y, - height: element.offsetHeight + x - }; - return result; -} - -/** - * Get the opposite placement of the given one - * @method - * @memberof Popper.Utils - * @argument {String} placement - * @returns {String} flipped placement - */ -function getOppositePlacement(placement) { - var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; - return placement.replace(/left|right|bottom|top/g, function (matched) { - return hash[matched]; - }); -} - -/** - * Get offsets to the popper - * @method - * @memberof Popper.Utils - * @param {Object} position - CSS position the Popper will get applied - * @param {HTMLElement} popper - the popper element - * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) - * @param {String} placement - one of the valid placement options - * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper - */ -function getPopperOffsets(popper, referenceOffsets, placement) { - placement = placement.split('-')[0]; - - // Get popper node sizes - var popperRect = getOuterSizes(popper); - - // Add position, width and height to our offsets object - var popperOffsets = { - width: popperRect.width, - height: popperRect.height - }; - - // depending by the popper placement we have to compute its offsets slightly differently - var isHoriz = ['right', 'left'].indexOf(placement) !== -1; - var mainSide = isHoriz ? 'top' : 'left'; - var secondarySide = isHoriz ? 'left' : 'top'; - var measurement = isHoriz ? 'height' : 'width'; - var secondaryMeasurement = !isHoriz ? 'height' : 'width'; - - popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; - if (placement === secondarySide) { - popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; - } else { - popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; - } - - return popperOffsets; -} - -/** - * Mimics the `find` method of Array - * @method - * @memberof Popper.Utils - * @argument {Array} arr - * @argument prop - * @argument value - * @returns index or -1 - */ -function find(arr, check) { - // use native find if supported - if (Array.prototype.find) { - return arr.find(check); - } - - // use `filter` to obtain the same behavior of `find` - return arr.filter(check)[0]; -} - -/** - * Return the index of the matching object - * @method - * @memberof Popper.Utils - * @argument {Array} arr - * @argument prop - * @argument value - * @returns index or -1 - */ -function findIndex(arr, prop, value) { - // use native findIndex if supported - if (Array.prototype.findIndex) { - return arr.findIndex(function (cur) { - return cur[prop] === value; - }); - } - - // use `find` + `indexOf` if `findIndex` isn't supported - var match = find(arr, function (obj) { - return obj[prop] === value; - }); - return arr.indexOf(match); -} - -/** - * Loop trough the list of modifiers and run them in order, - * each of them will then edit the data object. - * @method - * @memberof Popper.Utils - * @param {dataObject} data - * @param {Array} modifiers - * @param {String} ends - Optional modifier name used as stopper - * @returns {dataObject} - */ -function runModifiers(modifiers, data, ends) { - var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); - - modifiersToRun.forEach(function (modifier) { - if (modifier['function']) { - // eslint-disable-line dot-notation - console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); - } - var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation - if (modifier.enabled && isFunction(fn)) { - // Add properties to offsets to make them a complete clientRect object - // we do this before each modifier to make sure the previous one doesn't - // mess with these values - data.offsets.popper = getClientRect(data.offsets.popper); - data.offsets.reference = getClientRect(data.offsets.reference); - - data = fn(data, modifier); - } - }); - - return data; -} - -/** - * Updates the position of the popper, computing the new offsets and applying - * the new style.
    - * Prefer `scheduleUpdate` over `update` because of performance reasons. - * @method - * @memberof Popper - */ -function update() { - // if popper is destroyed, don't perform any further update - if (this.state.isDestroyed) { - return; - } - - var data = { - instance: this, - styles: {}, - arrowStyles: {}, - attributes: {}, - flipped: false, - offsets: {} - }; - - // compute reference element offsets - data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); - - // compute auto placement, store placement inside the data object, - // modifiers will be able to edit `placement` if needed - // and refer to originalPlacement to know the original value - data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); - - // store the computed placement inside `originalPlacement` - data.originalPlacement = data.placement; - - data.positionFixed = this.options.positionFixed; - - // compute the popper offsets - data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); - - data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; - - // run the modifiers - data = runModifiers(this.modifiers, data); - - // the first `update` will call `onCreate` callback - // the other ones will call `onUpdate` callback - if (!this.state.isCreated) { - this.state.isCreated = true; - this.options.onCreate(data); - } else { - this.options.onUpdate(data); - } -} - -/** - * Helper used to know if the given modifier is enabled. - * @method - * @memberof Popper.Utils - * @returns {Boolean} - */ -function isModifierEnabled(modifiers, modifierName) { - return modifiers.some(function (_ref) { - var name = _ref.name, - enabled = _ref.enabled; - return enabled && name === modifierName; - }); -} - -/** - * Get the prefixed supported property name - * @method - * @memberof Popper.Utils - * @argument {String} property (camelCase) - * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) - */ -function getSupportedPropertyName(property) { - var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; - var upperProp = property.charAt(0).toUpperCase() + property.slice(1); - - for (var i = 0; i < prefixes.length; i++) { - var prefix = prefixes[i]; - var toCheck = prefix ? '' + prefix + upperProp : property; - if (typeof document.body.style[toCheck] !== 'undefined') { - return toCheck; - } - } - return null; -} - -/** - * Destroys the popper. - * @method - * @memberof Popper - */ -function destroy() { - this.state.isDestroyed = true; - - // touch DOM only if `applyStyle` modifier is enabled - if (isModifierEnabled(this.modifiers, 'applyStyle')) { - this.popper.removeAttribute('x-placement'); - this.popper.style.position = ''; - this.popper.style.top = ''; - this.popper.style.left = ''; - this.popper.style.right = ''; - this.popper.style.bottom = ''; - this.popper.style.willChange = ''; - this.popper.style[getSupportedPropertyName('transform')] = ''; - } - - this.disableEventListeners(); - - // remove the popper if user explicitly asked for the deletion on destroy - // do not use `remove` because IE11 doesn't support it - if (this.options.removeOnDestroy) { - this.popper.parentNode.removeChild(this.popper); - } - return this; -} - -/** - * Get the window associated with the element - * @argument {Element} element - * @returns {Window} - */ -function getWindow(element) { - var ownerDocument = element.ownerDocument; - return ownerDocument ? ownerDocument.defaultView : window; -} - -function attachToScrollParents(scrollParent, event, callback, scrollParents) { - var isBody = scrollParent.nodeName === 'BODY'; - var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; - target.addEventListener(event, callback, { passive: true }); - - if (!isBody) { - attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); - } - scrollParents.push(target); -} - -/** - * Setup needed event listeners used to update the popper position - * @method - * @memberof Popper.Utils - * @private - */ -function setupEventListeners(reference, options, state, updateBound) { - // Resize event listener on window - state.updateBound = updateBound; - getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); - - // Scroll event listener on scroll parents - var scrollElement = getScrollParent(reference); - attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); - state.scrollElement = scrollElement; - state.eventsEnabled = true; - - return state; -} - -/** - * It will add resize/scroll events and start recalculating - * position of the popper element when they are triggered. - * @method - * @memberof Popper - */ -function enableEventListeners() { - if (!this.state.eventsEnabled) { - this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); - } -} - -/** - * Remove event listeners used to update the popper position - * @method - * @memberof Popper.Utils - * @private - */ -function removeEventListeners(reference, state) { - // Remove resize event listener on window - getWindow(reference).removeEventListener('resize', state.updateBound); - - // Remove scroll event listener on scroll parents - state.scrollParents.forEach(function (target) { - target.removeEventListener('scroll', state.updateBound); - }); - - // Reset state - state.updateBound = null; - state.scrollParents = []; - state.scrollElement = null; - state.eventsEnabled = false; - return state; -} - -/** - * It will remove resize/scroll events and won't recalculate popper position - * when they are triggered. It also won't trigger `onUpdate` callback anymore, - * unless you call `update` method manually. - * @method - * @memberof Popper - */ -function disableEventListeners() { - if (this.state.eventsEnabled) { - cancelAnimationFrame(this.scheduleUpdate); - this.state = removeEventListeners(this.reference, this.state); - } -} - -/** - * Tells if a given input is a number - * @method - * @memberof Popper.Utils - * @param {*} input to check - * @return {Boolean} - */ -function isNumeric(n) { - return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); -} - -/** - * Set the style to the given popper - * @method - * @memberof Popper.Utils - * @argument {Element} element - Element to apply the style to - * @argument {Object} styles - * Object with a list of properties and values which will be applied to the element - */ -function setStyles(element, styles) { - Object.keys(styles).forEach(function (prop) { - var unit = ''; - // add unit if the value is numeric and is one of the following - if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { - unit = 'px'; - } - element.style[prop] = styles[prop] + unit; - }); -} - -/** - * Set the attributes to the given popper - * @method - * @memberof Popper.Utils - * @argument {Element} element - Element to apply the attributes to - * @argument {Object} styles - * Object with a list of properties and values which will be applied to the element - */ -function setAttributes(element, attributes) { - Object.keys(attributes).forEach(function (prop) { - var value = attributes[prop]; - if (value !== false) { - element.setAttribute(prop, attributes[prop]); - } else { - element.removeAttribute(prop); - } - }); -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} data.styles - List of style properties - values to apply to popper element - * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The same data object - */ -function applyStyle(data) { - // any property present in `data.styles` will be applied to the popper, - // in this way we can make the 3rd party modifiers add custom styles to it - // Be aware, modifiers could override the properties defined in the previous - // lines of this modifier! - setStyles(data.instance.popper, data.styles); - - // any property present in `data.attributes` will be applied to the popper, - // they will be set as HTML attributes of the element - setAttributes(data.instance.popper, data.attributes); - - // if arrowElement is defined and arrowStyles has some properties - if (data.arrowElement && Object.keys(data.arrowStyles).length) { - setStyles(data.arrowElement, data.arrowStyles); - } - - return data; -} - -/** - * Set the x-placement attribute before everything else because it could be used - * to add margins to the popper margins needs to be calculated to get the - * correct popper offsets. - * @method - * @memberof Popper.modifiers - * @param {HTMLElement} reference - The reference element used to position the popper - * @param {HTMLElement} popper - The HTML element used as popper - * @param {Object} options - Popper.js options - */ -function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { - // compute reference element offsets - var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); - - // compute auto placement, store placement inside the data object, - // modifiers will be able to edit `placement` if needed - // and refer to originalPlacement to know the original value - var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); - - popper.setAttribute('x-placement', placement); - - // Apply `position` to popper before anything else because - // without the position applied we can't guarantee correct computations - setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' }); - - return options; -} - -/** - * @function - * @memberof Popper.Utils - * @argument {Object} data - The data object generated by `update` method - * @argument {Boolean} shouldRound - If the offsets should be rounded at all - * @returns {Object} The popper's position offsets rounded - * - * The tale of pixel-perfect positioning. It's still not 100% perfect, but as - * good as it can be within reason. - * Discussion here: https://github.com/FezVrasta/popper.js/pull/715 - * - * Low DPI screens cause a popper to be blurry if not using full pixels (Safari - * as well on High DPI screens). - * - * Firefox prefers no rounding for positioning and does not have blurriness on - * high DPI screens. - * - * Only horizontal placement and left/right values need to be considered. - */ -function getRoundedOffsets(data, shouldRound) { - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - var round = Math.round, - floor = Math.floor; - - var noRound = function noRound(v) { - return v; - }; - - var referenceWidth = round(reference.width); - var popperWidth = round(popper.width); - - var isVertical = ['left', 'right'].indexOf(data.placement) !== -1; - var isVariation = data.placement.indexOf('-') !== -1; - var sameWidthParity = referenceWidth % 2 === popperWidth % 2; - var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1; - - var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor; - var verticalToInteger = !shouldRound ? noRound : round; - - return { - left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left), - top: verticalToInteger(popper.top), - bottom: verticalToInteger(popper.bottom), - right: horizontalToInteger(popper.right) - }; -} - -var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent); - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function computeStyle(data, options) { - var x = options.x, - y = options.y; - var popper = data.offsets.popper; - - // Remove this legacy support in Popper.js v2 - - var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { - return modifier.name === 'applyStyle'; - }).gpuAcceleration; - if (legacyGpuAccelerationOption !== undefined) { - console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); - } - var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; - - var offsetParent = getOffsetParent(data.instance.popper); - var offsetParentRect = getBoundingClientRect(offsetParent); - - // Styles - var styles = { - position: popper.position - }; - - var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox); - - var sideA = x === 'bottom' ? 'top' : 'bottom'; - var sideB = y === 'right' ? 'left' : 'right'; - - // if gpuAcceleration is set to `true` and transform is supported, - // we use `translate3d` to apply the position to the popper we - // automatically use the supported prefixed version if needed - var prefixedProperty = getSupportedPropertyName('transform'); - - // now, let's make a step back and look at this code closely (wtf?) - // If the content of the popper grows once it's been positioned, it - // may happen that the popper gets misplaced because of the new content - // overflowing its reference element - // To avoid this problem, we provide two options (x and y), which allow - // the consumer to define the offset origin. - // If we position a popper on top of a reference element, we can set - // `x` to `top` to make the popper grow towards its top instead of - // its bottom. - var left = void 0, - top = void 0; - if (sideA === 'bottom') { - // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar) - // and not the bottom of the html element - if (offsetParent.nodeName === 'HTML') { - top = -offsetParent.clientHeight + offsets.bottom; - } else { - top = -offsetParentRect.height + offsets.bottom; - } - } else { - top = offsets.top; - } - if (sideB === 'right') { - if (offsetParent.nodeName === 'HTML') { - left = -offsetParent.clientWidth + offsets.right; - } else { - left = -offsetParentRect.width + offsets.right; - } - } else { - left = offsets.left; - } - if (gpuAcceleration && prefixedProperty) { - styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; - styles[sideA] = 0; - styles[sideB] = 0; - styles.willChange = 'transform'; - } else { - // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties - var invertTop = sideA === 'bottom' ? -1 : 1; - var invertLeft = sideB === 'right' ? -1 : 1; - styles[sideA] = top * invertTop; - styles[sideB] = left * invertLeft; - styles.willChange = sideA + ', ' + sideB; - } - - // Attributes - var attributes = { - 'x-placement': data.placement - }; - - // Update `data` attributes, styles and arrowStyles - data.attributes = _extends({}, attributes, data.attributes); - data.styles = _extends({}, styles, data.styles); - data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles); - - return data; -} - -/** - * Helper used to know if the given modifier depends from another one.
    - * It checks if the needed modifier is listed and enabled. - * @method - * @memberof Popper.Utils - * @param {Array} modifiers - list of modifiers - * @param {String} requestingName - name of requesting modifier - * @param {String} requestedName - name of requested modifier - * @returns {Boolean} - */ -function isModifierRequired(modifiers, requestingName, requestedName) { - var requesting = find(modifiers, function (_ref) { - var name = _ref.name; - return name === requestingName; - }); - - var isRequired = !!requesting && modifiers.some(function (modifier) { - return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; - }); - - if (!isRequired) { - var _requesting = '`' + requestingName + '`'; - var requested = '`' + requestedName + '`'; - console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); - } - return isRequired; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function arrow(data, options) { - var _data$offsets$arrow; - - // arrow depends on keepTogether in order to work - if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { - return data; - } - - var arrowElement = options.element; - - // if arrowElement is a string, suppose it's a CSS selector - if (typeof arrowElement === 'string') { - arrowElement = data.instance.popper.querySelector(arrowElement); - - // if arrowElement is not found, don't run the modifier - if (!arrowElement) { - return data; - } - } else { - // if the arrowElement isn't a query selector we must check that the - // provided DOM node is child of its popper node - if (!data.instance.popper.contains(arrowElement)) { - console.warn('WARNING: `arrow.element` must be child of its popper element!'); - return data; - } - } - - var placement = data.placement.split('-')[0]; - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var isVertical = ['left', 'right'].indexOf(placement) !== -1; - - var len = isVertical ? 'height' : 'width'; - var sideCapitalized = isVertical ? 'Top' : 'Left'; - var side = sideCapitalized.toLowerCase(); - var altSide = isVertical ? 'left' : 'top'; - var opSide = isVertical ? 'bottom' : 'right'; - var arrowElementSize = getOuterSizes(arrowElement)[len]; - - // - // extends keepTogether behavior making sure the popper and its - // reference have enough pixels in conjunction - // - - // top/left side - if (reference[opSide] - arrowElementSize < popper[side]) { - data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); - } - // bottom/right side - if (reference[side] + arrowElementSize > popper[opSide]) { - data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; - } - data.offsets.popper = getClientRect(data.offsets.popper); - - // compute center of the popper - var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; - - // Compute the sideValue using the updated popper offsets - // take popper margin in account because we don't have this info available - var css = getStyleComputedProperty(data.instance.popper); - var popperMarginSide = parseFloat(css['margin' + sideCapitalized]); - var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']); - var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; - - // prevent arrowElement from being placed not contiguously to its popper - sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); - - data.arrowElement = arrowElement; - data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); - - return data; -} - -/** - * Get the opposite placement variation of the given one - * @method - * @memberof Popper.Utils - * @argument {String} placement variation - * @returns {String} flipped placement variation - */ -function getOppositeVariation(variation) { - if (variation === 'end') { - return 'start'; - } else if (variation === 'start') { - return 'end'; - } - return variation; -} - -/** - * List of accepted placements to use as values of the `placement` option.
    - * Valid placements are: - * - `auto` - * - `top` - * - `right` - * - `bottom` - * - `left` - * - * Each placement can have a variation from this list: - * - `-start` - * - `-end` - * - * Variations are interpreted easily if you think of them as the left to right - * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` - * is right.
    - * Vertically (`left` and `right`), `start` is top and `end` is bottom. - * - * Some valid examples are: - * - `top-end` (on top of reference, right aligned) - * - `right-start` (on right of reference, top aligned) - * - `bottom` (on bottom, centered) - * - `auto-end` (on the side with more space available, alignment depends by placement) - * - * @static - * @type {Array} - * @enum {String} - * @readonly - * @method placements - * @memberof Popper - */ -var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; - -// Get rid of `auto` `auto-start` and `auto-end` -var validPlacements = placements.slice(3); - -/** - * Given an initial placement, returns all the subsequent placements - * clockwise (or counter-clockwise). - * - * @method - * @memberof Popper.Utils - * @argument {String} placement - A valid placement (it accepts variations) - * @argument {Boolean} counter - Set to true to walk the placements counterclockwise - * @returns {Array} placements including their variations - */ -function clockwise(placement) { - var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var index = validPlacements.indexOf(placement); - var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); - return counter ? arr.reverse() : arr; -} - -var BEHAVIORS = { - FLIP: 'flip', - CLOCKWISE: 'clockwise', - COUNTERCLOCKWISE: 'counterclockwise' -}; - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function flip(data, options) { - // if `inner` modifier is enabled, we can't use the `flip` modifier - if (isModifierEnabled(data.instance.modifiers, 'inner')) { - return data; - } - - if (data.flipped && data.placement === data.originalPlacement) { - // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides - return data; - } - - var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); - - var placement = data.placement.split('-')[0]; - var placementOpposite = getOppositePlacement(placement); - var variation = data.placement.split('-')[1] || ''; - - var flipOrder = []; - - switch (options.behavior) { - case BEHAVIORS.FLIP: - flipOrder = [placement, placementOpposite]; - break; - case BEHAVIORS.CLOCKWISE: - flipOrder = clockwise(placement); - break; - case BEHAVIORS.COUNTERCLOCKWISE: - flipOrder = clockwise(placement, true); - break; - default: - flipOrder = options.behavior; - } - - flipOrder.forEach(function (step, index) { - if (placement !== step || flipOrder.length === index + 1) { - return data; - } - - placement = data.placement.split('-')[0]; - placementOpposite = getOppositePlacement(placement); - - var popperOffsets = data.offsets.popper; - var refOffsets = data.offsets.reference; - - // using floor because the reference offsets may contain decimals we are not going to consider here - var floor = Math.floor; - var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); - - var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); - var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); - var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); - var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); - - var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; - - // flip the variation if required - var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; - - // flips variation if reference element overflows boundaries - var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); - - // flips variation if popper content overflows boundaries - var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop); - - var flippedVariation = flippedVariationByRef || flippedVariationByContent; - - if (overlapsRef || overflowsBoundaries || flippedVariation) { - // this boolean to detect any flip loop - data.flipped = true; - - if (overlapsRef || overflowsBoundaries) { - placement = flipOrder[index + 1]; - } - - if (flippedVariation) { - variation = getOppositeVariation(variation); - } - - data.placement = placement + (variation ? '-' + variation : ''); - - // this object contains `position`, we want to preserve it along with - // any additional property we may add in the future - data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); - - data = runModifiers(data.instance.modifiers, data, 'flip'); - } - }); - return data; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function keepTogether(data) { - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var placement = data.placement.split('-')[0]; - var floor = Math.floor; - var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; - var side = isVertical ? 'right' : 'bottom'; - var opSide = isVertical ? 'left' : 'top'; - var measurement = isVertical ? 'width' : 'height'; - - if (popper[side] < floor(reference[opSide])) { - data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; - } - if (popper[opSide] > floor(reference[side])) { - data.offsets.popper[opSide] = floor(reference[side]); - } - - return data; -} - -/** - * Converts a string containing value + unit into a px value number - * @function - * @memberof {modifiers~offset} - * @private - * @argument {String} str - Value + unit string - * @argument {String} measurement - `height` or `width` - * @argument {Object} popperOffsets - * @argument {Object} referenceOffsets - * @returns {Number|String} - * Value in pixels, or original string if no values were extracted - */ -function toValue(str, measurement, popperOffsets, referenceOffsets) { - // separate value from unit - var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); - var value = +split[1]; - var unit = split[2]; - - // If it's not a number it's an operator, I guess - if (!value) { - return str; - } - - if (unit.indexOf('%') === 0) { - var element = void 0; - switch (unit) { - case '%p': - element = popperOffsets; - break; - case '%': - case '%r': - default: - element = referenceOffsets; - } - - var rect = getClientRect(element); - return rect[measurement] / 100 * value; - } else if (unit === 'vh' || unit === 'vw') { - // if is a vh or vw, we calculate the size based on the viewport - var size = void 0; - if (unit === 'vh') { - size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); - } else { - size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); - } - return size / 100 * value; - } else { - // if is an explicit pixel unit, we get rid of the unit and keep the value - // if is an implicit unit, it's px, and we return just the value - return value; - } -} - -/** - * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. - * @function - * @memberof {modifiers~offset} - * @private - * @argument {String} offset - * @argument {Object} popperOffsets - * @argument {Object} referenceOffsets - * @argument {String} basePlacement - * @returns {Array} a two cells array with x and y offsets in numbers - */ -function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { - var offsets = [0, 0]; - - // Use height if placement is left or right and index is 0 otherwise use width - // in this way the first offset will use an axis and the second one - // will use the other one - var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; - - // Split the offset string to obtain a list of values and operands - // The regex addresses values with the plus or minus sign in front (+10, -20, etc) - var fragments = offset.split(/(\+|\-)/).map(function (frag) { - return frag.trim(); - }); - - // Detect if the offset string contains a pair of values or a single one - // they could be separated by comma or space - var divider = fragments.indexOf(find(fragments, function (frag) { - return frag.search(/,|\s/) !== -1; - })); - - if (fragments[divider] && fragments[divider].indexOf(',') === -1) { - console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); - } - - // If divider is found, we divide the list of values and operands to divide - // them by ofset X and Y. - var splitRegex = /\s*,\s*|\s+/; - var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; - - // Convert the values with units to absolute pixels to allow our computations - ops = ops.map(function (op, index) { - // Most of the units rely on the orientation of the popper - var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; - var mergeWithPrevious = false; - return op - // This aggregates any `+` or `-` sign that aren't considered operators - // e.g.: 10 + +5 => [10, +, +5] - .reduce(function (a, b) { - if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { - a[a.length - 1] = b; - mergeWithPrevious = true; - return a; - } else if (mergeWithPrevious) { - a[a.length - 1] += b; - mergeWithPrevious = false; - return a; - } else { - return a.concat(b); - } - }, []) - // Here we convert the string values into number values (in px) - .map(function (str) { - return toValue(str, measurement, popperOffsets, referenceOffsets); - }); - }); - - // Loop trough the offsets arrays and execute the operations - ops.forEach(function (op, index) { - op.forEach(function (frag, index2) { - if (isNumeric(frag)) { - offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); - } - }); - }); - return offsets; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @argument {Number|String} options.offset=0 - * The offset value as described in the modifier description - * @returns {Object} The data object, properly modified - */ -function offset(data, _ref) { - var offset = _ref.offset; - var placement = data.placement, - _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var basePlacement = placement.split('-')[0]; - - var offsets = void 0; - if (isNumeric(+offset)) { - offsets = [+offset, 0]; - } else { - offsets = parseOffset(offset, popper, reference, basePlacement); - } - - if (basePlacement === 'left') { - popper.top += offsets[0]; - popper.left -= offsets[1]; - } else if (basePlacement === 'right') { - popper.top += offsets[0]; - popper.left += offsets[1]; - } else if (basePlacement === 'top') { - popper.left += offsets[0]; - popper.top -= offsets[1]; - } else if (basePlacement === 'bottom') { - popper.left += offsets[0]; - popper.top += offsets[1]; - } - - data.popper = popper; - return data; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function preventOverflow(data, options) { - var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); - - // If offsetParent is the reference element, we really want to - // go one step up and use the next offsetParent as reference to - // avoid to make this modifier completely useless and look like broken - if (data.instance.reference === boundariesElement) { - boundariesElement = getOffsetParent(boundariesElement); - } - - // NOTE: DOM access here - // resets the popper's position so that the document size can be calculated excluding - // the size of the popper element itself - var transformProp = getSupportedPropertyName('transform'); - var popperStyles = data.instance.popper.style; // assignment to help minification - var top = popperStyles.top, - left = popperStyles.left, - transform = popperStyles[transformProp]; - - popperStyles.top = ''; - popperStyles.left = ''; - popperStyles[transformProp] = ''; - - var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); - - // NOTE: DOM access here - // restores the original style properties after the offsets have been computed - popperStyles.top = top; - popperStyles.left = left; - popperStyles[transformProp] = transform; - - options.boundaries = boundaries; - - var order = options.priority; - var popper = data.offsets.popper; - - var check = { - primary: function primary(placement) { - var value = popper[placement]; - if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { - value = Math.max(popper[placement], boundaries[placement]); - } - return defineProperty({}, placement, value); - }, - secondary: function secondary(placement) { - var mainSide = placement === 'right' ? 'left' : 'top'; - var value = popper[mainSide]; - if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { - value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); - } - return defineProperty({}, mainSide, value); - } - }; - - order.forEach(function (placement) { - var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; - popper = _extends({}, popper, check[side](placement)); - }); - - data.offsets.popper = popper; - - return data; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function shift(data) { - var placement = data.placement; - var basePlacement = placement.split('-')[0]; - var shiftvariation = placement.split('-')[1]; - - // if shift shiftvariation is specified, run the modifier - if (shiftvariation) { - var _data$offsets = data.offsets, - reference = _data$offsets.reference, - popper = _data$offsets.popper; - - var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; - var side = isVertical ? 'left' : 'top'; - var measurement = isVertical ? 'width' : 'height'; - - var shiftOffsets = { - start: defineProperty({}, side, reference[side]), - end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) - }; - - data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]); - } - - return data; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by update method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function hide(data) { - if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { - return data; - } - - var refRect = data.offsets.reference; - var bound = find(data.instance.modifiers, function (modifier) { - return modifier.name === 'preventOverflow'; - }).boundaries; - - if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { - // Avoid unnecessary DOM access if visibility hasn't changed - if (data.hide === true) { - return data; - } - - data.hide = true; - data.attributes['x-out-of-boundaries'] = ''; - } else { - // Avoid unnecessary DOM access if visibility hasn't changed - if (data.hide === false) { - return data; - } - - data.hide = false; - data.attributes['x-out-of-boundaries'] = false; - } - - return data; -} - -/** - * @function - * @memberof Modifiers - * @argument {Object} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {Object} The data object, properly modified - */ -function inner(data) { - var placement = data.placement; - var basePlacement = placement.split('-')[0]; - var _data$offsets = data.offsets, - popper = _data$offsets.popper, - reference = _data$offsets.reference; - - var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; - - var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; - - popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); - - data.placement = getOppositePlacement(placement); - data.offsets.popper = getClientRect(popper); - - return data; -} - -/** - * Modifier function, each modifier can have a function of this type assigned - * to its `fn` property.
    - * These functions will be called on each update, this means that you must - * make sure they are performant enough to avoid performance bottlenecks. - * - * @function ModifierFn - * @argument {dataObject} data - The data object generated by `update` method - * @argument {Object} options - Modifiers configuration and options - * @returns {dataObject} The data object, properly modified - */ - -/** - * Modifiers are plugins used to alter the behavior of your poppers.
    - * Popper.js uses a set of 9 modifiers to provide all the basic functionalities - * needed by the library. - * - * Usually you don't want to override the `order`, `fn` and `onLoad` props. - * All the other properties are configurations that could be tweaked. - * @namespace modifiers - */ -var modifiers = { - /** - * Modifier used to shift the popper on the start or end of its reference - * element.
    - * It will read the variation of the `placement` property.
    - * It can be one either `-end` or `-start`. - * @memberof modifiers - * @inner - */ - shift: { - /** @prop {number} order=100 - Index used to define the order of execution */ - order: 100, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: shift - }, - - /** - * The `offset` modifier can shift your popper on both its axis. - * - * It accepts the following units: - * - `px` or unit-less, interpreted as pixels - * - `%` or `%r`, percentage relative to the length of the reference element - * - `%p`, percentage relative to the length of the popper element - * - `vw`, CSS viewport width unit - * - `vh`, CSS viewport height unit - * - * For length is intended the main axis relative to the placement of the popper.
    - * This means that if the placement is `top` or `bottom`, the length will be the - * `width`. In case of `left` or `right`, it will be the `height`. - * - * You can provide a single value (as `Number` or `String`), or a pair of values - * as `String` divided by a comma or one (or more) white spaces.
    - * The latter is a deprecated method because it leads to confusion and will be - * removed in v2.
    - * Additionally, it accepts additions and subtractions between different units. - * Note that multiplications and divisions aren't supported. - * - * Valid examples are: - * ``` - * 10 - * '10%' - * '10, 10' - * '10%, 10' - * '10 + 10%' - * '10 - 5vh + 3%' - * '-10px + 5vh, 5px - 6%' - * ``` - * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap - * > with their reference element, unfortunately, you will have to disable the `flip` modifier. - * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). - * - * @memberof modifiers - * @inner - */ - offset: { - /** @prop {number} order=200 - Index used to define the order of execution */ - order: 200, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: offset, - /** @prop {Number|String} offset=0 - * The offset value as described in the modifier description - */ - offset: 0 - }, - - /** - * Modifier used to prevent the popper from being positioned outside the boundary. - * - * A scenario exists where the reference itself is not within the boundaries.
    - * We can say it has "escaped the boundaries" — or just "escaped".
    - * In this case we need to decide whether the popper should either: - * - * - detach from the reference and remain "trapped" in the boundaries, or - * - if it should ignore the boundary and "escape with its reference" - * - * When `escapeWithReference` is set to`true` and reference is completely - * outside its boundaries, the popper will overflow (or completely leave) - * the boundaries in order to remain attached to the edge of the reference. - * - * @memberof modifiers - * @inner - */ - preventOverflow: { - /** @prop {number} order=300 - Index used to define the order of execution */ - order: 300, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: preventOverflow, - /** - * @prop {Array} [priority=['left','right','top','bottom']] - * Popper will try to prevent overflow following these priorities by default, - * then, it could overflow on the left and on top of the `boundariesElement` - */ - priority: ['left', 'right', 'top', 'bottom'], - /** - * @prop {number} padding=5 - * Amount of pixel used to define a minimum distance between the boundaries - * and the popper. This makes sure the popper always has a little padding - * between the edges of its container - */ - padding: 5, - /** - * @prop {String|HTMLElement} boundariesElement='scrollParent' - * Boundaries used by the modifier. Can be `scrollParent`, `window`, - * `viewport` or any DOM element. - */ - boundariesElement: 'scrollParent' - }, - - /** - * Modifier used to make sure the reference and its popper stay near each other - * without leaving any gap between the two. Especially useful when the arrow is - * enabled and you want to ensure that it points to its reference element. - * It cares only about the first axis. You can still have poppers with margin - * between the popper and its reference element. - * @memberof modifiers - * @inner - */ - keepTogether: { - /** @prop {number} order=400 - Index used to define the order of execution */ - order: 400, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: keepTogether - }, - - /** - * This modifier is used to move the `arrowElement` of the popper to make - * sure it is positioned between the reference element and its popper element. - * It will read the outer size of the `arrowElement` node to detect how many - * pixels of conjunction are needed. - * - * It has no effect if no `arrowElement` is provided. - * @memberof modifiers - * @inner - */ - arrow: { - /** @prop {number} order=500 - Index used to define the order of execution */ - order: 500, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: arrow, - /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ - element: '[x-arrow]' - }, - - /** - * Modifier used to flip the popper's placement when it starts to overlap its - * reference element. - * - * Requires the `preventOverflow` modifier before it in order to work. - * - * **NOTE:** this modifier will interrupt the current update cycle and will - * restart it if it detects the need to flip the placement. - * @memberof modifiers - * @inner - */ - flip: { - /** @prop {number} order=600 - Index used to define the order of execution */ - order: 600, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: flip, - /** - * @prop {String|Array} behavior='flip' - * The behavior used to change the popper's placement. It can be one of - * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid - * placements (with optional variations) - */ - behavior: 'flip', - /** - * @prop {number} padding=5 - * The popper will flip if it hits the edges of the `boundariesElement` - */ - padding: 5, - /** - * @prop {String|HTMLElement} boundariesElement='viewport' - * The element which will define the boundaries of the popper position. - * The popper will never be placed outside of the defined boundaries - * (except if `keepTogether` is enabled) - */ - boundariesElement: 'viewport', - /** - * @prop {Boolean} flipVariations=false - * The popper will switch placement variation between `-start` and `-end` when - * the reference element overlaps its boundaries. - * - * The original placement should have a set variation. - */ - flipVariations: false, - /** - * @prop {Boolean} flipVariationsByContent=false - * The popper will switch placement variation between `-start` and `-end` when - * the popper element overlaps its reference boundaries. - * - * The original placement should have a set variation. - */ - flipVariationsByContent: false - }, - - /** - * Modifier used to make the popper flow toward the inner of the reference element. - * By default, when this modifier is disabled, the popper will be placed outside - * the reference element. - * @memberof modifiers - * @inner - */ - inner: { - /** @prop {number} order=700 - Index used to define the order of execution */ - order: 700, - /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ - enabled: false, - /** @prop {ModifierFn} */ - fn: inner - }, - - /** - * Modifier used to hide the popper when its reference element is outside of the - * popper boundaries. It will set a `x-out-of-boundaries` attribute which can - * be used to hide with a CSS selector the popper when its reference is - * out of boundaries. - * - * Requires the `preventOverflow` modifier before it in order to work. - * @memberof modifiers - * @inner - */ - hide: { - /** @prop {number} order=800 - Index used to define the order of execution */ - order: 800, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: hide - }, - - /** - * Computes the style that will be applied to the popper element to gets - * properly positioned. - * - * Note that this modifier will not touch the DOM, it just prepares the styles - * so that `applyStyle` modifier can apply it. This separation is useful - * in case you need to replace `applyStyle` with a custom implementation. - * - * This modifier has `850` as `order` value to maintain backward compatibility - * with previous versions of Popper.js. Expect the modifiers ordering method - * to change in future major versions of the library. - * - * @memberof modifiers - * @inner - */ - computeStyle: { - /** @prop {number} order=850 - Index used to define the order of execution */ - order: 850, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: computeStyle, - /** - * @prop {Boolean} gpuAcceleration=true - * If true, it uses the CSS 3D transformation to position the popper. - * Otherwise, it will use the `top` and `left` properties - */ - gpuAcceleration: true, - /** - * @prop {string} [x='bottom'] - * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. - * Change this if your popper should grow in a direction different from `bottom` - */ - x: 'bottom', - /** - * @prop {string} [x='left'] - * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. - * Change this if your popper should grow in a direction different from `right` - */ - y: 'right' - }, - - /** - * Applies the computed styles to the popper element. - * - * All the DOM manipulations are limited to this modifier. This is useful in case - * you want to integrate Popper.js inside a framework or view library and you - * want to delegate all the DOM manipulations to it. - * - * Note that if you disable this modifier, you must make sure the popper element - * has its position set to `absolute` before Popper.js can do its work! - * - * Just disable this modifier and define your own to achieve the desired effect. - * - * @memberof modifiers - * @inner - */ - applyStyle: { - /** @prop {number} order=900 - Index used to define the order of execution */ - order: 900, - /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ - enabled: true, - /** @prop {ModifierFn} */ - fn: applyStyle, - /** @prop {Function} */ - onLoad: applyStyleOnLoad, - /** - * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier - * @prop {Boolean} gpuAcceleration=true - * If true, it uses the CSS 3D transformation to position the popper. - * Otherwise, it will use the `top` and `left` properties - */ - gpuAcceleration: undefined - } -}; - -/** - * The `dataObject` is an object containing all the information used by Popper.js. - * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. - * @name dataObject - * @property {Object} data.instance The Popper.js instance - * @property {String} data.placement Placement applied to popper - * @property {String} data.originalPlacement Placement originally defined on init - * @property {Boolean} data.flipped True if popper has been flipped by flip modifier - * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper - * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier - * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) - * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) - * @property {Object} data.boundaries Offsets of the popper boundaries - * @property {Object} data.offsets The measurements of popper, reference and arrow elements - * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values - * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values - * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 - */ - -/** - * Default options provided to Popper.js constructor.
    - * These can be overridden using the `options` argument of Popper.js.
    - * To override an option, simply pass an object with the same - * structure of the `options` object, as the 3rd argument. For example: - * ``` - * new Popper(ref, pop, { - * modifiers: { - * preventOverflow: { enabled: false } - * } - * }) - * ``` - * @type {Object} - * @static - * @memberof Popper - */ -var Defaults = { - /** - * Popper's placement. - * @prop {Popper.placements} placement='bottom' - */ - placement: 'bottom', - - /** - * Set this to true if you want popper to position it self in 'fixed' mode - * @prop {Boolean} positionFixed=false - */ - positionFixed: false, - - /** - * Whether events (resize, scroll) are initially enabled. - * @prop {Boolean} eventsEnabled=true - */ - eventsEnabled: true, - - /** - * Set to true if you want to automatically remove the popper when - * you call the `destroy` method. - * @prop {Boolean} removeOnDestroy=false - */ - removeOnDestroy: false, - - /** - * Callback called when the popper is created.
    - * By default, it is set to no-op.
    - * Access Popper.js instance with `data.instance`. - * @prop {onCreate} - */ - onCreate: function onCreate() {}, - - /** - * Callback called when the popper is updated. This callback is not called - * on the initialization/creation of the popper, but only on subsequent - * updates.
    - * By default, it is set to no-op.
    - * Access Popper.js instance with `data.instance`. - * @prop {onUpdate} - */ - onUpdate: function onUpdate() {}, - - /** - * List of modifiers used to modify the offsets before they are applied to the popper. - * They provide most of the functionalities of Popper.js. - * @prop {modifiers} - */ - modifiers: modifiers -}; - -/** - * @callback onCreate - * @param {dataObject} data - */ - -/** - * @callback onUpdate - * @param {dataObject} data - */ - -// Utils -// Methods -var Popper = function () { - /** - * Creates a new Popper.js instance. - * @class Popper - * @param {Element|referenceObject} reference - The reference element used to position the popper - * @param {Element} popper - The HTML / XML element used as the popper - * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) - * @return {Object} instance - The generated Popper.js instance - */ - function Popper(reference, popper) { - var _this = this; - - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - classCallCheck(this, Popper); - - this.scheduleUpdate = function () { - return requestAnimationFrame(_this.update); - }; - - // make update() debounced, so that it only runs at most once-per-tick - this.update = debounce(this.update.bind(this)); - - // with {} we create a new object with the options inside it - this.options = _extends({}, Popper.Defaults, options); - - // init state - this.state = { - isDestroyed: false, - isCreated: false, - scrollParents: [] - }; - - // get reference and popper elements (allow jQuery wrappers) - this.reference = reference && reference.jquery ? reference[0] : reference; - this.popper = popper && popper.jquery ? popper[0] : popper; - - // Deep merge modifiers options - this.options.modifiers = {}; - Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { - _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); - }); - - // Refactoring modifiers' list (Object => Array) - this.modifiers = Object.keys(this.options.modifiers).map(function (name) { - return _extends({ - name: name - }, _this.options.modifiers[name]); - }) - // sort the modifiers by order - .sort(function (a, b) { - return a.order - b.order; - }); - - // modifiers have the ability to execute arbitrary code when Popper.js get inited - // such code is executed in the same order of its modifier - // they could add new properties to their options configuration - // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! - this.modifiers.forEach(function (modifierOptions) { - if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { - modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); - } - }); - - // fire the first update to position the popper in the right place - this.update(); - - var eventsEnabled = this.options.eventsEnabled; - if (eventsEnabled) { - // setup event listeners, they will take care of update the position in specific situations - this.enableEventListeners(); - } - - this.state.eventsEnabled = eventsEnabled; - } - - // We can't use class properties because they don't get listed in the - // class prototype and break stuff like Sinon stubs - - - createClass(Popper, [{ - key: 'update', - value: function update$$1() { - return update.call(this); - } - }, { - key: 'destroy', - value: function destroy$$1() { - return destroy.call(this); - } - }, { - key: 'enableEventListeners', - value: function enableEventListeners$$1() { - return enableEventListeners.call(this); - } - }, { - key: 'disableEventListeners', - value: function disableEventListeners$$1() { - return disableEventListeners.call(this); - } - - /** - * Schedules an update. It will run on the next UI update available. - * @method scheduleUpdate - * @memberof Popper - */ - - - /** - * Collection of utilities useful when writing custom modifiers. - * Starting from version 1.7, this method is available only if you - * include `popper-utils.js` before `popper.js`. - * - * **DEPRECATION**: This way to access PopperUtils is deprecated - * and will be removed in v2! Use the PopperUtils module directly instead. - * Due to the high instability of the methods contained in Utils, we can't - * guarantee them to follow semver. Use them at your own risk! - * @static - * @private - * @type {Object} - * @deprecated since version 1.8 - * @member Utils - * @memberof Popper - */ - - }]); - return Popper; -}(); - -/** - * The `referenceObject` is an object that provides an interface compatible with Popper.js - * and lets you use it as replacement of a real DOM node.
    - * You can use this method to position a popper relatively to a set of coordinates - * in case you don't have a DOM node to use as reference. - * - * ``` - * new Popper(referenceObject, popperNode); - * ``` - * - * NB: This feature isn't supported in Internet Explorer 10. - * @name referenceObject - * @property {Function} data.getBoundingClientRect - * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. - * @property {number} data.clientWidth - * An ES6 getter that will return the width of the virtual reference element. - * @property {number} data.clientHeight - * An ES6 getter that will return the height of the virtual reference element. - */ - - -Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; -Popper.placements = placements; -Popper.Defaults = Defaults; - -return Popper; - -}))); - - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],6:[function(require,module,exports){ -(function (process){(function (){ -/**! -* tippy.js v5.2.1 -* (c) 2017-2020 atomiks -* MIT License -*/ -'use strict'; - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var Popper = _interopDefault(require('popper.js')); - -function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - return _extends.apply(this, arguments); -} - -var version = "5.2.1"; - -/** - * Triggers reflow - */ -function reflow(element) { - void element.offsetHeight; -} -/** - * Sets the innerHTML of an element - */ - -function setInnerHTML(element, html) { - element[innerHTML()] = html; -} -/** - * Determines if the value is a reference element - */ - -function isReferenceElement(value) { - return !!(value && value._tippy && value._tippy.reference === value); -} -/** - * Safe .hasOwnProperty check, for prototype-less objects - */ - -function hasOwnProperty(obj, key) { - return {}.hasOwnProperty.call(obj, key); -} -/** - * Returns an array of elements based on the value - */ - -function getArrayOfElements(value) { - if (isElement(value)) { - return [value]; - } - - if (isNodeList(value)) { - return arrayFrom(value); - } - - if (Array.isArray(value)) { - return value; - } - - return arrayFrom(document.querySelectorAll(value)); -} -/** - * Returns a value at a given index depending on if it's an array or number - */ - -function getValueAtIndexOrReturn(value, index, defaultValue) { - if (Array.isArray(value)) { - var v = value[index]; - return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v; - } - - return value; -} -/** - * Prevents errors from being thrown while accessing nested modifier objects - * in `popperOptions` - */ - -function getModifier(obj, key) { - return obj && obj.modifiers && obj.modifiers[key]; -} -/** - * Determines if the value is of type - */ - -function isType(value, type) { - var str = {}.toString.call(value); - return str.indexOf('[object') === 0 && str.indexOf(type + "]") > -1; -} -/** - * Determines if the value is of type Element - */ - -function isElement(value) { - return isType(value, 'Element'); -} -/** - * Determines if the value is of type NodeList - */ - -function isNodeList(value) { - return isType(value, 'NodeList'); -} -/** - * Determines if the value is of type MouseEvent - */ - -function isMouseEvent(value) { - return isType(value, 'MouseEvent'); -} -/** - * Firefox extensions don't allow setting .innerHTML directly, this will trick - * it - */ - -function innerHTML() { - return 'innerHTML'; -} -/** - * Evaluates a function if one, or returns the value - */ - -function invokeWithArgsOrReturn(value, args) { - return typeof value === 'function' ? value.apply(void 0, args) : value; -} -/** - * Sets a popperInstance modifier's property to a value - */ - -function setModifierValue(modifiers, name, property, value) { - modifiers.filter(function (m) { - return m.name === name; - })[0][property] = value; -} -/** - * Returns a new `div` element - */ - -function div() { - return document.createElement('div'); -} -/** - * Applies a transition duration to a list of elements - */ - -function setTransitionDuration(els, value) { - els.forEach(function (el) { - if (el) { - el.style.transitionDuration = value + "ms"; - } - }); -} -/** - * Sets the visibility state to elements so they can begin to transition - */ - -function setVisibilityState(els, state) { - els.forEach(function (el) { - if (el) { - el.setAttribute('data-state', state); - } - }); -} -/** - * Debounce utility. To avoid bloating bundle size, we're only passing 1 - * argument here, a more generic function would pass all arguments. Only - * `onMouseMove` uses this which takes the event object for now. - */ - -function debounce(fn, ms) { - // Avoid wrapping in `setTimeout` if ms is 0 anyway - if (ms === 0) { - return fn; - } - - var timeout; - return function (arg) { - clearTimeout(timeout); - timeout = setTimeout(function () { - fn(arg); - }, ms); - }; -} -/** - * Preserves the original function invocation when another function replaces it - */ - -function preserveInvocation(originalFn, currentFn, args) { - if (originalFn && originalFn !== currentFn) { - originalFn.apply(void 0, args); - } -} -/** - * Deletes properties from an object (pure) - */ - -function removeProperties(obj, keys) { - var clone = _extends({}, obj); - - keys.forEach(function (key) { - delete clone[key]; - }); - return clone; -} -/** - * Ponyfill for Array.from - converts iterable values to an array - */ - -function arrayFrom(value) { - return [].slice.call(value); -} -/** - * Works like Element.prototype.closest, but uses a callback instead - */ - -function closestCallback(element, callback) { - while (element) { - if (callback(element)) { - return element; - } - - element = element.parentElement; - } - - return null; -} -/** - * Determines if an array or string includes a string - */ - -function includes(a, b) { - return a.indexOf(b) > -1; -} -/** - * Creates an array from string of values separated by whitespace - */ - -function splitBySpaces(value) { - return value.split(/\s+/).filter(Boolean); -} -/** - * Returns the `nextValue` if `nextValue` is not `undefined`, otherwise returns - * `currentValue` - */ - -function useIfDefined(nextValue, currentValue) { - return nextValue !== undefined ? nextValue : currentValue; -} -/** - * Converts a value that's an array or single value to an array - */ - -function normalizeToArray(value) { - return [].concat(value); -} -/** - * Returns the ownerDocument of the first available element, otherwise global - * document - */ - -function getOwnerDocument(elementOrElements) { - var _normalizeToArray = normalizeToArray(elementOrElements), - element = _normalizeToArray[0]; - - return element ? element.ownerDocument || document : document; -} -/** - * Adds item to array if array does not contain it - */ - -function pushIfUnique(arr, value) { - if (arr.indexOf(value) === -1) { - arr.push(value); - } -} -/** - * Adds `px` if value is a number, or returns it directly - */ - -function appendPxIfNumber(value) { - return typeof value === 'number' ? value + "px" : value; -} -/** - * Filters out duplicate elements in an array - */ - -function unique(arr) { - return arr.filter(function (item, index) { - return arr.indexOf(item) === index; - }); -} -/** - * Returns number from number or CSS units string - */ - -function getNumber(value) { - return typeof value === 'number' ? value : parseFloat(value); -} -/** - * Gets number or CSS string units in pixels (e.g. `1rem` -> 16) - */ - -function getUnitsInPx(doc, value) { - var isRem = typeof value === 'string' && includes(value, 'rem'); - var html = doc.documentElement; - var rootFontSize = 16; - - if (html && isRem) { - return parseFloat(getComputedStyle(html).fontSize || String(rootFontSize)) * getNumber(value); - } - - return getNumber(value); -} -/** - * Adds the `distancePx` value to the placement of a Popper.Padding object - */ - -function getComputedPadding(basePlacement, padding, distancePx) { - if (padding === void 0) { - padding = 5; - } - - var freshPaddingObject = { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; - var keys = Object.keys(freshPaddingObject); - return keys.reduce(function (obj, key) { - obj[key] = typeof padding === 'number' ? padding : padding[key]; - - if (basePlacement === key) { - obj[key] = typeof padding === 'number' ? padding + distancePx : padding[basePlacement] + distancePx; - } - - return obj; - }, freshPaddingObject); -} - -function createMemoryLeakWarning(method) { - var txt = method === 'destroy' ? 'n already-' : ' '; - return "\n " + method + "() was called on a" + txt + "destroyed instance. This is a no-op but\n indicates a potential memory leak.\n "; -} -function clean(value) { - var spacesAndTabs = /[ \t]{2,}/g; - var lineStartWithSpaces = /^[ \t]*/gm; - return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim(); -} - -function getDevMessage(message) { - return clean("\n %ctippy.js\n\n %c" + clean(message) + "\n\n %c\uD83D\uDC77\u200D This is a development-only message. It will be removed in production.\n "); -} - -function getFormattedMessage(message) { - return [getDevMessage(message), // title - 'color: #00C584; font-size: 1.3em; font-weight: bold;', // message - 'line-height: 1.5', // footer - 'color: #a6a095;']; -} -/** - * Helpful wrapper around `console.warn()`. - * TODO: Should we use a cache so it only warns a single time and not spam the - * console? (Need to consider hot reloading and invalidation though). Chrome - * already batches warnings as well. - */ - -function warnWhen(condition, message) { - if (condition) { - var _console; - - (_console = console).warn.apply(_console, getFormattedMessage(message)); - } -} -/** - * Helpful wrapper around `console.error()` - */ - -function errorWhen(condition, message) { - if (condition) { - var _console2; - - (_console2 = console).error.apply(_console2, getFormattedMessage(message)); - } -} -/** - * Validates the `targets` value passed to `tippy()` - */ - -function validateTargets(targets) { - var didPassFalsyValue = !targets; - var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener; - errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element, Element[],', 'or NodeList.'].join(' ')); - errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is no longer supported as an argument.', 'See: https://atomiks.github.io/tippyjs/misc/#custom-position'].join(' ')); -} - -var pluginProps = { - animateFill: false, - followCursor: false, - inlinePositioning: false, - sticky: false -}; -var defaultProps = _extends({ - allowHTML: true, - animation: 'fade', - appendTo: function appendTo() { - return document.body; - }, - aria: 'describedby', - arrow: true, - boundary: 'scrollParent', - content: '', - delay: 0, - distance: 10, - duration: [300, 250], - flip: true, - flipBehavior: 'flip', - flipOnUpdate: false, - hideOnClick: true, - ignoreAttributes: false, - inertia: false, - interactive: false, - interactiveBorder: 2, - interactiveDebounce: 0, - lazy: true, - maxWidth: 350, - multiple: false, - offset: 0, - onAfterUpdate: function onAfterUpdate() {}, - onBeforeUpdate: function onBeforeUpdate() {}, - onCreate: function onCreate() {}, - onDestroy: function onDestroy() {}, - onHidden: function onHidden() {}, - onHide: function onHide() {}, - onMount: function onMount() {}, - onShow: function onShow() {}, - onShown: function onShown() {}, - onTrigger: function onTrigger() {}, - onUntrigger: function onUntrigger() {}, - placement: 'top', - plugins: [], - popperOptions: {}, - role: 'tooltip', - showOnCreate: false, - theme: '', - touch: true, - trigger: 'mouseenter focus', - triggerTarget: null, - updateDuration: 0, - zIndex: 9999 -}, pluginProps); -var defaultKeys = Object.keys(defaultProps); -/** - * If the setProps() method encounters one of these, the popperInstance must be - * recreated - */ - -var POPPER_INSTANCE_DEPENDENCIES = ['arrow', 'boundary', 'distance', 'flip', 'flipBehavior', 'flipOnUpdate', 'offset', 'placement', 'popperOptions']; -/** - * Mutates the defaultProps object by setting the props specified - */ - -var setDefaultProps = function setDefaultProps(partialProps) { - if (process.env.NODE_ENV !== "production") { - validateProps(partialProps, []); - } - - var keys = Object.keys(partialProps); - keys.forEach(function (key) { - defaultProps[key] = partialProps[key]; - }); -}; -/** - * Returns an extended props object including plugin props - */ - -function getExtendedPassedProps(passedProps) { - var plugins = passedProps.plugins || []; - var pluginProps = plugins.reduce(function (acc, plugin) { - var name = plugin.name, - defaultValue = plugin.defaultValue; - - if (name) { - acc[name] = passedProps[name] !== undefined ? passedProps[name] : defaultValue; - } - - return acc; - }, {}); - return _extends({}, passedProps, {}, pluginProps); -} -/** - * Returns an object of optional props from data-tippy-* attributes - */ - -function getDataAttributeProps(reference, plugins) { - var propKeys = plugins ? Object.keys(getExtendedPassedProps(_extends({}, defaultProps, { - plugins: plugins - }))) : defaultKeys; - var props = propKeys.reduce(function (acc, key) { - var valueAsString = (reference.getAttribute("data-tippy-" + key) || '').trim(); - - if (!valueAsString) { - return acc; - } - - if (key === 'content') { - acc[key] = valueAsString; - } else { - try { - acc[key] = JSON.parse(valueAsString); - } catch (e) { - acc[key] = valueAsString; - } - } - - return acc; - }, {}); - return props; -} -/** - * Evaluates the props object by merging data attributes and disabling - * conflicting props where necessary - */ - -function evaluateProps(reference, props) { - var out = _extends({}, props, { - content: invokeWithArgsOrReturn(props.content, [reference]) - }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins)); - - if (out.interactive) { - out.aria = null; - } - - return out; -} -/** - * Validates props with the valid `defaultProps` object - */ - -function validateProps(partialProps, plugins) { - if (partialProps === void 0) { - partialProps = {}; - } - - if (plugins === void 0) { - plugins = []; - } - - var keys = Object.keys(partialProps); - keys.forEach(function (prop) { - var value = partialProps[prop]; - var didSpecifyPlacementInPopperOptions = prop === 'popperOptions' && value !== null && typeof value === 'object' && hasOwnProperty(value, 'placement'); - var nonPluginProps = removeProperties(defaultProps, ['animateFill', 'followCursor', 'inlinePositioning', 'sticky']); // These props have custom warnings - - var customWarningProps = ['a11y', 'arrowType', 'showOnInit', 'size', 'target', 'touchHold']; - var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop) && !includes(customWarningProps, prop); // Check if the prop exists in `plugins` - - if (didPassUnknownProp) { - didPassUnknownProp = plugins.filter(function (plugin) { - return plugin.name === prop; - }).length === 0; - } - - warnWhen(prop === 'target', ['The `target` prop was removed in v5 and replaced with the delegate() addon', 'in order to conserve bundle size.', 'See: https://atomiks.github.io/tippyjs/addons/#event-delegation'].join(' ')); - warnWhen(prop === 'a11y', ['The `a11y` prop was removed in v5. Make sure the element you are giving a', 'tippy to is natively focusable, such as ").text(this.options.lang.next).addClass("btn btn-secondary sw-btn-next").attr("type","button"):null,n=!1!==this.options.toolbarSettings.showPreviousButton?l("").text(this.options.lang.previous).addClass("btn btn-secondary sw-btn-prev").attr("type","button"):null,r=l("
    ").addClass("btn-group mr-2 sw-btn-group").attr("role","group").append(n,i),s=null;switch(this.options.toolbarSettings.toolbarExtraButtons&&0").addClass("btn-group mr-2 sw-btn-group-extra").attr("role","group"),l.each(this.options.toolbarSettings.toolbarExtraButtons,function(t,e){s.append(e.clone(!0))})),this.options.toolbarSettings.toolbarPosition){case"top":(t=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-top justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),"start"===this.options.toolbarSettings.toolbarButtonPosition?t.prepend(s):t.append(s),this.container.before(t);break;case"bottom":(e=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-bottom justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),"start"===this.options.toolbarSettings.toolbarButtonPosition?e.prepend(s):e.append(s),this.container.after(e);break;case"both":(t=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-top justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),"start"===this.options.toolbarSettings.toolbarButtonPosition?t.prepend(s):t.append(s),this.container.before(t),(e=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-bottom justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r.clone(!0)),null!==s&&("start"===this.options.toolbarSettings.toolbarButtonPosition?e.prepend(s.clone(!0)):e.append(s.clone(!0))),this.container.after(e);break;default:(e=l("
    ").addClass("btn-toolbar sw-toolbar sw-toolbar-bottom justify-content-"+this.options.toolbarSettings.toolbarButtonPosition)).append(r),this.options.toolbarSettings.toolbarButtonPosition,e.append(s),this.container.after(e)}return!0},_setEvents:function(){var i=this;return l(this.steps).on("click",function(t){if(t.preventDefault(),!1===i.options.anchorSettings.anchorClickable)return!0;var e=i.steps.index(this);if(!1===i.options.anchorSettings.enableAnchorOnDoneStep&&i.steps.eq(e).parent("li").hasClass("done"))return!0;e!==i.current_index&&(!1!==i.options.anchorSettings.enableAllAnchors&&!1!==i.options.anchorSettings.anchorClickable?i._showStep(e):i.steps.eq(e).parent("li").hasClass("done")&&i._showStep(e))}),l(".sw-btn-next",this.main).on("click",function(t){t.preventDefault(),i._showNext()}),l(".sw-btn-prev",this.main).on("click",function(t){t.preventDefault(),i._showPrevious()}),this.options.keyNavigation&&l(t).keyup(function(t){i._keyNav(t)}),this.options.backButtonSupport&&l(r).on("hashchange",function(t){if(!i.options.useURLhash)return!0;if(r.location.hash){var e=l("a[href*='"+r.location.hash+"']",i.nav);e&&0")["prepend"==this.insertMode?"prependTo":"appendTo"](this.el)[0]);var t=this.canvas;if(t.width=this.size,t.height=this.size,this.ctx=t.getContext("2d"),1")[0];t.width=i.size,t.height=i.size,t.getContext("2d").drawImage(e,0,0,s,s),i.arcFill=i.ctx.createPattern(t,"no-repeat"),i.drawFrame(i.lastFrameValue)}var e,i=this,n=this.fill,r=this.ctx,s=this.size;if(!n)throw Error("The fill is not specified!");if("string"==typeof n&&(n={color:n}),n.color&&(this.arcFill=n.color),n.gradient){var a=n.gradient;if(1==a.length)this.arcFill=a[0];else if(1n.oldScroll?n.forward:n.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s];if(null!==a.triggerPoint){var o=n.oldScroll=a.triggerPoint;(o&&l||!o&&!l)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}}for(var h in t)t[h].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?m.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?m.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var n=0,r=t.length;n=s.oldScroll,u=!l&&!h,!g&&l&&h?(c.queueTrigger(s.backward),n[c.group.id]=c.group):!g&&u?(c.queueTrigger(s.forward),n[c.group.id]=c.group):g&&s.oldScroll>=c.triggerPoint&&(c.queueTrigger(s.forward),n[c.group.id]=c.group)}}return m.requestAnimationFrame(function(){for(var t in n)n[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in n)n[t].refresh()},e.findByElement=function(t){return n[t.waypointContextKey]},window.onload=function(){t&&t(),e.refreshAll()},m.requestAnimationFrame=function(t){(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}).call(window,t)},m.Context=e}(),function(){"use strict";function a(t,e){return t.triggerPoint-e.triggerPoint}function o(t,e){return e.triggerPoint-t.triggerPoint}function e(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),i[this.axis][this.name]=this}var i={vertical:{},horizontal:{}},n=window.Waypoint;e.prototype.add=function(t){this.waypoints.push(t)},e.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},e.prototype.flushTriggers=function(){for(var t in this.triggerQueues){var e=this.triggerQueues[t],i="up"===t||"left"===t;e.sort(i?o:a);for(var n=0,r=e.length;n - - - - - - Gradido Login Server: Überprüfe Transaktion - - - - - - - -
    - - -
    - -
    -
    -

    Transaktion unterzeichnen

    -
    -

    Überweisung

    -
    -
    - Konto - Gradido -
    -
    - Normaler User <info@software-labor.de> - -10 GDD -
    -
    - dario frodo <dariofrodo@gmx.de> - 10 GDD -
    -
    -
    -
    - Aktives Konto -
    -
    - Normaler User <info@software-labor.de> -
    -
    -
    -
    - Verwendungszweck -
    -
    -   -
    -
    -
    - - -
    -
    -
    -
    -
    -
    - - -
    - 98.597 ms -
    -
    -

    Community Server in Entwicklung

    -

    Alpha 0.21.KW21.05

    -
    - - - - \ No newline at end of file diff --git a/community_server/websrc/gulpfile.js b/community_server/websrc/gulpfile.js deleted file mode 100644 index a1cd459f7..000000000 --- a/community_server/websrc/gulpfile.js +++ /dev/null @@ -1,58 +0,0 @@ -var gulp = require('gulp'); -var less = require('gulp-less'); -var concat = require('gulp-concat'); -var merge = require('merge-stream'); -var watch = require('gulp-watch'); -//var minify = require('gulp-minify'); -var cleanCSS = require('gulp-clean-css'); - -var bundleStyles = function() { - - var lessStream = gulp.src('src/less/*.less') - .pipe(concat('src/less-files.less')) - .pipe(less()) - .pipe(gulp.dest('./')) - ; - - var mergedStream = merge(lessStream) - .pipe(concat('grd_styles.css')) - //.pipe(minify()) - .pipe(gulp.dest('../webroot/css/')); - - return mergedStream; -}; - -var compressStyles = function() { - var lessStream = gulp.src('src/less/*.less') - .pipe(concat('src/less-files.less')) - .pipe(less()) - .pipe(gulp.dest('./')) - ; - - var mergedStream = merge(lessStream) - .pipe(concat('grd_styles.min.css')) - .pipe(cleanCSS({ - compatibility: 'ie8', - level: { - 1: { - all: true - }, - 2: { - all: true - } - } - })) - .pipe(gulp.dest('../webroot/css/')); - - return mergedStream; -}; - -gulp.task("bundleStyles", bundleStyles); -gulp.task("compressStyles", compressStyles); - -gulp.task('watchStyles', function() { - bundleStyles(); - watch("src/less/*.less", function() { - bundleStyles(); - }); -}); \ No newline at end of file diff --git a/community_server/websrc/package.json b/community_server/websrc/package.json deleted file mode 100644 index 8d456e83b..000000000 --- a/community_server/websrc/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "gradido_mithriljs_client", - "version": "0.0.1", - "description": "Webinterface Client for Gradido Websites written with mithrilJS", - "main": "app.js", - "scripts": { - "watch:js": "watchify ./src/js/app.js -t [ babelify --presets [ @babel/preset-env ] ] -o ../webroot/js/app.js -v", - "watch:css": "gulp watchStyles", - "bundle:css": "gulp bundleStyles", - "prebuild": "browserify ./src/js/app.js -t [ babelify --presets [ @babel/preset-env ] ] -o ./public/app.rl.js -v", - "build": "gulp compressStyles && browserify ./public/app.rl.js -g uglifyify -p bundle-collapser/plugin | uglifyjs --compress --mangle toplevel,eval > ../webroot/js/app.min.js" - }, - "author": "Dario Rekowski", - "license": "ISC", - "dependencies": { - "google-protobuf": "^3.10.0-rc.1", - "mithril": "github:StephanHoyer/mithril.js#rewrite" - }, - "devDependencies": { - "@babel/core": "^7.6.0", - "@babel/preset-env": "^7.6.0", - "babelify": "^10.0.0", - "browserify": "^16.5.0", - "bs58check": "^2.1.2", - "bundle-collapser": "^1.3.0", - "gulp": "^4.0.2", - "gulp-clean-css": "^4.3.0", - "gulp-concat": "^2.6.1", - "gulp-less": "^4.0.1", - "gulp-minify": "^3.1.0", - "gulp-watch": "^5.0.1", - "merge-stream": "^2.0.0", - "uglify-js": "^3.6.0", - "uglifyify": "^5.0.2" - } -} diff --git a/community_server/websrc/src/less/01-layout.less b/community_server/websrc/src/less/01-layout.less deleted file mode 100644 index 2aed60860..000000000 --- a/community_server/websrc/src/less/01-layout.less +++ /dev/null @@ -1,113 +0,0 @@ -/* ============================================================ - - Grid Layout Page - - Datei : layout.less - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ - -/*==================================== -= BREAK POINTS = -====================================*/ - -/* https://scotch.io/courses/getting-started-with-less/responsive-and-media-queries */ -@wide-screen-down: ~'(max-width:1199px)'; -@desktop-down: ~'(max-width:991px)'; -@tablet-down: ~'(max-width:767px)'; -@phone-down: ~'(max-width:480px)'; -@small-phone-down: ~'(max-width:320px)'; - -/* GRID */ -.layout { - display: grid; - grid-template-rows: [top] 8vh [line2] 86vh [footer1] 3vh [footer2] 5vh [end]; - grid-template-columns: [left1] auto [left2] 1fr [left3] 12fr [right3] 1fr [right2] auto [right1]; - grid-template-areas: "header header header header header" - "left . center center ." - "footer footer footer footer footer" - "bottom bottom bottom bottom bottom"; - margin: 0; - padding: 0; -} - -@media @wide-screen-down { - .layout { - grid-template-areas: "header header header header header" - "left . center center center" - "footer footer footer footer footer" - "bottom bottom bottom bottom bottom"; - } - -} - -@media @tablet-down { - .layout { - position: relative; - display: grid; - grid-template-rows: [top] 12vh [line2] 80vh [footer1] 3vh [footer2] 8vh [end]; - grid-template-columns: [left1] 100vw [right1]; - grid-template-areas: "header" - "center" - "footer" - "bottom"; - margin: 0; - padding: 0; - } - -} - -.header-notify { - grid-area: header; - grid-column-start: right3; - grid-column-end: right2; -} - -.header-user { - grid-area: header; - grid-column-start: right2; - grid-column-end: right1; -} - -.sidebar1 { - grid-area: left; - grid-row-start: top; - grid-row-end: end; -} - -@media @tablet-down { - .sidebar1 { - position: relative; - grid-area: header; - z-index: 2; - top: -300px; - right: 0px; - } - - .header-user, - .header-notify { - grid-area: header; - } - -} - -.center-form-single, -.content { - grid-area: center; - grid-row-start: line2; - grid-row-end: footer1; -} - -.footer { - grid-area: footer; - grid-row-start: footer1; - grid-row-end: footer2; -} - -.nav-bottom { - grid-area: bottom; - grid-row-start: footer2; - grid-row-end: end; -} diff --git a/community_server/websrc/src/less/02-colors.less b/community_server/websrc/src/less/02-colors.less deleted file mode 100644 index 90eff9346..000000000 --- a/community_server/websrc/src/less/02-colors.less +++ /dev/null @@ -1,160 +0,0 @@ -/* ============================================================ - - Generic Color Definitions - - Vars and some generic CSS rules. - - Datei : colors.less - Datum : 2020-05-26 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ - -/* MAIN */ -@main-background: #f9fafb; -@main-text: #212529; -@main-link-text: #000; - -/* MENU */ -@menu-background: #fff; -@menu-link-text: #4F4F4F; -@menu-link-selected: #047006; -@menu-border-color: #f2f4f5; - -/* CONTENT */ -@container-background: #fff; -@container-text: #212529; -@container-header: #21252969; -@container-shadow: rgba(183, 192, 206, .2); -@container-border: rgba(238, 238, 238, .75); - -/* CONTENT-NAV */ -@content-nav: #565656; - -/* CONTENT-ITEMS */ -@action-button-text: #fff; -@action-button-border: #047006; -@action-button-background1: #047006; -@action-button-background: #f9fafb; -@info-item-border: grey; -@form-header-border: #047006; -@form-header-background: #f9fafb; - -/* CONTENT-TABLE */ -@content-table-title: #313131; -@content-table-header: #101010; -@content-table-header-bg: #fafafa; -@content-table-header-border: #f2f4f9; -@content-row-bg: #f0f2f5; - -/* FORMS */ -@form-label: #212529; -@badge-color-warning: #fff; -@badge-background-warning: #00e093; -@badge-color-error: #fff; -@badge-background-error: #ff5f66; - -/* VARIOUS INDIVIDUAL */ -@orange: #ffa600; - -/* XXX TODO XXX */ -@dialog-background: #fff; - -/*rgba(0, 0, 0, 0.5) ??? */ -@dialog-text: #000; -@dialog-background-extra: rgba(0, 0, 0, 0.1); -@dialog-border: grey; -@form-text-background: rgba(0, 0, 0, 0.05); -@form-button-border: grey; -@form-button-text: #444; -@button-text: #000; -@button-border-color: #000; -@button-background-active: lightgray; -@print-background: #111; -@print-text: #000; -@print-link-text: #06c; -@gdt-text: #a27824; - -/* NOTIFICATION */ -@info: grey; -@info-border: gray; -@info-background: #80808026; -@info-background-icon: #80808026; -@error: red; -@error-border: rgba(255, 0, 0, 0.5); -@success: #047006; -@success-message: #1A1A1A; -@success-message-background: #06c50a; -@success-border: #04700675; -@success-background-icon: rgba(4, 112, 6, 0.2); -@success-background-hover: lightgreen; -@alert: #ff5f66; -@alert-color: #fff; -@alert-background: #ff5f669e; -@alert-background-icon: #ff5f662e; -@alert-blink: #ff5f669e; -@notify: #525c5d; -@notify-blink: #525c5d82; - -/* https://www.w3schools.com/colors/colors_shades.asp */ -@unobtrusive: grey; -@light: #F5F5F5; -@verylight: #fbfbfb; - -.info-color { - color: @info; -} - -.success-color { - color: @success; -} - -.alert-color { - color: @alert; -} - -.orange-color { - color: @orange -} - -.blue-color { - color: blue -} - -.unobtrusive { - color: @unobtrusive; -} - -.info-icon { - color: @info; - background-color: @info-background-icon; -} - -.success-icon { - color: @success; - background-color: @success-background-icon; -} - -.alert-icon { - color: @alert; - background-color: @alert-background-icon; -} - -/* ======================= - Gradido - =======================*/ - -/* Gradido */ -.grd-negative-currency { - color: red; -} - -/* Gradido Transform */ -.gdt-text-color { - color: @gdt-text; -} - -.grd_clickable { - cursor: pointer; -} diff --git a/community_server/websrc/src/less/03-typography.less b/community_server/websrc/src/less/03-typography.less deleted file mode 100644 index 06572c9ff..000000000 --- a/community_server/websrc/src/less/03-typography.less +++ /dev/null @@ -1,32 +0,0 @@ -/* ============================================================ - - Typography Definitions - - Datei : typography.less - Datum : 2020-05-26 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@body-fs: 100%; -@body-lh: 27px; -@content-lh: 1.75em; -@content-letter-spacing: .03rem; -@nav-fs: .8em; -@nav-bottom-fs: .9em; -@nav-bottom-fs-mobile: .8em; -@nav-btn-large-fs: 35px; -@nav-icon-fs: 1.2em; -@nav-icons-fs: 18px; -@nav-icon-main-fs: 32px; -@footer-fs: 70%; -@sidebar1-header-fs: .75em; -@sidebar1-lh: 2.5em; -@link-title-lh: normal; -@devinfo-fs: smaller; -@devinfo-fs-mobile: .7em; - -.small-font { - font-size: .75em; - font-weight: 300; -} diff --git a/community_server/websrc/src/less/05-screen.less b/community_server/websrc/src/less/05-screen.less deleted file mode 100644 index 975d57dc1..000000000 --- a/community_server/websrc/src/less/05-screen.less +++ /dev/null @@ -1,174 +0,0 @@ -/* ============================================================ - - Basic screen styles. - - Datei : screen.less - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@font-face { - font-family: 'Material Icons Outlined'; - font-style: normal; - font-weight: 400; - src: url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.eot); /* For IE6-8 */ - src: local('Material Icons Outlined'), local('Material-Icons-Outlined'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2) format('woff2'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff) format('woff'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf) format('truetype'); -} - -.material-icons-outlined { - font-family: 'Material Icons Outlined'; - font-weight: normal; - font-style: normal; - font-size: 24px; - line-height: 1; - letter-spacing: normal; - text-transform: none; - vertical-align: middle; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -webkit-font-feature-settings: 'liga'; - -webkit-font-smoothing: antialiased; -} - -@media screen { - - /* ======================= - Basis - =======================*/ - html, - body { - font-family: 'Roboto', sans-serif; - font-size: @body-fs; - line-height: @body-lh; - color: @main-text; - background-color: @main-background; - margin: 0; - overflow: auto; - } - - div { - border-collapse: collapse; - box-sizing: border-box; - } - - /* ======================= - Kopfbereich - =======================*/ - .header { - display: flex; - justify-content: space-between; - align-items: center; - flex: flex-grow; - width: 100%; - padding: 1em; - background-color: @menu-background; - } - - /* ======================= - Fußbereich - =======================*/ - .footer { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - font-size: @footer-fs; - font-style: italic; - line-height: 0; - } - - .bottomright { - position: fixed; - bottom: 0; - right: 0; - color: @unobtrusive; - font-size: @devinfo-fs; - line-height: .125em; - padding-right: .25em; - text-align: right; - } - - @media @tablet-down { - .bottomright { - font-size: @devinfo-fs-mobile; - font-weight: 300; - line-height: 1em; - width: 100px; - } - - .bottomright p { - margin-block-start: 0; - margin-block-end: 2px; - margin-inline-start: 0; - margin-inline-end: 0; - } - - } - - .bottomleft { - position: fixed; - bottom: 0; - left: 0; - color: @unobtrusive; - font-size: @devinfo-fs; - line-height: 1.125em; - padding-left: 0.25em; - } - - /* ======================= - Sonstige - =======================*/ - - /* Hyperlinks */ - a { - text-decoration: none; - color: inherit; - } - - main a { - text-decoration: underline; - font-style: italic; - } - - a:link, - a:visited { - color: inherit; - } - - a:hover, - a:focus { - text-decoration: underline; - } - - a:active { - background-color: @menu-background; - color: @main-link-text; - } - - a:focus, - a:active { - outline: none; - } - - a.grd_invisible_link { - color: @main-link-text; - text-decoration: none; - } - - a.grd_invisible_link:hover { - color: @unobtrusive; - } - - [type=button]:not(:disabled), - [type=reset]:not(:disabled), - [type=submit]:not(:disabled), - button:not(:disabled) { - cursor: pointer - } - -} - -/* Ende @media screen */ diff --git a/community_server/websrc/src/less/06-messages.less b/community_server/websrc/src/less/06-messages.less deleted file mode 100644 index 4c4d0fcb7..000000000 --- a/community_server/websrc/src/less/06-messages.less +++ /dev/null @@ -1,89 +0,0 @@ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ - -/* ============================================================ - - Screen styles for flash messages. - - Datei : messages.css - Datum : 30.10.2019, 16:04:16 - Autor : einhornimmond, Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - .flash-messages { - width: 30%; - position: absolute; - top: 57px; - left: 241px; - text-align: center; - - .alert { - margin: 0; - padding: 1em; - vertical-align: middle; - border-radius: 5px; - } - - .alert-success { - color: @success-message !important; - background-color: @success-message-background; - border: 1px solid @success-border; - } - - .alert-error { - color: @alert-color !important; - background-color: @error; - border: 1px solid @error-border; - } - - .message { - padding: 5px; - } - - .success { - color: @success; - } - - .error { - color: @error; - } - - } - - .flash-messages.hidden { - display: none; - } - - @media @tablet-down { - .flash-messages { - width: 90%; - top: 0; - left: 0; - text-align: center; - } - - } - - /* messages, update flash */ - .grd-error { - color: @error; - border: 1px solid @error-border; - padding: 5px; - } - - .grd-info { - border: 1px dotted @info-border; - padding: 5px; - } - - .grd-success { - padding: 5px; - color: @success; - } - -} diff --git a/community_server/websrc/src/less/07-user.less b/community_server/websrc/src/less/07-user.less deleted file mode 100644 index 50270ff49..000000000 --- a/community_server/websrc/src/less/07-user.less +++ /dev/null @@ -1,134 +0,0 @@ -/* ============================================================ - - User Menu - - Datei : user.less - Datum : 2020-07-03 - Autor : Christine Slotty - Copyright : Gradido - - ============================================================*/ -@media screen { - .header-user { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-end; - align-content: flex-end; - position: relative; - width: 100%; - min-width: 12em; - height: 40px; - background-color: @container-background; - border: 1px solid @menu-border-color; - border-radius: 0 0 0 18px; - } - - .user-menu-container { - display: flex; - justify-content: flex-end; - align-items: center; - font-size: .8em; - font-weight: 300; - padding: .25em .5em; - z-index: 20; - height: 40px; - } - - .user-name, - .user-icon { - display: inline-block; - vertical-align: middle; - cursor: pointer; - } - - .user-name { - padding-right: .25em; - } - - .nav-vertical.user-menu { - display: none; - background-color: @container-background; - border-left: 1px solid @menu-border-color; - border-bottom: 1px solid @menu-border-color; - border-radius: 0 0 16px 16px; - z-index: 15; - font-size: .9em; - margin-top: 0 !important; - position: fixed; - top: 39px; - right: 0; - } - - .nav-vertical.user-menu.visible { - display: inherit; - } - - .nav-vertical.user-menu > ul { - padding: 2em; - padding-top: .5em; - padding-bottom: 1em; - margin-block-end: 0; - margin-block-start: 0; - } - - .nav-vertical.user-menu li { - padding: .0125em; - } - - .nav-top > ul { - padding: 0; - padding-right: 2em; - } - - .material-icons-outlined.user-info { - color: @unobtrusive; - } - - .material-icons-outlined.user-info.success { - color: @success; - } - - @media @tablet-down { - .header-user { - position: relative; - min-width: 3em; - background-color: transparent; - justify-content: center; - height: 100%; - margin-top: -13px; - margin-left: -16px; - color: @action-button-background1; - } - - .user-menu-container { - margin: 0; - padding: 0; - } - - .user-icon { - - } - .user-name { - display: none; - } - - .nav-vertical { - margin-top: 55px; - } - - .nav-vertical.user-menu { - position: fixed; - top: 1px; - right: 0; - margin-top: 0; - } - - .nav-vertical.user-menu > ul { - padding: 1em 1em; - padding-top: 3em; - } - - } - -} diff --git a/community_server/websrc/src/less/08-navi.less b/community_server/websrc/src/less/08-navi.less deleted file mode 100644 index e71ce93a2..000000000 --- a/community_server/websrc/src/less/08-navi.less +++ /dev/null @@ -1,451 +0,0 @@ -/* ============================================================ - - Navigation - - Datei : navi.less - Datum : 2020-04-30 - Autor : einhornimmond / Christine Slotty - Copyright : Gradido - - ============================================================*/ -@media screen { - .logo { - display: none; - vertical-align: middle; - height: 30px; - padding: .5em; - } - - .logo.big.visible, - .logo.small.visible { - display: block !important; - } - - .logo.mobile { - display: none; - } - - .logo.small.visible { - padding-left: 41px; - } - - /* - SIDEBARS - */ - .sidebar1 { - background-color: @menu-background; - font-size: @nav-fs; - font-weight: 500; - line-height: @sidebar1-lh; - padding: 0; - border-right: 1px solid @menu-border-color; - } - - .sidebar2 { - padding: 1em; - background-color: @main-background; - } - - .sidebar1-header { - font-size: @sidebar1-header-fs; - font-style: italic; - color: @unobtrusive; - } - - /* set general icons size here! */ - .nav-icon { - font-size: @nav-icons-fs !important; - color: @menu-link-text; - vertical-align: middle; - padding-right: 1em; - } - - /* important! order matters! we need to overwrite the main button's size here */ - .nav-main-button { - font-size: @nav-icon-main-fs !important; - color: @unobtrusive; - margin: .3em; - } - - /* Hide mobile menu button! */ - .nav-main-button.mobile { - display: none; - } - - .nav-menu.nav-menu-maximized { - width: 280px; - height: 100%; - } - - .nav-menu.nav-menu-minimized { - width: 120px; - height: 100%; - } - - .nav-menu-maximized { - -webkit-animation: slide-out 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - animation: slide-out 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - } - - .nav-menu-minimized { - -webkit-animation: slide-in 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - animation: slide-in 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - } - - .nav-menu-minimized .link-title { - display: none; - } - - .nav-menu-minimized .nav-icon, - .nav-menu-minimized .nav-main-button { - padding-left: 72px; - } - - /** - * ---------------------------------------- - * animations slide-in / slide-out - * ---------------------------------------- - */ - - /* slide-in */ - @-webkit-keyframes slide-in { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - opacity: 0; - } - - 100% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - opacity: 1; - } - - } - - @keyframes slide-in { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - opacity: 0; - } - - 100% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - opacity: 1; - } - - } - - /* slide-out */ - @-webkit-keyframes slide-out { - 0% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - } - - @keyframes slide-out { - 0% { - -webkit-transform: translateX(-74px); - transform: translateX(-74px); - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - } - - /* - NAVI MOBILE - */ - @media @tablet-down { - .logo.big, - .logo.small { - display: none; - } - - .logo.visible { - padding: 0 !important; - } - - .logo, - .logo.mobile, - .logo.mobile.visible { - display: block; - position: fixed; - top: 12px; - left: 12px; - } - - .logo.big, - .logo.big.visible { - display: none !important; - } - - .nav-main-button { - display: none; - } - - .nav-main-button.mobile { - display: block; - position: fixed; - top: 2px; - right: 46px; - z-index: 3; - } - - .nav-menu.nav-menu-minimized, - .nav-menu.nav-menu-maximized { - width: 280px; - height: 300px; - } - - /* .nav-menu-minimized .link-title { - display: inherit; - } - */ - .nav-menu-minimized .nav-icon, - .nav-menu-minimized .nav-main-button { - padding-left: 0; - } - - /* Here we "revert' maximized / minimized and change the animation */ - .nav-menu-maximized { - -webkit-animation: slide-down 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - animation: slide-down 0.1s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - } - - .nav-menu-minimized { - -webkit-animation: slide-up 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - animation: slide-up 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; - } - - /** - * ---------------------------------------- - * animations slide-down / slide-up - * ---------------------------------------- - */ - - /* slide-down */ - @-webkit-keyframes slide-down { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - opacity: 0; - } - - 100% { - -webkit-transform: translateY(300px); - transform: translateX(300px); - opacity: 1; - } - - } - - @keyframes slide-down { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - opacity: 0; - } - - 100% { - -webkit-transform: translateY(300px); - transform: translateY(300px); - opacity: 1; - } - - } - - /* slide-up */ - @-webkit-keyframes slide-up { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - -webkit-transform: translateY(-300px); - transform: translateY(-300px); - } - - } - - @keyframes slide-up { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - -webkit-transform: translateY(-300px); - transform: translateY(-300px); - } - - } - - } - - /* END navi mobile base */ - .selected { - color: @menu-link-selected; - } - - .link-title { - vertical-align: middle; - line-height: @link-title-lh; - background-color: transparent; - } - - .nav-horizontal { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; - align-items: flex-end; - list-style-type: none; - gap: 5%; - padding: 1em; - } - - .footer .nav-horizontal { - gap: 0; - padding: 0 1em; - padding-inline-start: 0 !important; - } - - .nav-top-smaller { - margin: 0; - padding: 0; - } - - .nav-smaller { - justify-content: left; - align-items: flex-start; - gap: 0; - padding: 0; - } - - .nav-smaller li { - padding: 0 !important; - padding: .2em .5em !important; - border: 1px solid @action-button-border; - margin: .1em .3em; - border-radius: 12px; - } - - .nav-smaller .heading { - font-weight: bold; - } - - .nav-vertical { - margin-top: -2em; - } - - .nav-horizontal li { - padding: .5em; - } - - .nav-vertical > ul { - display: flex; - flex-direction: column; - list-style-type: none; - gap: 5%; - padding: 1em; - } - - .nav-vertical li { - padding: .5em; - } - - .nav-top > ul { - padding: 0; - padding-right: 2em; - } - - @media @tablet-down { - .nav-vertical { - margin-top: 55px; - } - - } - - .nav-bottom { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - list-style-type: none; - margin-bottom: 20px; - } - - .nav-bottom p { - font-size: @nav-bottom-fs; - color: @unobtrusive; - margin: 0; - } - - @media @tablet-down { - .nav-bottom p { - font-size: @nav-bottom-fs-mobile; - margin-top: -10px; - } - - } - - nav { - &.grd-left-bar { - position: fixed; - top: 80.5px; - } - - .grd-nav-bn { - width: 100px; - } - - ul { - margin-top: 0; - padding-left: 0; - } - - } - - /* buttons */ - .grd-nav-bn:hover, - .grd-active { - background-color: @button-background-active; - border-color: @main-link-text; - } - - .grd-nav-bn { - padding: 10px; - border: 1px solid @unobtrusive; - display: table-cell; - text-align: center; - vertical-align: middle; - color: @unobtrusive; - } - - .grd-nav-bn-large { - width: 40vw; - height: 18vh; - font-size: @nav-btn-large-fs; - } - - a.grd-nav-bn, - a.grd-nav-bn:visited { - color: @main-link-text; - text-decoration: none; - } - -} diff --git a/community_server/websrc/src/less/09-notification.less b/community_server/websrc/src/less/09-notification.less deleted file mode 100644 index a9bf74c0a..000000000 --- a/community_server/websrc/src/less/09-notification.less +++ /dev/null @@ -1,160 +0,0 @@ -/* ============================================================ - - Notification - - Datei : notification.css - Datum : 2020-06-10 - Autor : Christine Slotty - Copyright : Gradido - - ============================================================*/ -@media screen { - .header-notify { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; - z-index: 10; - } - - @media @tablet-down { - .header-notify { - justify-content: flex-end; - margin-right: 93px; - margin-top: 8px; - } - - } - - .notify { - display: block; - padding: .5rem .3rem; - color: @notify; - animation: blinkingNotifySymbol 1.2s infinite; - } - - .notify-alert { - color: @alert; - animation: blinkingAlertSymbol 1.2s infinite; - } - - @keyframes blinkingNotifySymbol { - 0% { - color: @notify; - } - - 49% { - color: @notify; - } - - 60% { - color: @notify-blink; - } - - 99% { - color: @notify-blink; - } - - 100% { - color: @notify; - } - - } - - @keyframes blinkingAlertSymbol { - 0% { - color: @alert; - } - - 49% { - color: @alert; - } - - 60% { - color: @alert-blink; - } - - 99% { - color: @alert-blink; - } - - 100% { - color: @alert; - } - - } - - /* - .notification-indicator-primary { - background: #047006; - } - - .notification-indicator-warning { - background: #f0825f - } - .notification-indicator-secondary { - background: grey - } - - .notification-indicator-secondary:before { - content: ""; - background: rgba(128, 128, 128, .5) - } - - .notification-indicator-success { - background: #00e093 - } - - .notification-indicator-success:before { - content: ""; - background: rgba(0, 224, 147, .5) - } - - .notification-indicator-info { - background: #6c61f6 - } - - .notification-indicator-info:before { - content: ""; - background: rgba(108, 97, 246, .5) - } - - - .notification-indicator-danger { - background: #ff5f66 - } - - .notification-indicator-danger:before { - content: ""; - background: rgba(255, 95, 102, .5) - } - - .notification-indicator-light { - background: #dfdfdf - } - - .notification-indicator-light:before { - content: ""; - background: rgba(223, 223, 223, .5) - } - - .notification-indicator-dark { - background: #74767b - } - - .notification-indicator-dark:before { - content: ""; - background: rgba(116, 118, 123, .5) - } - - .notification-indicator-white { - background: #fff - } - - .notification-indicator-white:before { - content: ""; - background: rgba(255, 255, 255, .5) - } - */ -} diff --git a/community_server/websrc/src/less/10-center.less b/community_server/websrc/src/less/10-center.less deleted file mode 100644 index 3163e566e..000000000 --- a/community_server/websrc/src/less/10-center.less +++ /dev/null @@ -1,224 +0,0 @@ -/* ============================================================ - - Screen styles for the regular center part. - - Datei : center.css - Datum : 2020-04-30 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - - /* ========= - CONTENT - =========*/ - .content-default { - display: flex; - justify-content: center; - max-width: 90%; - } - - .content { - display: flex; - justify-content: flex-start; - flex-direction: column; - overflow: auto; - width: 100%; - background-color: @main-background; - line-height: @content-lh; - letter-spacing: @content-letter-spacing; - font-family: Roboto, sans-serif; - font-weight: 500; - font-size: 1rem; - padding-right: 5em; - } - - @media @tablet-down { - .content { - padding-right: 0; - } - - } - - /* Center Navigation Top */ - .nav-content { - position: relative; - color: @content-nav; - margin: 0 .25em; - } - - .nav-content-list { - display: flex; - list-style-type: none; - padding: 0; - margin-left: .25em; - } - - .nav-content-separator { - margin: 0 1em; - } - - @media @tablet-down { - .nav-content-list { - display: flex; - font-size: small; - margin-bottom: 0; - justify-content: center; - } - - } - - /* Center Content Container */ - .content-container { - background-color: @container-background; - color: @container-text; - border-radius: .5em; - box-shadow: 0 0 10px 0 @container-shadow; - border: 1px solid @container-border; - margin: 1em .25em; - } - - /* Block Container Above Main */ - .block-container { - width: 100%; - display: flex; - } - - /* Top Info Above Main */ - .info-container { - display: flex; - justify-content: space-between; - align-items: center; - max-width: 70%; - padding: 1em 25px; - } - - @media @wide-screen-down { - .info-container { - flex-direction: column; - max-width: 90%; - line-height: .25em; - } - - } - - /* Main Container */ - .main-container { - width: 100%; - } - - @media @tablet-down { - .main-container { - max-width: 97%; - } - - } - - .default-container { - width: 90%; - margin: auto; - padding: 1em; - } - - /* Content Block */ - .content-block { - width: 170px; - padding: 20px 25px 20px; - border: 1px dashed grey; - border-radius: 16px; - margin: 1em; - display: flex; - flex-direction: column; - justify-content: center; - justify-items: center; - align-items: center; - } - - .block-img { - width: 40px; - height: 40px; - line-height: 20px; - font-size: 24px; - padding: 8px; - border-radius: 20px; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2); - overflow: hidden; - border-style: none; - box-sizing: border-box; - } - - /* Generic Content */ - .content-region h3 { - color: @container-header; - } - - .content-region { - border-bottom: 1px dashed @light; - padding: 0 25px; - padding-bottom: 2em; - margin: 1em .25em; - } - - .content-collection { - display: flex; - } - - .content-item { - margin: .5em 0; - margin-right: 5em; - width: 220px; - padding: 1em 2em; - } - - .action-button { - background: @action-button-background; - border-left: 3px solid @action-button-border; - } - - .info-item { - border-left: 2px solid @info-item-border; - } - - .inline-header { - display: inline; - } - - .show-profile-img { - display: block; - height: 100px; - vertical-align: middle; - border-radius: 10px; - border: 2px dotted @info-background; - } - - @media @tablet-down { - .content-region { - padding-left: 5px; - } - - .content-collection { - flex-direction: column; - align-items: center; - } - - .content-item { - margin: .5em 0; - margin-right: 0; - width: 160px; - padding: 1em 2em; - } - - } - - /* OTHER */ - .info-item i, - .info-item-link, - .action-button i, - .action-button-link { - vertical-align: middle; - } - -} - -/* Ende @media screen */ diff --git a/community_server/websrc/src/less/12-center-form-single.less b/community_server/websrc/src/less/12-center-form-single.less deleted file mode 100644 index 8179da087..000000000 --- a/community_server/websrc/src/less/12-center-form-single.less +++ /dev/null @@ -1,164 +0,0 @@ -/* ============================================================ - - Screen styles for the simple center form. (login etc) - - Datei : center-form-single.css - Datum : 2020-07-10 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - .center-form-single { - width: 50%; - margin: auto; - } - - .center-form-header { - margin-bottom: 50px; - } - - .center-logo { - display: block; - margin: 0 auto; - width: 280px; - } - - .center-logo img { - width: 100%; - vertical-align: middle; - border-style: none; - } - - .center-form-container { - display: flex; - flex-direction: column; - padding: 2em 8em; - background-color: @container-background; - border-radius: 6px; - box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2); - margin-bottom: 1.5rem; - border: 1px solid rgba(238, 238, 238, .75); - } - - @media @tablet-down { - .center-form-header { - margin-bottom: 30px; - margin-top: -50px; - } - - .center-form-single { - width: 97%; - margin: auto; - } - - .center-form-container { - padding: 1em .5em; - } - - } - - .center-form-title h1 { - margin-block-start: 0; - } - - .center-form-selectors { - display: flex; - justify-content: flex-end; - align-items: center; - height: 38px; - padding: 5px 0; - margin-bottom: 2em; - } - - .center-form-form, - .center-form-form form { - display: flex; - flex-direction: column; - } - - .center-form-form .form-label { - text-align: left; - } - .center-form-form .form-control { - width: 100%; - margin: auto; - box-sizing: border-box; - margin-bottom: .5em; - } - - .center-form-submit { - width: 100%; - margin: 1em 0; - } - - .reset-pwd-link, - .signup-link { - padding: 0 20px; - - & a { - color: @action-button-background1; - } - - & p { - display: inline-block; - margin-block-start: 0; - margin-block-end: 0; - } - - } - - .center-bottom { - color: @unobtrusive; - text-align: center; - padding-top: 30px; - } - - .flag-btn { - text-align: center; - vertical-align: middle; - padding: 3px 11px; - } - - .flag { - display: block; - } - - .flag-germany { - background: red; - border-top: 9px solid #000; - border-bottom: 9px solid #fc0; - width: 40px; - height: 10px; - } - - .flag-england { - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==); - background-size: cover; - width: 40px; - height: 28px; - } - - .group { - padding-left: 10px; - padding-top: 10px; - padding-bottom: 10px; - } - - .group-is-invalid { - background-color: rgba(240, 130, 95, .2); - border-color: #dc3545; - padding-right: calc(1.5em + .75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E"); - background-repeat: no-repeat; - background-position: center right calc(.375em + .1875rem); - background-size: calc(.75em + .375rem) calc(.75em + .375rem) - } - - .group-is-invalid .radio label .input-frame::before { - border-color: red; - } - -} - -/* Ende @media screen */ diff --git a/community_server/websrc/src/less/15-facts.less b/community_server/websrc/src/less/15-facts.less deleted file mode 100644 index 3bac37ff7..000000000 --- a/community_server/websrc/src/less/15-facts.less +++ /dev/null @@ -1,62 +0,0 @@ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ - -/* ============================================================ - - Screen styles for plain facts. - - Datei : facts.css - Datum : 08.07.2020 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - .fact-list { - display: flex; - flex-direction: column; - list-style-type: none; - width: 100%; - padding-inline-start: 0; - font-weight: 300; - } - - .fact { - display: inline-block; - padding-left: 1em; - } - - .label { - width: 150px; - text-align: right; - font-weight: bold; - } - - @media @tablet-down { - .fact-list { - margin-block-start: 0; - margin-block-end: 0; - } - - li.fact { - display: flex; - flex-direction: column; - } - - .fact { - padding-left: .5em; - } - - .label { - width: 250px; - text-align: left; - font-size: .9em; - font-weight: normal; - } - - } - -} diff --git a/community_server/websrc/src/less/20-list.less b/community_server/websrc/src/less/20-list.less deleted file mode 100644 index d09fe0594..000000000 --- a/community_server/websrc/src/less/20-list.less +++ /dev/null @@ -1,239 +0,0 @@ -/* ============================================================ - - Screen styles for lists. - - Datei : list.css - Datum : 2020-06-09 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - - /* ========= - LISTS - =========*/ - - /* List Content */ - .content-list { - width: 100%; - } - - .content-list-title { - font-size: 1rem; - margin: 0; - padding: 20px 25px; - color: @content-table-title; - } - - .content-list-table { - display: flex; - flex-direction: column; - width: 100%; - overflow: auto; - font-size: 16px; - color: #212529; - } - - .row { - display: flex; - width: 100%; - border-top: 1px solid #f2f4f9; - -webkit-transition-duration: .5s; - transition-duration: .5s; - } - - @media @tablet-down { - .row { - flex-direction: column; - } - - } - - .row:hover { - background-color: #f6f7f9; - } - - .cell { - display: flex; - flex-wrap: wrap; - align-items: center; - padding: 1em 1.5em; - } - - .cell-dense { - padding: .1em .5em; - } - - .centered { - justify-content: center; - } - - .c0 { - flex-grow: 5; - min-width: 20%; - } - - .c1 { - min-width: 40px; - flex: 0 0 40px; - } - - .c2 { - min-width: 80px; - flex: 0 0 80px; - } - - .c3 { - min-width: 160px; - flex: 0 0 160px; - } - - .c4 { - min-width: 240px; - flex: 0 0 240px; - } - - .c5 { - min-width: 320px; - flex: 0 0 320px; - } - - .c6 { - min-width: 400px; - flex: 0 0 400px; - } - - @media @tablet-down { - .cell { - padding: .25em 1.5em; - } - - .c1 { - flex-basis: auto; - } - - .c2 { - flex-basis: auto; - } - - .c3 { - flex-basis: auto; - } - - .c4 { - flex-basis: auto; - } - - .c5 { - flex-basis: auto; - } - - .c6 { - flex-basis: auto; - } - - } - - .header-cell { - border-top: 1px solid @content-table-header-border; - background-color: @content-table-header-bg; - color: @content-table-header; - } - - .content-list-table img, - .content-list-table i { - vertical-align: middle; - } - - .content-list-table > span { - font-size: .8em; - padding: .5em 2em; - vertical-align: middle; - } - - /* Individual Tables XXX rm!! */ - .error-list { - grid-template-columns: 2fr 2fr 5fr 1fr; - } - - .transactions { - grid-template-columns: 1fr 4fr 2fr 2fr; - } - - .profile-img { - width: 30px; - height: 30px; - border-radius: 6px; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); - overflow: hidden; - border-style: none; - box-sizing: border-box; - margin-right: 40px; - } - - .tx-email { - cursor: pointer; - display: block; - color: @content-table-header; - font-weight: 400; - } - - .small { - font-size: 80%; - font-weight: 400; - } - - /*, - .cell-icon .material-icons-outlined */ - .cell-icon { - - /*noch ungeklärt - icon ist nicht aligned */ - - /*font-size: 1.25em;*/ - vertical-align: middle; - } - - /* ===================================== - FORM TOP CONTENT (checkTransaction) - =====================================*/ - .form-content { - padding: 35px; - padding-top: 20px; - max-width: 80%; - margin: auto; - } - - .content-table { - border: 1px solid @content-table-header-border; - border-top: none; - margin-bottom: 1.5rem; - } - - .content-row { - display: flex; - justify-content: space-between; - font-weight: 400; - border-top: 1px solid @content-table-header-border; - } - - .content-row-header { - font-weight: 500; - color: @content-table-header; - } - - .content-row-bg { - background-color: @content-row-bg; - } - - .content-cell { - display: block; - border-collapse: collapse; - padding: 10px 15px; - } - - .form-button .material-icons-outlined { - font-size: 1.25em; - } - -} diff --git a/community_server/websrc/src/less/21-tabs.less b/community_server/websrc/src/less/21-tabs.less deleted file mode 100644 index 694dd1dab..000000000 --- a/community_server/websrc/src/less/21-tabs.less +++ /dev/null @@ -1,45 +0,0 @@ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ -/* - Created on : 23.11.2020, 14:04:28 - Author : einhornimmond -*/ - - /* Style the tab */ -.tab { - overflow: hidden; - border: 1px solid #ccc; - background-color: #f1f1f1; -} - -/* Style the buttons that are used to open the tab content */ -.tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 14px 16px; - transition: 0.3s; -} - -/* Change background color of buttons on hover */ -.tab button:hover { - background-color: #ddd; -} - -/* Create an active/current tablink class */ -.tab button.active { - background-color: #ccc; -} - -/* Style the tab content */ -.tabcontent { - display: none; - padding: 6px 12px; - border: 1px solid #ccc; - border-top: none; -} \ No newline at end of file diff --git a/community_server/websrc/src/less/30-form.less b/community_server/websrc/src/less/30-form.less deleted file mode 100644 index df52a684e..000000000 --- a/community_server/websrc/src/less/30-form.less +++ /dev/null @@ -1,238 +0,0 @@ -/* -To change this license header, choose License Headers in Project Properties. -To change this template file, choose Tools | Templates -and open the template in the editor. -*/ - -/* ============================================================ - - Screen styles for forms. - - Datei : form.css - Datum : 2020-06-07 - Autor : Christine Slotty - Copyright : Gradio - - ============================================================*/ -@media screen { - - /* ========= - FORMS - =========*/ - - /* Form Content */ - .action-form { - width: 100%; - } - - .form-header { - border-left: 3px solid @form-header-border; - background: @form-header-background; - padding: 15px 20px; - margin: 0; - margin-bottom: 15px; - border-radius: 0 6px 0 0; - } - - .form-label { - grid-column: 1 / 2; - font-weight: 400; - text-align: right; - padding-right: .5em; - } - - .form-control { - grid-column: 2 / 3; - display: block; - padding: .4em .75em; - padding-left: 20px; - padding-right: 20px; - margin: 0; - margin-right: .5em; - color: rgba(16, 16, 16, .8); - display: block; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #6c757d; - background-color: #f6f7f9; - background-clip: padding-box; - border: 1px solid #f0f2f5; - border-radius: .25rem; - -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; - } - - .form-control:focus { - color: #495057; - background-color: #f6f7f9; - border-color: #d7dee5; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, .25); - } - - textarea { - resize: vertical; - } - - .badge { - display: inline-block; - padding: .45rem 1rem; - font-size: 80%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25rem; - -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; - transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out - } - - .badge-warning { - color: @badge-color-warning; - background-color: @badge-background-warning; - } - - .badge-error { - color: @badge-color-error; - background-color: @badge-background-error; - } - - .form-full-width { - grid-column-start: 1; - grid-column-end: 3; - display: flex; - flex-direction: column; - } - - .form-button { - cursor: pointer; - font: 600 13.3333px Arial; - font-size: .875rem; - line-height: 1.5; - text-align: center; - vertical-align: middle; - color: @action-button-text; - background-color: @action-button-background1; - border-color: @action-button-border; - border: 1px solid transparent; - border-radius: .2rem; - height: 35px; - max-height: 35px; - padding: 4px 15px; - margin-right: .5em; - box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2); - } - - .form-button:hover { - background-color: #034b04; - border-color: #023f03; - } - - .button-cancel { - color: #fff !important; - background-color: #f0825f; - border-color: #f0825f; - } - - .button-cancel:hover { - background-color: #ec5e30; - border-color: #eb5425; - } - - .link-button { - display: inline-block; - background: @action-button-background; - color: @action-button-text; - height: 17px; - padding: 1em 2em; - line-height: 1em; - border-radius: 6px; - text-align: center; - vertical-align: middle; - } - - .action-link { - color: @action-button-background1 !important; - } - - .action-link-button { - background-color: @action-button-background1 !important; - color: @action-button-text !important; - margin-top: 1em; - padding: .5em 1em; - } - - .edit-profile-img { - width: 100px; - } - - .note-smaller { - font-size: smaller; - } - - .form-row, - .grid-row { - display: flex; - justify-content: flex-start; - align-items: center; - align-content: center; - width: 100%; - -webkit-transition-duration: .5s; - transition-duration: .5s; - } - - .justify-end { - justify-content: flex-end; - } - - @media @tablet-down { - .grid-row { - flex-direction: column; - } - - } - - .form-row { - border-top: 1px solid #f2f4f9; - } - - .form-row:hover { - background-color: #f6f7f9; - } - - /* CENTER FORM SPECIFICS */ - .form-body form { - display: grid; - grid-template-columns: 220px 1fr; - margin: 36px 75px; - grid-gap: 1em; - } - - .center-form { - width: 450px; - } - - .center-form .form-control { - width: 90%; - } - - .center-form fieldset { - margin-bottom: 1em; - } - - @media @tablet-down { - .form-body form { - grid-template-columns: 1fr; - margin: 20px; - grid-gap: .25em; - } - - .form-label { - text-align: left; - } - - } - -} diff --git a/configs/community_server/app.php b/configs/community_server/app.php deleted file mode 100644 index d56a43cc0..000000000 --- a/configs/community_server/app.php +++ /dev/null @@ -1,431 +0,0 @@ - filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN), - - /** - * Configure basic information about the application. - * - * - namespace - The namespace to find app classes under. - * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time. - * - encoding - The encoding used for HTML + database connections. - * - base - The base directory the app resides in. If false this - * will be auto detected. - * - dir - Name of app directory. - * - webroot - The webroot directory. - * - wwwRoot - The file path to webroot. - * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to - * use CakePHP pretty URLs, remove these .htaccess - * files: - * /.htaccess - * /webroot/.htaccess - * And uncomment the baseUrl key below. - * - fullBaseUrl - A base URL to use for absolute links. When set to false (default) - * CakePHP generates required value based on `HTTP_HOST` environment variable. - * However, you can define it manually to optimize performance or if you - * are concerned about people manipulating the `Host` header. - * - imageBaseUrl - Web path to the public images directory under webroot. - * - cssBaseUrl - Web path to the public css directory under webroot. - * - jsBaseUrl - Web path to the public js directory under webroot. - * - paths - Configure paths for non class based resources. Supports the - * `plugins`, `templates`, `locales` subkeys, which allow the definition of - * paths for plugins, view templates and locale files respectively. - */ - 'App' => [ - 'namespace' => 'App', - 'encoding' => env('APP_ENCODING', 'UTF-8'), - 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'), - 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'), - 'base' => false, - 'dir' => 'src', - 'webroot' => 'webroot', - 'wwwRoot' => WWW_ROOT, - //'baseUrl' => env('SCRIPT_NAME'), - 'fullBaseUrl' => false, - 'imageBaseUrl' => 'img/', - 'cssBaseUrl' => 'css/', - 'jsBaseUrl' => 'js/', - 'paths' => [ - 'plugins' => [ROOT . DS . 'plugins' . DS], - 'templates' => [APP . 'Template' . DS], - 'locales' => [APP . 'Locale' . DS], - ], - ], - - /** - * Security and encryption configuration - * - * - salt - A random string used in security hashing methods. - * The salt value is also used as the encryption key. - * You should treat it as extremely sensitive data. - */ - 'Security' => [ - 'salt' => env('SECURITY_SALT', '7ddf685a27d997ef36e51bdd626e7fc6b50a3abfb2971e8e59974d421116a150'), - ], - - /** - * Apply timestamps with the last modified time to static assets (js, css, images). - * Will append a querystring parameter containing the time the file was modified. - * This is useful for busting browser caches. - * - * Set to true to apply timestamps when debug is true. Set to 'force' to always - * enable timestamping regardless of debug value. - */ - 'Asset' => [ - //'timestamp' => true, - // 'cacheTime' => '+1 year' - ], - - /** - * Configure the cache adapters. - */ - 'Cache' => [ - 'default' => [ - 'className' => FileEngine::class, - 'path' => CACHE, - 'url' => env('CACHE_DEFAULT_URL', null), - ], - - /** - * Configure the cache used for general framework caching. - * Translation cache files are stored with this configuration. - * Duration will be set to '+2 minutes' in bootstrap.php when debug = true - * If you set 'className' => 'Null' core cache will be disabled. - */ - '_cake_core_' => [ - 'className' => FileEngine::class, - 'prefix' => 'myapp_cake_core_', - 'path' => CACHE . 'persistent/', - 'serialize' => true, - 'duration' => '+1 years', - 'url' => env('CACHE_CAKECORE_URL', null), - ], - - /** - * Configure the cache for model and datasource caches. This cache - * configuration is used to store schema descriptions, and table listings - * in connections. - * Duration will be set to '+2 minutes' in bootstrap.php when debug = true - */ - '_cake_model_' => [ - 'className' => FileEngine::class, - 'prefix' => 'myapp_cake_model_', - 'path' => CACHE . 'models/', - 'serialize' => true, - 'duration' => '+1 years', - 'url' => env('CACHE_CAKEMODEL_URL', null), - ], - - /** - * Configure the cache for routes. The cached routes collection is built the - * first time the routes are processed via `config/routes.php`. - * Duration will be set to '+2 seconds' in bootstrap.php when debug = true - */ - '_cake_routes_' => [ - 'className' => FileEngine::class, - 'prefix' => 'myapp_cake_routes_', - 'path' => CACHE, - 'serialize' => true, - 'duration' => '+1 years', - 'url' => env('CACHE_CAKEROUTES_URL', null), - ], - ], - - /** - * Configure the Error and Exception handlers used by your application. - * - * By default errors are displayed using Debugger, when debug is true and logged - * by Cake\Log\Log when debug is false. - * - * In CLI environments exceptions will be printed to stderr with a backtrace. - * In web environments an HTML page will be displayed for the exception. - * With debug true, framework errors like Missing Controller will be displayed. - * When debug is false, framework errors will be coerced into generic HTTP errors. - * - * Options: - * - * - `errorLevel` - int - The level of errors you are interested in capturing. - * - `trace` - boolean - Whether or not backtraces should be included in - * logged errors/exceptions. - * - `log` - boolean - Whether or not you want exceptions logged. - * - `exceptionRenderer` - string - The class responsible for rendering - * uncaught exceptions. If you choose a custom class you should place - * the file for that class in src/Error. This class needs to implement a - * render method. - * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that - * extend one of the listed exceptions will also be skipped for logging. - * E.g.: - * `'skipLog' => ['Cake\Http\Exception\NotFoundException', 'Cake\Http\Exception\UnauthorizedException']` - * - `extraFatalErrorMemory` - int - The number of megabytes to increase - * the memory limit by when a fatal error is encountered. This allows - * breathing room to complete logging or error handling. - */ - 'Error' => [ - 'errorLevel' => E_ALL, - 'exceptionRenderer' => ExceptionRenderer::class, - 'skipLog' => [], - 'log' => true, - 'trace' => true, - ], - - /** - * Email configuration. - * - * By defining transports separately from delivery profiles you can easily - * re-use transport configuration across multiple profiles. - * - * You can specify multiple configurations for production, development and - * testing. - * - * Each transport needs a `className`. Valid options are as follows: - * - * Mail - Send using PHP mail function - * Smtp - Send using SMTP - * Debug - Do not send the email, just return the result - * - * You can add custom transports (or override existing transports) by adding the - * appropriate file to src/Mailer/Transport. Transports should be named - * 'YourTransport.php', where 'Your' is the name of the transport. - */ - 'EmailTransport' => [ - 'default' => [ - 'className' => MailTransport::class, - /* - * The following keys are used in SMTP transports: - */ - 'host' => 'localhost', - 'port' => 25, - 'timeout' => 30, - 'username' => null, - 'password' => null, - 'className' => 'Smtp', - 'tls' => true - ], - ], - - /** - * Email delivery profiles - * - * Delivery profiles allow you to predefine various properties about email - * messages from your application and give the settings a name. This saves - * duplication across your application and makes maintenance and development - * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email` - * for more information. - */ - 'Email' => [ - 'default' => [ - 'transport' => 'default', - 'from' => 'you@localhost', - //'charset' => 'utf-8', - //'headerCharset' => 'utf-8', - ], - ], - - /** - * Connection information used by the ORM to connect - * to your application's datastores. - * - * ### Notes - * - Drivers include Mysql Postgres Sqlite Sqlserver - * See vendor\cakephp\cakephp\src\Database\Driver for complete list - * - Do not use periods in database name - it may lead to error. - * See https://github.com/cakephp/cakephp/issues/6471 for details. - * - 'encoding' is recommended to be set to full UTF-8 4-Byte support. - * E.g set it to 'utf8mb4' in MariaDB and MySQL and 'utf8' for any - * other RDBMS. - */ - 'Datasources' => [ - 'default' => [ - 'className' => Connection::class, - 'driver' => Mysql::class, - 'persistent' => false, - 'host' => 'mariadb', - /* - * CakePHP will use the default DB port based on the driver selected - * MySQL on MAMP uses port 8889, MAMP users will want to uncomment - * the following line and set the port accordingly - */ - //'port' => 'non_standard_port_number', - 'username' => 'root', - 'password' => '', - 'database' => 'gradido_community', - /* - * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6). - */ - //'encoding' => 'utf8mb4', - 'timezone' => 'UTC', - 'flags' => [], - 'cacheMetadata' => true, - 'log' => false, - - /** - * Set identifier quoting to true if you are using reserved words or - * special characters in your table or column names. Enabling this - * setting will result in queries built using the Query Builder having - * identifiers quoted when creating SQL. It should be noted that this - * decreases performance because each query needs to be traversed and - * manipulated before being executed. - */ - 'quoteIdentifiers' => false, - - /** - * During development, if using MySQL < 5.6, uncommenting the - * following line could boost the speed at which schema metadata is - * fetched from the database. It can also be set directly with the - * mysql configuration directive 'innodb_stats_on_metadata = 0' - * which is the recommended value in production environments - */ - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - - 'url' => env('DATABASE_URL', null), - ], - - /** - * The test connection is used during the test suite. - */ - 'test' => [ - 'className' => Connection::class, - 'driver' => Mysql::class, - 'persistent' => false, - 'host' => 'mariadb', - //'port' => 'non_standard_port_number', - 'username' => 'root', - 'password' => '', - 'database' => 'gradido_community_test', - //'encoding' => 'utf8mb4', - 'timezone' => 'UTC', - 'cacheMetadata' => true, - 'quoteIdentifiers' => false, - 'log' => false, - //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], - 'url' => env('DATABASE_TEST_URL', null), - ], - ], - - /** - * Configures logging options - */ - 'Log' => [ - 'debug' => [ - 'className' => FileLog::class, - 'path' => LOGS, - 'file' => 'debug', - 'url' => env('LOG_DEBUG_URL', null), - 'scopes' => false, - 'levels' => ['notice', 'info', 'debug'], - ], - 'error' => [ - 'className' => FileLog::class, - 'path' => LOGS, - 'file' => 'error', - 'url' => env('LOG_ERROR_URL', null), - 'scopes' => false, - 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], - ], - // To enable this dedicated query log, you need set your datasource's log flag to true - 'queries' => [ - 'className' => FileLog::class, - 'path' => LOGS, - 'file' => 'queries', - 'url' => env('LOG_QUERIES_URL', null), - 'scopes' => ['queriesLog'], - ], - ], - - /** - * Session configuration. - * - * Contains an array of settings to use for session configuration. The - * `defaults` key is used to define a default preset to use for sessions, any - * settings declared here will override the settings of the default config. - * - * ## Options - * - * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. Avoid using `.` in cookie names, - * as PHP will drop sessions from cookies with `.` in the name. - * - `cookiePath` - The url path for which session cookie is set. Maps to the - * `session.cookie_path` php.ini config. Defaults to base path of app. - * - `timeout` - The time in minutes the session should be valid for. - * Pass 0 to disable checking timeout. - * Please note that php.ini's session.gc_maxlifetime must be equal to or greater - * than the largest Session['timeout'] in all served websites for it to have the - * desired effect. - * - `defaults` - The default configuration set to use as a basis for your session. - * There are four built-in options: php, cake, cache, database. - * - `handler` - Can be used to enable a custom session handler. Expects an - * array with at least the `engine` key, being the name of the Session engine - * class to use for managing the session. CakePHP bundles the `CacheSession` - * and `DatabaseSession` engines. - * - `ini` - An associative array of additional ini values to set. - * - * The built-in `defaults` options are: - * - * - 'php' - Uses settings defined in your php.ini. - * - 'cake' - Saves session files in CakePHP's /tmp directory. - * - 'database' - Uses CakePHP's database sessions. - * - 'cache' - Use the Cache class to save sessions. - * - * To define a custom session handler, save it at src/Network/Session/.php. - * Make sure the class implements PHP's `SessionHandlerInterface` and set - * Session.handler to - * - * To use database sessions, load the SQL file located at config/schema/sessions.sql - */ - 'Session' => [ - 'defaults' => 'php', - ], - // *************************************************** - // Gradido specific configuration - // *************************************************** - // Login Server ip and port - 'LoginServer' => [ - 'host' => 'http://login-server', - 'port' => 1201, - 'url' => 'http://localhost' - ], - - // login server for look up emails from other groups - // workaround for using multiple groups until every code is finished as planned - // normally node server are responsible for email look up from users from other groups - 'NeighborLoginServers' => [ - ['host' => 'login-server', 'port' => 1201] - ], - 'GradidoBlockchain' => [ - // type: - // - db: centralized blockchain in mysql db, no cross group transactions - // - hedera: send transaction over hedera - 'type' => 'db', - // gradido nodes with blockchain (if type != db) - 'nodes' => [ - ['host' => 'node', 'port' => 13702] - ] - ], - - 'GroupAlias' => 'docker', - 'GDTServer' => [ - 'host' => 'https://gdt.gradido.net' // staging - ], - 'API' => [ - 'allowedCaller' => ['login-server'] - ], - 'ServerAdminEmail' => 'info@gradido.net', - 'noReplyEmail' => 'no-reply@gradido.net', - 'disableEmail' => true - -]; diff --git a/configs/login_server/LOCALE/de_DE.mo b/configs/login_server/LOCALE/de_DE.mo deleted file mode 100644 index bfee8efd3..000000000 Binary files a/configs/login_server/LOCALE/de_DE.mo and /dev/null differ diff --git a/configs/login_server/LOCALE/de_DE.po b/configs/login_server/LOCALE/de_DE.po deleted file mode 100644 index b4bca3098..000000000 --- a/configs/login_server/LOCALE/de_DE.po +++ /dev/null @@ -1,515 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-21 13:37+0200\n" -"PO-Revision-Date: 2021-06-21 13:38+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: de_DE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: build/http_pages/LoginPage.cpp:196 build/http_pages/LoginPage.cpp:275 -msgid "Login" -msgstr "Anmeldung" - -#: build/http_pages/LoginPage.cpp:196 -msgid "E-Mail or password isn't right, please try again!" -msgstr "" -"E-Mail und Passwort Kombination stimmen nicht, bitte versuche es erneut. " - -#: build/http_pages/LoginPage.cpp:205 -msgid "Passwort" -msgstr "Passwort" - -#: build/http_pages/LoginPage.cpp:205 -msgid "" -"Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut." -msgstr "" - -#: build/http_pages/LoginPage.cpp:208 build/http_pages/LoginPage.cpp:211 -msgid "User" -msgstr "" - -#: build/http_pages/LoginPage.cpp:208 -msgid "Error in saved data, the server admin will look at it." -msgstr "" - -#: build/http_pages/LoginPage.cpp:211 -msgid "Benutzer ist deaktiviert, kein Login möglich!" -msgstr "" - -#: build/http_pages/LoginPage.cpp:275 -msgid "Username and password are needed!" -msgstr "E-Mail und Passwort werden benötigt!" - -#: build/http_pages/LoginPage.cpp:376 src/cpp/model/Session.cpp:161 -#: src/cpp/model/Session.cpp:168 src/cpp/model/Session.cpp:220 -#: src/cpp/model/Session.cpp:231 -msgid "E-Mail" -msgstr "" - -#: build/http_pages/LoginPage.cpp:381 -#: src/cpp/SingletonManager/SessionManager.cpp:603 -#: src/cpp/SingletonManager/SessionManager.cpp:609 -#: src/cpp/SingletonManager/SessionManager.cpp:614 -#: src/cpp/SingletonManager/SessionManager.cpp:619 -#: src/cpp/SingletonManager/SessionManager.cpp:624 -#: src/cpp/SingletonManager/SessionManager.cpp:629 -msgid "Password" -msgstr "Passwort" - -#: build/http_pages/LoginPage.cpp:384 -msgid " Login " -msgstr "Anmeldung" - -#: build/http_pages/LoginPage.cpp:391 -msgid "You haven't any account yet? Please follow the link to create one." -msgstr "Du hast noch kein Gradido-Konto?" - -#: build/http_pages/LoginPage.cpp:395 -msgid "Create New Account" -msgstr "Neues Konto erstellen" - -#: build/http_pages/LoginPage.cpp:403 -msgid "Passwort vergessen" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:155 -msgid "E-Mail verifizieren" -msgstr "E-Mail überprüfen" - -#: build/http_pages/CheckEmailPage.cpp:165 -msgid "" -"Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden." -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:170 -msgid "Zur Startseite" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:175 -msgid "Bitte gib deinen E-Mail Verification Code ein:" -msgstr "Bitte gib deinen E-Mail Verification Code ein:" - -#: build/http_pages/CheckEmailPage.cpp:178 src/cpp/model/Session.cpp:184 -msgid "Email Verification Code" -msgstr "Email Verification Code" - -#: build/http_pages/CheckEmailPage.cpp:185 -msgid "Überprüfe Code" -msgstr "Überprüfe Code" - -#: build/http_pages/CheckEmailPage.cpp:190 -msgid "Du hast bisher keinen Code erhalten?" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:193 -msgid "E-Mail erneut zuschicken (in Arbeit)" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:198 -msgid "Funktioniert dein E-Mail Verification Code nicht?" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:201 -msgid "Schicke uns eine E-Mail und wir kümmern uns darum: " -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:208 -#: build/http_pages/ResetPasswordPage.cpp:273 -msgid "E-Mail an Support schicken" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:174 -#: build/http_pages/ResetPasswordPage.cpp:217 -msgid "Gib bitte hier deine E-Mail Adresse an:" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:183 -msgid "Bestätigen" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:225 -msgid "Hast du dir deine Passphrase notiert oder gemerkt?" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:234 -#: build/http_pages/PassphrasePage.cpp:373 -msgid "Ja" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:241 -msgid "Nein" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:247 -msgid "Absenden" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:255 -msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen." -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:260 -msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden." -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:265 -msgid "" -"Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-" -"Verzeichnis nach. " -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:268 -msgid "" -"Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten " -"gewartet?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:41 -#: build/http_pages/PassphrasePage.cpp:111 -#: build/http_pages/PassphrasePage.cpp:132 src/cpp/model/Session.cpp:465 -#: src/cpp/model/Session.cpp:477 src/cpp/model/Session.cpp:491 -msgid "Passphrase" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:42 -#: build/http_pages/PassphrasePage.cpp:451 -msgid "Neues Konto anlegen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:43 -msgid "2/3" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:111 -msgid "" -"Diese Passphrase ist ungültig, bitte überprüfen oder neu " -"generieren (lassen)." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:132 -msgid "intern error please try again later" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:147 -msgid "3/3" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:150 -#: build/http_pages/PassphrasePage.cpp:153 -msgid "1/3" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:152 -msgid "Neues Passwort anlegen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:270 -msgid "Passphrase abschreiben" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:287 -msgid "Was ist eine Passphrase?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:290 -msgid "Deine Passphrase besteht aus den im grünen Feld angezeigten Wörtern." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:293 -msgid "Sie dient deiner Sicherheit." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:296 -msgid "" -"Du brauchst deine Passphrase um dein Konto wiederherzustellen, wenn du mal " -"dein Passwort vergessen haben solltest." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:300 -msgid "Deine Passphrase (Groß/Kleinschreibung beachten)" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:309 -#: build/http_pages/PassphrasePage.cpp:352 -msgid "Was zu tun ist:" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:312 -msgid "" -"Schreibe dir die obenstehende Passphrase von Hand auf ein Blatt " -"Papier!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:315 -msgid "Speichere sie auf keinen Fall auf deinem Rechner oder Mobilgerät!!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:318 -msgid "Bewahre sie an einem sicheren Ort auf!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:322 -#: build/http_pages/PassphrasePage.cpp:478 -#: build/http_pages/PassphrasePage.cpp:487 -#: build/http_pages/PassphrasePage.cpp:511 -msgid "Weiter" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:355 -msgid "Hast du dir deine Passphrase gemerkt?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:358 -msgid "" -"Dann zeig es mir. Zur Unterstützung gebe ich dir deine Wörter aber in " -"anderer Reihenfolge." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:361 -msgid "Klicke sie an um sie einzusetzen." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:364 -msgid "Überprüfe dabei, ob du alle Wörter richtig geschrieben hast!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:370 -msgid "" -"Weil du kein Javascript verwendest geht es direkt weiter. Hast du dir deine " -"Passphrase gemerkt oder aufgeschrieben?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:429 -msgid "Deine E-Mail Adresse wurde erfolgreich bestätigt." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:437 -msgid "Neue Gradido Adresse anlegen / wiederherstellen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:440 -msgid "" -"Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes " -"wiederherstellen?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:460 -msgid "Bestehendes Konto wiederherstellen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:469 -msgid "" -"Falls du ein bestehendes Konto wiederherstellen willst, gib hier deine " -"Passphrase ein:" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:497 -msgid "Konto wiederherstellen / Neues Passwort anlegen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:501 -msgid "" -"Um dein Konto wiederherzustellen und dir ein Neues Passwort auswählen zu " -"können, tippe hier bitte die Wörter deiner Passphrase in der richtigen " -"Reihenfolge ein, welche du dir aufgeschrieben hast." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:524 -msgid "Fehler" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:527 -msgid "" -"Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende " -"dich an den Server-Admin." -msgstr "" - -#: src/cpp/model/Session.cpp:147 src/cpp/model/Session.cpp:177 -#: src/cpp/model/Session.cpp:645 src/cpp/model/Session.cpp:651 -#: src/cpp/model/Session.cpp:937 src/cpp/model/Session.cpp:953 -msgid "Benutzer" -msgstr "" - -#: src/cpp/model/Session.cpp:147 -msgid "Eingeloggter Benutzer ist kein Admin" -msgstr "" - -#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:212 -msgid "Vorname" -msgstr "" - -#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:157 -#: src/cpp/model/Session.cpp:212 src/cpp/model/Session.cpp:216 -msgid "" -"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen " -"<>&;" -msgstr "" - -#: src/cpp/model/Session.cpp:157 src/cpp/model/Session.cpp:216 -msgid "Nachname" -msgstr "" - -#: src/cpp/model/Session.cpp:161 src/cpp/model/Session.cpp:220 -msgid "Bitte gebe eine gültige E-Mail Adresse an." -msgstr "" - -#: src/cpp/model/Session.cpp:168 -msgid "Für diese E-Mail Adresse gibt es bereits einen Account" -msgstr "" - -#: src/cpp/model/Session.cpp:177 src/cpp/model/Session.cpp:184 -msgid "Fehler beim speichern!" -msgstr "" - -#: src/cpp/model/Session.cpp:231 -msgid "Für diese E-Mail Adresse gibt es bereits ein Konto" -msgstr "" - -#: src/cpp/model/Session.cpp:255 -msgid "Server" -msgstr "" - -#: src/cpp/model/Session.cpp:255 -msgid "Fehler beim speichen des Kontos bitte versuche es später noch einmal" -msgstr "" - -#: src/cpp/model/Session.cpp:350 src/cpp/model/Session.cpp:390 -#: src/cpp/model/Session.cpp:832 src/cpp/model/Session.cpp:841 -msgid "E-Mail Verification" -msgstr "E-Mail Überprüfung" - -#: src/cpp/model/Session.cpp:350 -msgid "Du hast dein Konto bereits aktiviert!" -msgstr "" - -#: src/cpp/model/Session.cpp:390 -msgid "Falscher Code für aktiven Login" -msgstr "" - -#: src/cpp/model/Session.cpp:465 -msgid "Deine Passphrase ist ungütig" -msgstr "" - -#: src/cpp/model/Session.cpp:477 -msgid "Ein Fehler trat auf, bitte versuche es erneut" -msgstr "" - -#: src/cpp/model/Session.cpp:491 -msgid "Das ist nicht die richtige Passphrase." -msgstr "" - -#: src/cpp/model/Session.cpp:645 -msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus." -msgstr "" - -#: src/cpp/model/Session.cpp:651 -msgid "" -"Fehler beim Löschen des Accounts. Bitte logge dich erneut ein und " -"versuche es nochmal." -msgstr "" - -#: src/cpp/model/Session.cpp:832 -msgid "Konnte kein passendes Konto finden." -msgstr "" - -#: src/cpp/model/Session.cpp:841 -msgid "Fehler beim laden des Benutzers." -msgstr "" - -#: src/cpp/model/Session.cpp:937 -msgid "Kein gültiger Benutzer, bitte logge dich erneut ein." -msgstr "" - -#: src/cpp/model/Session.cpp:953 -msgid "Fehler beim generieren der Passphrase, der Admin bekommt eine E-Mail. " -msgstr "" - -#: src/cpp/model/email/Email.cpp:174 -msgid "Default Email Subject" -msgstr "" - -#: src/cpp/model/email/Email.cpp:180 -msgid "Error from Gradido Login Server" -msgstr "Fehler auf dem Gradido Login Server" - -#: src/cpp/model/email/Email.cpp:200 -msgid "Gradido: E-Mail Verification" -msgstr "Gradido: E-Mail Überprüfung" - -#: src/cpp/model/email/Email.cpp:246 -msgid "Gradido: Reset Password" -msgstr "Gradido: Passwort zurücksetzen" - -#: src/cpp/SingletonManager/SessionManager.cpp:604 -msgid "" -"Please enter a valid password with at least 8 characters, upper and lower " -"case letters, at least one number and one special character (@$!%*?&+-_)!" -msgstr "" -"Bitte gebe ein gültiges Password ein mit mindestens 8 Zeichen, Groß- und " -"Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen (@$!%*?&+-_) " -"ein!" - -#: src/cpp/SingletonManager/SessionManager.cpp:610 -msgid "Your password is to short!" -msgstr "Dein Passwort ist zu kurz!" - -#: src/cpp/SingletonManager/SessionManager.cpp:615 -msgid "Your password does not contain lowercase letters!" -msgstr "Dein Passwort enthält keine Kleinbuchstaben!" - -#: src/cpp/SingletonManager/SessionManager.cpp:620 -msgid "Your password does not contain any capital letters!" -msgstr " Dein Passwort enthält keine Großbuchstaben!" - -#: src/cpp/SingletonManager/SessionManager.cpp:625 -msgid "Your password does not contain any number!" -msgstr "Dein Passwort enthält keine Zahlen!" - -#: src/cpp/SingletonManager/SessionManager.cpp:630 -msgid "Your password does not contain special characters (@$!%*?&+-)!" -msgstr "Dein Passwort enthält keine Sonderzeichen (@$!%*?&+-)!" - -#~ msgid "Account" -#~ msgstr "Konto" - -#~ msgid "E-Mail Address not checked, do you already get one?" -#~ msgstr "" -#~ "E-Mail Adresse wurde noch nicht überprüft. Hast du schon in deine E-Mails " -#~ "geschaut? Bitte schau auch in dein Spam-Verzeichnis nach." - -#~ msgid "" -#~ "Schreibe dir deine Passphrase auf und packe sie gut weg. Du brauchst sie " -#~ "um deine Adresse wiederherzustellen. Wenn du sie verlierst, sind auch " -#~ "deine Gradidos verloren." -#~ msgstr "" -#~ "Schreibe dir deine Passphrase auf oder drucke sie aus und bewahre sie " -#~ "in Papier-Form an einem sicheren Ort auf (speichere sie nicht auf " -#~ "deinem Rechner oder Mobilgerät)! Du brauchst deine Passphrase um dein " -#~ "Konto wiederherzustellen, wenn du mal dein Passort vergessen haben " -#~ "solltest. " - -#~ msgid "" -#~ "Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. " -#~ "Bitcoin) um maximale Sicherheit zu erreichen." -#~ msgstr "" -#~ "Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. " -#~ "Bitcoin) um für dich die maximale Sicherheit zu gewährleisten." - -#~ msgid "" -#~ "Der Code stimmt nicht, bitte überprüfe ihn nochmal oder " -#~ "registriere dich erneut oder wende dich an den Server-Admin" -#~ msgstr "" -#~ "Der Code stimmt nicht, bitte überprüfe ihn nochmal oder " -#~ "schreibe mir eine E-Mail an: coin@gradido.net." diff --git a/configs/login_server/LOCALE/en_GB.mo b/configs/login_server/LOCALE/en_GB.mo deleted file mode 100644 index 3f26100ef..000000000 Binary files a/configs/login_server/LOCALE/en_GB.mo and /dev/null differ diff --git a/configs/login_server/LOCALE/en_GB.po b/configs/login_server/LOCALE/en_GB.po deleted file mode 100644 index 16e4bbb4f..000000000 --- a/configs/login_server/LOCALE/en_GB.po +++ /dev/null @@ -1,428 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-28 10:50+0200\n" -"PO-Revision-Date: 2020-05-28 10:53+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: en_GB\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:85 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:124 -msgid "Login" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:85 -msgid "E-Mail or password isn't right, please try again!" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:88 -msgid "Passwort" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:88 -msgid "" -"Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut." -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:91 -msgid "Account" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:91 -msgid "E-Mail Address not checked, do you already get one?" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:124 -msgid "Username and password are needed!" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:175 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:50 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:54 -#: model/Session.cpp:163 model/Session.cpp:170 model/Session.cpp:209 -#: model/Session.cpp:234 -msgid "E-Mail" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:178 -msgid "Password" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:180 -msgid " Login " -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:182 -msgid "You haven't any account yet? Please follow the link to create one." -msgstr "Don't have an Gradido-account yet?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:183 -msgid "Create New Account" -msgstr "Sign Up" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:186 -msgid "Passwort vergessen" -msgstr "Reset Password" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:97 -msgid "Bitte gebe deinen E-Mail Verification Code ein:" -msgstr "Please enter your E-Mail Verification Code:" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:98 -#: model/Session.cpp:186 -msgid "Email Verification Code" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:100 -msgid "Überprüfe Code" -msgstr "Check Code" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:104 -msgid "Du hast bisher keinen Code erhalten?" -msgstr "You didn't get a code yet?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:105 -msgid "E-Mail erneut zuschicken (in Arbeit)" -msgstr "Re-Send E-Mail (work in progress)" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:108 -msgid "Funktioniert dein E-Mail Verification Code nicht?" -msgstr "Your E-Mail Verfication Code doesn't work?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:109 -msgid "Schicke uns eine E-Mail und wir kümmern uns darum: " -msgstr "Send us a E-Mail and we take care of it:" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:110 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:133 -msgid "E-Mail an Support schicken" -msgstr "Send E-Mail to support" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:50 -msgid "E-Mail Adresse konnte nicht gefunden werden oder ist nicht aktiviert." -msgstr "E-Mail not found or not activated." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:54 -msgid "E-Mail Adresse nicht angegeben." -msgstr "Please give your E-Mail Address." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:59 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:74 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:26 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:94 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:114 -#: model/Session.cpp:495 model/Session.cpp:507 model/Session.cpp:515 -msgid "Passphrase" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:59 -msgid "Bitte wähle eine Option aus." -msgstr "Please choose one Option." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:74 -msgid "Ungültige Option" -msgstr "Invalid option" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:107 -msgid "Gebe bitte hier deine E-Mail Adresse an:" -msgstr "Please enter a valid email." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:109 -msgid "Hast du dir deine Passphrase notiert oder gemerkt?" -msgstr "Do you memorized your passphrase?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:113 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:196 -msgid "Ja" -msgstr "Yes" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:118 -msgid "Nein" -msgstr "No" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:123 -msgid "Absenden" -msgstr "Send" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:127 -msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen." -msgstr "You get an E-Mail to reset your password." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:129 -msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden." -msgstr "The Admin get an E-Mail, wait on his replay." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:131 -msgid "" -"Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-" -"Verzeichnis nach. " -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:132 -msgid "" -"Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten " -"gewartet?" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:27 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:256 -msgid "Neues Konto anlegen" -msgstr "Create new Account" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:28 -msgid "2/3" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:94 -msgid "" -"Diese Passphrase ist ungültig, bitte überprüfen oder neu " -"generieren (lassen)." -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:114 -msgid "intern error please try again later" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:129 -msgid "3/3" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:132 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:135 -msgid "1/3" -msgstr "" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:134 -msgid "Neues Passwort anlegen" -msgstr "Create new Password" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:153 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:188 -msgid "Was zu tun ist:" -msgstr "What to do:" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:154 -msgid "" -"Schreibe dir deine Passphrase auf und packe sie gut weg. Du brauchst sie um " -"deine Adresse wiederherzustellen. Wenn du sie verlierst, sind auch deine " -"Gradidos verloren." -msgstr "" -"Write down your passphrase and put it away well. You need it to restore your " -"address. If you lose them, your Gradidos are lost too." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:157 -msgid "Deine Passphrase (Groß/Kleinschreibung beachten)" -msgstr "Your Passphrase" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:161 -msgid "Was ist eine Passphrase?" -msgstr "What is a passphrase?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:162 -msgid "" -"Die Passphrase kommt aus dem Crypto-Bereich und ist ein Weg einen " -"komplizierte kryptografischen Schlüssel in einer lesbaren Form darzustellen." -msgstr "" -"The passphrase comes from the crypto area and is a way to represent a " -"complicated cryptographic key in a legible form." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:163 -msgid "" -"Der neue Gradido basiert technisch auf einer Kryptowährung (wie z.B. " -"Bitcoin) um maximale Sicherheit zu erreichen." -msgstr "" -"The new Gradido is technically based on a cryptocurrency (such as Bitcoin) " -"to achieve maximum security for you." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:165 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:275 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:280 -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:293 -msgid "Weiter" -msgstr "Next" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:189 -msgid "Hast du dir deine Passphrase gemerkt?" -msgstr "Do you memorized your passphrase?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:190 -msgid "" -"Dann zeig es mir. Zur Unterstützung gebe ich dir deine Wörter aber in " -"anderer Reihenfolge." -msgstr "" -"Then show me. I will give you your words in a different order as support." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:191 -msgid "Klicke sie an um sie einzusetzen." -msgstr "Click on it to use it." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:195 -msgid "" -"Weil du kein Javascript verwendest geht es direkt weiter. Hast du dir deine " -"Passphrase gemerkt oder aufgeschrieben?" -msgstr "" -"Because you don't use javascript it goes straight on. Did you remember or " -"write down your passphrase?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:242 -msgid "Deine E-Mail Adresse wurde erfolgreich bestätigt." -msgstr "Your email address has been successfully confirmed." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:246 -msgid "Neue Gradido Adresse anlegen / wiederherstellen" -msgstr "Create / restore new Gradido address" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:247 -msgid "" -"Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes " -"wiederherstellen?" -msgstr "" -"Do you want to restore an existing Gradido account or create a new one?" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:263 -msgid "Bestehendes Konto wiederherstellen" -msgstr "Restore existing Account" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:270 -msgid "" -"Falls du ein bestehendes Konto wiederherstellen willst, gib hier deine " -"Passphrase ein:" -msgstr "" -"If you want to restore an existing account, enter your passphrase here:" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:288 -msgid "Konto wiederherstellen / Neues Passwort anlegen" -msgstr "Restore account / create new password" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:289 -msgid "" -"Um dein Konto wiederherzustellen, dir ein Neues Passwort auswählen zu " -"können, tippe hier bitte die Wörter deiner Passphrase in der richtigen " -"Reihenfolge ein, welche du dir aufgeschrieben hast." -msgstr "" -"To restore your account and to be able to choose a new password, please type " -"in the words of your passphrase in the correct order, which you have written " -"down." - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:303 -msgid "Fehler" -msgstr "Erro" - -#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp:304 -msgid "" -"Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende " -"dich an den Server-Admin." -msgstr "" -"Invalid page, if you see that something is wrong here. Please contact the " -"server admin." - -#: model/Session.cpp:149 model/Session.cpp:180 model/Session.cpp:700 -#: model/Session.cpp:706 model/Session.cpp:1005 -msgid "Benutzer" -msgstr "User" - -#: model/Session.cpp:149 -msgid "Eingeloggter Benutzer ist kein Admin" -msgstr "Logged in user is not admin" - -#: model/Session.cpp:155 model/Session.cpp:201 -msgid "Vorname" -msgstr "Firstname" - -#: model/Session.cpp:155 model/Session.cpp:159 model/Session.cpp:201 -#: model/Session.cpp:205 -msgid "" -"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen " -"<>&;" -msgstr "Please enter your Name. At least 3 Character, without <>& and ;" - -#: model/Session.cpp:159 model/Session.cpp:205 -msgid "Nachname" -msgstr "Lastname" - -#: model/Session.cpp:163 model/Session.cpp:209 -msgid "Bitte gebe eine gültige E-Mail Adresse an." -msgstr "Please enter a valid email." - -#: model/Session.cpp:170 model/Session.cpp:234 -msgid "Für diese E-Mail Adresse gibt es bereits einen Account" -msgstr "This email has an account already." - -#: model/Session.cpp:180 model/Session.cpp:186 -msgid "Fehler beim speichern!" -msgstr "Error while saving!" - -#: model/Session.cpp:379 model/Session.cpp:438 model/Session.cpp:881 -#: model/Session.cpp:889 -msgid "E-Mail Verification" -msgstr "" - -#: model/Session.cpp:379 -msgid "Du hast dein Konto bereits aktiviert!" -msgstr "You already activated your account!" - -#: model/Session.cpp:438 -msgid "Falscher Code für aktiven Login" -msgstr "Wrong Code for active Login." - -#: model/Session.cpp:495 -msgid "Deine Passphrase ist ungütig" -msgstr "Your passphrase is invalid" - -#: model/Session.cpp:507 -msgid "Ein Fehler trat auf, bitte versuche es erneut" -msgstr "An error occurred, please try again" - -#: model/Session.cpp:515 -msgid "Das ist nicht die richtige Passphrase." -msgstr "This is not the correct passphrase." - -#: model/Session.cpp:700 -msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus." -msgstr "Couldn't connect to the community server, send E-Mail to admin." - -#: model/Session.cpp:706 -msgid "" -"Fehler beim Löschen des Accounts. Bitte logge dich erneut ein und " -"versuche es nochmal." -msgstr "Error by deleting the account. Please re-login and try again." - -#: model/Session.cpp:881 -msgid "Konnte kein passendes Konto finden." -msgstr "This Account didn't seem to exist." - -#: model/Session.cpp:889 -msgid "Fehler beim laden des Benutzers." -msgstr "" - -#: model/Session.cpp:1005 -msgid "Kein gültiger Benutzer, bitte logge dich erneut ein." -msgstr "Invalid User, please re-login." - -#~ msgid "*Das Konto muss nach dem 01.09.2019 angelegt worden sein." -#~ msgstr "* The account must have been created after September 1st, 2019." - -#~ msgid "Nein, bitte ein neues erstellen!" -#~ msgstr "No, please create a new one!" - -#~ msgid "Deine Passphrase" -#~ msgstr "Your passphrase" - -#~ msgid "" -#~ "Der Code stimmt nicht, bitte überprüfe ihn nochmal oder " -#~ "registriere dich erneut oder wende dich an den Server-Admin" -#~ msgstr "" -#~ "The email verification code isn't correct. Please check at spell errors " -#~ "and try again or ask the server admin." diff --git a/configs/login_server/LOCALE/messages.pot b/configs/login_server/LOCALE/messages.pot deleted file mode 100644 index bc884cb9e..000000000 --- a/configs/login_server/LOCALE/messages.pot +++ /dev/null @@ -1,477 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-21 13:37+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: build/http_pages/LoginPage.cpp:196 build/http_pages/LoginPage.cpp:275 -msgid "Login" -msgstr "" - -#: build/http_pages/LoginPage.cpp:196 -msgid "E-Mail or password isn't right, please try again!" -msgstr "" - -#: build/http_pages/LoginPage.cpp:205 -msgid "Passwort" -msgstr "" - -#: build/http_pages/LoginPage.cpp:205 -msgid "" -"Passwort wird noch berechnet, bitte versuche es in etwa 1 Minute erneut." -msgstr "" - -#: build/http_pages/LoginPage.cpp:208 build/http_pages/LoginPage.cpp:211 -msgid "User" -msgstr "" - -#: build/http_pages/LoginPage.cpp:208 -msgid "Error in saved data, the server admin will look at it." -msgstr "" - -#: build/http_pages/LoginPage.cpp:211 -msgid "Benutzer ist deaktiviert, kein Login möglich!" -msgstr "" - -#: build/http_pages/LoginPage.cpp:275 -msgid "Username and password are needed!" -msgstr "" - -#: build/http_pages/LoginPage.cpp:376 src/cpp/model/Session.cpp:161 -#: src/cpp/model/Session.cpp:168 src/cpp/model/Session.cpp:220 -#: src/cpp/model/Session.cpp:231 -msgid "E-Mail" -msgstr "" - -#: build/http_pages/LoginPage.cpp:381 -#: src/cpp/SingletonManager/SessionManager.cpp:603 -#: src/cpp/SingletonManager/SessionManager.cpp:609 -#: src/cpp/SingletonManager/SessionManager.cpp:614 -#: src/cpp/SingletonManager/SessionManager.cpp:619 -#: src/cpp/SingletonManager/SessionManager.cpp:624 -#: src/cpp/SingletonManager/SessionManager.cpp:629 -msgid "Password" -msgstr "" - -#: build/http_pages/LoginPage.cpp:384 -msgid " Login " -msgstr "" - -#: build/http_pages/LoginPage.cpp:391 -msgid "You haven't any account yet? Please follow the link to create one." -msgstr "" - -#: build/http_pages/LoginPage.cpp:395 -msgid "Create New Account" -msgstr "" - -#: build/http_pages/LoginPage.cpp:403 -msgid "Passwort vergessen" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:155 -msgid "E-Mail verifizieren" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:165 -msgid "" -"Deine E-Mail wurde erfolgreich bestätigt. Du kannst nun Gradidos versenden." -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:170 -msgid "Zur Startseite" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:175 -msgid "Bitte gib deinen E-Mail Verification Code ein:" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:178 src/cpp/model/Session.cpp:184 -msgid "Email Verification Code" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:185 -msgid "Überprüfe Code" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:190 -msgid "Du hast bisher keinen Code erhalten?" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:193 -msgid "E-Mail erneut zuschicken (in Arbeit)" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:198 -msgid "Funktioniert dein E-Mail Verification Code nicht?" -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:201 -msgid "Schicke uns eine E-Mail und wir kümmern uns darum: " -msgstr "" - -#: build/http_pages/CheckEmailPage.cpp:208 -#: build/http_pages/ResetPasswordPage.cpp:273 -msgid "E-Mail an Support schicken" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:174 -#: build/http_pages/ResetPasswordPage.cpp:217 -msgid "Gib bitte hier deine E-Mail Adresse an:" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:183 -msgid "Bestätigen" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:225 -msgid "Hast du dir deine Passphrase notiert oder gemerkt?" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:234 -#: build/http_pages/PassphrasePage.cpp:373 -msgid "Ja" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:241 -msgid "Nein" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:247 -msgid "Absenden" -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:255 -msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen." -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:260 -msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden." -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:265 -msgid "" -"Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-" -"Verzeichnis nach. " -msgstr "" - -#: build/http_pages/ResetPasswordPage.cpp:268 -msgid "" -"Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten " -"gewartet?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:41 -#: build/http_pages/PassphrasePage.cpp:111 -#: build/http_pages/PassphrasePage.cpp:132 src/cpp/model/Session.cpp:465 -#: src/cpp/model/Session.cpp:477 src/cpp/model/Session.cpp:491 -msgid "Passphrase" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:42 -#: build/http_pages/PassphrasePage.cpp:451 -msgid "Neues Konto anlegen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:43 -msgid "2/3" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:111 -msgid "" -"Diese Passphrase ist ungültig, bitte überprüfen oder neu " -"generieren (lassen)." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:132 -msgid "intern error please try again later" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:147 -msgid "3/3" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:150 -#: build/http_pages/PassphrasePage.cpp:153 -msgid "1/3" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:152 -msgid "Neues Passwort anlegen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:270 -msgid "Passphrase abschreiben" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:287 -msgid "Was ist eine Passphrase?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:290 -msgid "Deine Passphrase besteht aus den im grünen Feld angezeigten Wörtern." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:293 -msgid "Sie dient deiner Sicherheit." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:296 -msgid "" -"Du brauchst deine Passphrase um dein Konto wiederherzustellen, wenn du mal " -"dein Passwort vergessen haben solltest." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:300 -msgid "Deine Passphrase (Groß/Kleinschreibung beachten)" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:309 -#: build/http_pages/PassphrasePage.cpp:352 -msgid "Was zu tun ist:" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:312 -msgid "" -"Schreibe dir die obenstehende Passphrase von Hand auf ein Blatt " -"Papier!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:315 -msgid "Speichere sie auf keinen Fall auf deinem Rechner oder Mobilgerät!!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:318 -msgid "Bewahre sie an einem sicheren Ort auf!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:322 -#: build/http_pages/PassphrasePage.cpp:478 -#: build/http_pages/PassphrasePage.cpp:487 -#: build/http_pages/PassphrasePage.cpp:511 -msgid "Weiter" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:355 -msgid "Hast du dir deine Passphrase gemerkt?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:358 -msgid "" -"Dann zeig es mir. Zur Unterstützung gebe ich dir deine Wörter aber in " -"anderer Reihenfolge." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:361 -msgid "Klicke sie an um sie einzusetzen." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:364 -msgid "Überprüfe dabei, ob du alle Wörter richtig geschrieben hast!" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:370 -msgid "" -"Weil du kein Javascript verwendest geht es direkt weiter. Hast du dir deine " -"Passphrase gemerkt oder aufgeschrieben?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:429 -msgid "Deine E-Mail Adresse wurde erfolgreich bestätigt." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:437 -msgid "Neue Gradido Adresse anlegen / wiederherstellen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:440 -msgid "" -"Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes " -"wiederherstellen?" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:460 -msgid "Bestehendes Konto wiederherstellen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:469 -msgid "" -"Falls du ein bestehendes Konto wiederherstellen willst, gib hier deine " -"Passphrase ein:" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:497 -msgid "Konto wiederherstellen / Neues Passwort anlegen" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:501 -msgid "" -"Um dein Konto wiederherzustellen und dir ein Neues Passwort auswählen zu " -"können, tippe hier bitte die Wörter deiner Passphrase in der richtigen " -"Reihenfolge ein, welche du dir aufgeschrieben hast." -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:524 -msgid "Fehler" -msgstr "" - -#: build/http_pages/PassphrasePage.cpp:527 -msgid "" -"Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende " -"dich an den Server-Admin." -msgstr "" - -#: src/cpp/model/Session.cpp:147 src/cpp/model/Session.cpp:177 -#: src/cpp/model/Session.cpp:645 src/cpp/model/Session.cpp:651 -#: src/cpp/model/Session.cpp:937 src/cpp/model/Session.cpp:953 -msgid "Benutzer" -msgstr "" - -#: src/cpp/model/Session.cpp:147 -msgid "Eingeloggter Benutzer ist kein Admin" -msgstr "" - -#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:212 -msgid "Vorname" -msgstr "" - -#: src/cpp/model/Session.cpp:153 src/cpp/model/Session.cpp:157 -#: src/cpp/model/Session.cpp:212 src/cpp/model/Session.cpp:216 -msgid "" -"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen " -"<>&;" -msgstr "" - -#: src/cpp/model/Session.cpp:157 src/cpp/model/Session.cpp:216 -msgid "Nachname" -msgstr "" - -#: src/cpp/model/Session.cpp:161 src/cpp/model/Session.cpp:220 -msgid "Bitte gebe eine gültige E-Mail Adresse an." -msgstr "" - -#: src/cpp/model/Session.cpp:168 -msgid "Für diese E-Mail Adresse gibt es bereits einen Account" -msgstr "" - -#: src/cpp/model/Session.cpp:177 src/cpp/model/Session.cpp:184 -msgid "Fehler beim speichern!" -msgstr "" - -#: src/cpp/model/Session.cpp:231 -msgid "Für diese E-Mail Adresse gibt es bereits ein Konto" -msgstr "" - -#: src/cpp/model/Session.cpp:255 -msgid "Server" -msgstr "" - -#: src/cpp/model/Session.cpp:255 -msgid "Fehler beim speichen des Kontos bitte versuche es später noch einmal" -msgstr "" - -#: src/cpp/model/Session.cpp:350 src/cpp/model/Session.cpp:390 -#: src/cpp/model/Session.cpp:832 src/cpp/model/Session.cpp:841 -msgid "E-Mail Verification" -msgstr "" - -#: src/cpp/model/Session.cpp:350 -msgid "Du hast dein Konto bereits aktiviert!" -msgstr "" - -#: src/cpp/model/Session.cpp:390 -msgid "Falscher Code für aktiven Login" -msgstr "" - -#: src/cpp/model/Session.cpp:465 -msgid "Deine Passphrase ist ungütig" -msgstr "" - -#: src/cpp/model/Session.cpp:477 -msgid "Ein Fehler trat auf, bitte versuche es erneut" -msgstr "" - -#: src/cpp/model/Session.cpp:491 -msgid "Das ist nicht die richtige Passphrase." -msgstr "" - -#: src/cpp/model/Session.cpp:645 -msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus." -msgstr "" - -#: src/cpp/model/Session.cpp:651 -msgid "" -"Fehler beim Löschen des Accounts. Bitte logge dich erneut ein und " -"versuche es nochmal." -msgstr "" - -#: src/cpp/model/Session.cpp:832 -msgid "Konnte kein passendes Konto finden." -msgstr "" - -#: src/cpp/model/Session.cpp:841 -msgid "Fehler beim laden des Benutzers." -msgstr "" - -#: src/cpp/model/Session.cpp:937 -msgid "Kein gültiger Benutzer, bitte logge dich erneut ein." -msgstr "" - -#: src/cpp/model/Session.cpp:953 -msgid "Fehler beim generieren der Passphrase, der Admin bekommt eine E-Mail. " -msgstr "" - -#: src/cpp/model/email/Email.cpp:174 -msgid "Default Email Subject" -msgstr "" - -#: src/cpp/model/email/Email.cpp:180 -msgid "Error from Gradido Login Server" -msgstr "" - -#: src/cpp/model/email/Email.cpp:200 -msgid "Gradido: E-Mail Verification" -msgstr "" - -#: src/cpp/model/email/Email.cpp:246 -msgid "Gradido: Reset Password" -msgstr "" - -#: src/cpp/SingletonManager/SessionManager.cpp:604 -msgid "" -"Please enter a valid password with at least 8 characters, upper and lower " -"case letters, at least one number and one special character (@$!%*?&+-_)!" -msgstr "" - -#: src/cpp/SingletonManager/SessionManager.cpp:610 -msgid "Your password is to short!" -msgstr "" - -#: src/cpp/SingletonManager/SessionManager.cpp:615 -msgid "Your password does not contain lowercase letters!" -msgstr "" - -#: src/cpp/SingletonManager/SessionManager.cpp:620 -msgid "Your password does not contain any capital letters!" -msgstr "" - -#: src/cpp/SingletonManager/SessionManager.cpp:625 -msgid "Your password does not contain any number!" -msgstr "" - -#: src/cpp/SingletonManager/SessionManager.cpp:630 -msgid "Your password does not contain special characters (@$!%*?&+-)!" -msgstr "" diff --git a/configs/login_server/cacert.pem b/configs/login_server/cacert.pem deleted file mode 100644 index 3a08fd8db..000000000 --- a/configs/login_server/cacert.pem +++ /dev/null @@ -1,3435 +0,0 @@ -## -## Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Tue Dec 8 04:12:05 2020 GMT -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## -## Conversion done with mk-ca-bundle.pl version 1.28. -## SHA256: d820b8696d8ffe42064a1384a56a8981cdc7e7e198036bbb5fa04a6c282dd9a2 -## - - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ -KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy -T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT -J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e -nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx -ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 -XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk -lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB -lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy -lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt -66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn -wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh -D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy -BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie -J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud -DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv -Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 -UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm -VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK -+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW -IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 -WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X -f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II -4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 -VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw -EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN -MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp -c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq -t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C -jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg -vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF -ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR -AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend -jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO -peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR -7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi -GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm -5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr -44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf -Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m -Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp -mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk -vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf -KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br -NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj -viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X -DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 -aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 -N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm -+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH -6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu -MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h -qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 -FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs -ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc -celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X -CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P -4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F -kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L -3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx -/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa -DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP -e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu -WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ -DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub -DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -======================================== ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG -EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz -MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu -QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ -03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK -ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU -+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC -PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT -OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK -F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK -0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ -0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB -leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID -AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ -SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG -NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l -Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga -kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q -hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs -g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 -aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 -nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC -ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo -Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z -WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 2009 -============================== ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe -Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE -LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD -ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA -BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv -KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z -p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC -AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ -4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y -eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw -MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G -PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw -OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm -2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV -dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph -X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 EV 2009 -================================= ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS -egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh -zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T -7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 -sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 -11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv -cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v -ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El -MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp -b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh -c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ -PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX -ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA -NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv -w9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -CA Disig Root R2 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC -w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia -xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 -A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S -GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV -g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa -5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE -koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A -Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i -Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u -Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV -sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je -dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 -1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx -mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 -utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 -sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg -UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV -7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -ACCVRAIZ1 -========= ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB -SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 -MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH -UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM -jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 -RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD -aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ -0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG -WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 -8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR -5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J -9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK -Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw -Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu -Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM -Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA -QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh -AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA -YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj -AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA -IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk -aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 -dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 -MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI -hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E -R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN -YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 -nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ -TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 -sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg -Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd -3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p -EfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -TWCA Global Root CA -=================== ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT -CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD -QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK -EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C -nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV -r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR -Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV -tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W -KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 -sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p -yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn -kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI -zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g -cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M -8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg -/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg -lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP -A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m -i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 -EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 -zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= ------END CERTIFICATE----- - -TeliaSonera Root CA v1 -====================== ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE -CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 -MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW -VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ -6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA -3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k -B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn -Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH -oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 -F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ -oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 -gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc -TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB -AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW -DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm -zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW -pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV -G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc -c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT -JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 -qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 -Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems -WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 2 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx -MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ -SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F -vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 -2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV -WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy -YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 -r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf -vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR -3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== ------END CERTIFICATE----- - -Atos TrustedRoot 2011 -===================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU -cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 -MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG -A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV -hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr -54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ -DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 -HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR -z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R -l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ -bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h -k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh -TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 -61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G -3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -QuoVadis Root CA 1 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE -PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm -PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 -Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN -ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l -g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV -7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX -9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f -iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg -t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI -hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 -GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct -Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP -+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh -3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa -wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 -O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 -FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV -hMJKzRwuJIczYOXD ------END CERTIFICATE----- - -QuoVadis Root CA 2 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh -ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY -NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t -oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o -MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l -V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo -L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ -sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD -6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh -lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI -hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K -pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 -x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz -dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X -U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw -mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD -zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN -JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr -O3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -QuoVadis Root CA 3 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 -IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL -Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe -6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 -I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U -VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 -5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi -Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM -dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt -rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI -hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS -t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ -TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du -DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib -Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD -hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX -0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW -dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 -PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -DigiCert Assured ID Root G2 -=========================== ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw -MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH -35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq -bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw -VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP -YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn -lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO -w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv -0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz -d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW -hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M -jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -DigiCert Assured ID Root G3 -=========================== ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD -VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 -MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ -BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb -RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs -KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF -UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy -YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy -1vUhZscv6pZjamVFkpUBtA== ------END CERTIFICATE----- - -DigiCert Global Root G2 -======================= ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx -MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ -kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO -3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV -BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM -UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB -o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu -5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr -F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U -WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH -QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ -iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -DigiCert Global Root G3 -======================= ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD -VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw -MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k -aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C -AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O -YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp -Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y -3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 -VOKa5Vt8sycX ------END CERTIFICATE----- - -DigiCert Trusted Root G4 -======================== ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw -HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 -MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp -pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o -k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa -vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY -QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 -MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm -mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 -f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH -dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 -oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY -ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr -yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy -7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah -ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN -5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb -/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa -5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK -G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP -82Z+ ------END CERTIFICATE----- - -COMODO RSA Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn -dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ -FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ -5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG -x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX -2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL -OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 -sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C -GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 -WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt -rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ -nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg -tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW -sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp -pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA -zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq -ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 -7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I -LaZRfyHBNVOFBkpdn627G190 ------END CERTIFICATE----- - -USERTrust RSA Certification Authority -===================================== ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE -BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK -ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE -BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK -ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz -0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j -Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn -RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O -+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq -/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE -Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM -lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 -yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ -eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW -FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ -7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ -Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM -8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi -FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi -yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c -J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw -sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx -Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -USERTrust ECC Certification Authority -===================================== ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC -VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC -VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 -0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez -nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV -HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB -HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu -9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -GlobalSign ECC Root CA - R4 -=========================== ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl -OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV -MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF -JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= ------END CERTIFICATE----- - -GlobalSign ECC Root CA - R5 -=========================== ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 -SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS -h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd -BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx -uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 -yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G3 -================================== ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y -olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t -x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy -EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K -Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur -mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 -1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp -07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo -FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE -41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu -yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq -KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 -v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA -8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b -8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r -mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq -1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI -JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV -tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= ------END CERTIFICATE----- - -Staat der Nederlanden EV Root CA -================================ ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M -MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl -cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk -SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW -O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r -0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 -Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV -XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr -08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV -0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd -74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx -fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa -ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu -c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq -5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN -b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN -f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi -5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 -WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK -DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy -eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== ------END CERTIFICATE----- - -IdenTrust Commercial Root CA 1 -============================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG -EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS -b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES -MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB -IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld -hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ -mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi -1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C -XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl -3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy -NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV -WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg -xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix -uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI -hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg -ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt -ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV -YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX -feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro -kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe -2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz -Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R -cGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -IdenTrust Public Sector Root CA 1 -================================= ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG -EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv -ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV -UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS -b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy -P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 -Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI -rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf -qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS -mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn -ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh -LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v -iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL -4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B -Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw -DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A -mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt -GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt -m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx -NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 -Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI -ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC -ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ -3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -Entrust Root Certification Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy -bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug -b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw -HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT -DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx -OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP -/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz -HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU -s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y -TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 -0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z -iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi -nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ -vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO -e4pIb4tF9g== ------END CERTIFICATE----- - -Entrust Root Certification Authority - EC1 -========================================== ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx -FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn -YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw -FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs -LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy -AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef -9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h -vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 -kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -CFCA EV ROOT -============ ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE -CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB -IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw -MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD -DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV -BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD -7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN -uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW -ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 -xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f -py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K -gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol -hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ -tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf -BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q -ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua -4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG -E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX -BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn -aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy -PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX -kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C -ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -OISTE WISeKey Global Root GB CA -=============================== ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG -EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw -MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds -b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX -scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP -rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk -9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o -Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg -GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI -hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD -dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 -VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui -HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -SZAFIR ROOT CA2 -=============== ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG -A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV -BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ -BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD -VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q -qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK -DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE -2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ -ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi -ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC -AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 -O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 -oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul -4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 -+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -Certum Trusted Network CA 2 -=========================== ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE -BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 -bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y -ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ -TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB -IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 -7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o -CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b -Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p -uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 -GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ -9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB -Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye -hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM -BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI -hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW -Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA -L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo -clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM -pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb -w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo -J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm -ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX -is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 -zAYspsbiDrW5viSP ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2015 -======================================================= ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT -BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 -aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx -MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg -QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV -BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw -MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv -bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh -iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ -6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd -FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr -i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F -GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 -fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu -iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI -hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ -D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM -d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y -d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn -82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb -davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F -Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt -J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa -JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q -p/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions ECC RootCA 2015 -=========================================================== ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 -aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u -cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw -MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj -IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD -VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 -Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP -dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK -Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA -GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn -dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -ISRG Root X1 -============ ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE -BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD -EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG -EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT -DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r -Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 -3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K -b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN -Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ -4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf -1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu -hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH -usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r -OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G -A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY -9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV -0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt -hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw -TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx -e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA -JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD -YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n -JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ -m+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -AC RAIZ FNMT-RCM -================ ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT -AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw -MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD -TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf -qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr -btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL -j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou -08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw -WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT -tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ -47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC -ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa -i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o -dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s -D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ -j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT -Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW -+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 -Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d -8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm -5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG -rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -Amazon Root CA 1 -================ ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD -VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 -MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv -bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH -FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ -gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t -dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce -VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 -DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM -CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy -8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa -2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 -xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -Amazon Root CA 2 -================ ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD -VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 -MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv -bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 -kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp -N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 -AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd -fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx -kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS -btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 -Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN -c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ -3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw -DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA -A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE -YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW -xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ -gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW -aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV -Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 -KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi -JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= ------END CERTIFICATE----- - -Amazon Root CA 3 -================ ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG -EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy -NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ -MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB -f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr -Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 -rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc -eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== ------END CERTIFICATE----- - -Amazon Root CA 4 -================ ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG -EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy -NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ -MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN -/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri -83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA -MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 -AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 -============================================= ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT -D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr -IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g -TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp -ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD -VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt -c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth -bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 -IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 -6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc -wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 -3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 -WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU -ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc -lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R -e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j -q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -GDCA TrustAUTH R5 ROOT -====================== ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw -BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD -DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow -YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs -AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p -OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr -pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ -9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ -xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM -R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ -D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 -oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx -9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 -H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 -6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd -+PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ -HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD -F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ -8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv -/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT -aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -TrustCor RootCert CA-1 -====================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP -MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig -U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx -MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu -YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe -VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy -dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq -jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 -pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 -JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h -gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw -/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j -BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 -mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C -qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P -3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -TrustCor RootCert CA-2 -====================== ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w -DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT -eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 -eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy -MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h -bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 -IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb -ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk -RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 -oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb -XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 -/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q -jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP -eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg -rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU -2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h -Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp -kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv -2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 -S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw -PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv -DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU -RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE -xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX -RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ ------END CERTIFICATE----- - -TrustCor ECA-1 -============== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP -MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig -U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw -N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 -MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y -IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR -MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 -xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc -p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ -fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj -YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL -f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF -AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u -/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs -J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC -jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== ------END CERTIFICATE----- - -SSL.com Root Certification Authority RSA -======================================== ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM -BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x -MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw -MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx -EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM -LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C -Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 -P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge -oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp -k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z -fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ -gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 -UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 -1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s -bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr -dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf -ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl -u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq -erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj -MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ -vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI -Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y -wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI -WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -SSL.com Root Certification Authority ECC -======================================== ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV -BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv -BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy -MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO -BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ -8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR -hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT -jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW -e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z -5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -SSL.com EV Root Certification Authority RSA R2 -============================================== ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w -DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u -MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI -DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD -VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh -hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w -cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO -Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ -B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh -CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim -9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto -RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm -JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 -+qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp -qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 -++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx -Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G -guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz -OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 -CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq -lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR -rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 -hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX -9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -SSL.com EV Root Certification Authority ECC -=========================================== ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV -BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy -BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw -MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx -EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM -LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy -3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O -BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe -5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ -N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm -m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -GlobalSign Root CA - R6 -======================= ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX -R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds -b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i -YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs -U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss -grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE -3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF -vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM -PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ -azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O -WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy -CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP -0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN -b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE -AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV -HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 -lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY -BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym -Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr -3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 -0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T -uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK -oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t -JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -OISTE WISeKey Global Root GC CA -=============================== ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD -SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo -MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa -Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL -ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr -VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab -NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd -BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E -AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk -AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -GTS Root R1 -=========== ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG -EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv -b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG -A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx -9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r -aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW -r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM -LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly -4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr -06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om -3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu -JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM -BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv -fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm -ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b -gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq -4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr -tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo -pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 -sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql -CFF1pkgl ------END CERTIFICATE----- - -GTS Root R2 -=========== ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG -EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv -b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG -A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk -k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo -7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI -m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm -dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu -ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz -cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl -aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy -5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM -BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ -+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw -c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da -WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r -n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu -Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ -7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs -gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld -o/DUhgkC ------END CERTIFICATE----- - -GTS Root R3 -=========== ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV -UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg -UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE -ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU -Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej -QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP -0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 -glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa -KaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -GTS Root R4 -=========== ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV -UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg -UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE -ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa -6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj -QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV -2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI -N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x -zPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - -UCA Global G2 Root -================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG -EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x -NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU -cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT -oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV -8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS -h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o -LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ -R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe -KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa -4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc -OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 -8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo -5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A -Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 -yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX -c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo -jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk -bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x -ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn -RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== ------END CERTIFICATE----- - -UCA Extended Validation Root -============================ ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG -EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u -IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G -A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs -iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF -Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu -eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR -59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH -0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR -el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv -B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth -WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS -NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS -3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL -BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM -aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 -dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb -+7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW -F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi -GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc -GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi -djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr -dhh2n1ax ------END CERTIFICATE----- - -Certigna Root CA -================ ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE -BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ -MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda -MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz -MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX -stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz -KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 -JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 -XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq -4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej -wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ -lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI -jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ -/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy -dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h -LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl -cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt -OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP -TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq -7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 -4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd -8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS -6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY -tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS -aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde -E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -emSign Root CA - G1 -=================== ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET -MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl -ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx -ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk -aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN -LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 -cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW -DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ -6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH -hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 -vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q -NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q -+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih -U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -emSign ECC Root CA - G3 -======================= ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG -A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg -MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 -MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 -ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc -58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr -MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D -CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 -jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -emSign Root CA - C1 -=================== ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx -EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp -Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE -BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD -ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up -ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ -Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX -OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V -I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms -lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ -XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD -ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp -/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 -NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 -wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ -BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -emSign ECC Root CA - C3 -======================= ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG -A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF -Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE -BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD -ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd -6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 -SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA -B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA -MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU -ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -Hongkong Post Root CA 3 -======================= ------BEGIN CERTIFICATE----- -MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG -A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK -Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 -MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv -bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX -SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz -iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf -jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim -5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe -sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj -0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ -JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u -y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h -+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG -xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID -AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e -i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN -AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw -W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld -y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov -+BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc -eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw -9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 -nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY -hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB -60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq -dBb9HxEGmpv0 ------END CERTIFICATE----- - -Entrust Root Certification Authority - G4 -========================================= ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu -bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 -dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D -umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV -3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds -8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ -e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 -ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X -xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV -7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW -Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n -MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q -jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht -7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK -YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt -jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ -m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW -RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA -JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G -+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT -kcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- - -Microsoft ECC Root Certificate Authority 2017 -============================================= ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND -IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 -MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ -BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 -thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB -eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM -+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf -Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR -eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -Microsoft RSA Root Certificate Authority 2017 -============================================= ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg -UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw -NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u -MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml -7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e -S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 -1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ -dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F -yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS -MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr -lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ -0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ -ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og -6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 -dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk -+ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex -/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy -AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW -ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE -7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT -c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D -5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -e-Szigno Root CA 2017 -===================== ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw -DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt -MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa -Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE -CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp -Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx -s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G -A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv -vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA -tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO -svxyqltZ+efcMQ== ------END CERTIFICATE----- - -certSIGN Root CA G2 -=================== ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw -EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy -MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH -TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 -N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk -abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg -wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp -dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh -ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 -jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf -95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc -z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL -iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud -DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB -ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB -/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 -8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 -BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW -atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU -Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M -NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N -0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -Trustwave Global Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV -UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 -ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV -UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 -ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 -zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf -LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq -stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o -WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ -OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 -Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE -uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm -+9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj -ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB -BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H -PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H -ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla -4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R -vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd -zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O -856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH -Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu -3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP -29FpHOTKyeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- - -Trustwave Global ECC P256 Certification Authority -================================================= ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER -MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy -dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 -NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj -43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm -P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt -0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz -RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- - -Trustwave Global ECC P384 Certification Authority -================================================= ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER -MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy -dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 -NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH -Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr -/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV -HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn -ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl -CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== ------END CERTIFICATE----- diff --git a/configs/login_server/grd_login.properties b/configs/login_server/grd_login.properties deleted file mode 100644 index 74424328e..000000000 --- a/configs/login_server/grd_login.properties +++ /dev/null @@ -1,58 +0,0 @@ -HTTPServer.port = 1200 -JSONServer.port = 1201 -Gradido.group_id = 1 - -crypto.server_admin_public = f909a866baec97c5460b8d7a93b72d3d4d20cc45d9f15d78bd83944eb9286b7f -crypto.server_key = a51ef8ac7ef1abf162fb7a65261acd7a -# TODO auto-generate in docker build step -crypto.app_secret = 21ffbbc616fe - -# Server admin Passphrase -# nerve execute merit pool talk hockey basic win cargo spin disagree ethics swear price purchase say clutch decrease slow half forest reform cheese able -# - -phpServer.url = http://localhost/ -phpServer.host = nginx - -loginServer.path = http://localhost/account -loginServer.default_locale = de -loginServer.db.host = mariadb -loginServer.db.name = gradido_community -loginServer.db.user = root -loginServer.db.password = -loginServer.db.port = 3306 - -frontend.checkEmailPath = vue/checkEmail -frontend.resetPasswordPath = vue/reset - -email.disable = true - -#email.username = -#email.sender = -#email.admin_receiver = -#email.password = -#email.smtp.url = -#email.smtp.port = - -# binary is default, for debugging also json is possible -#hedera.consensus.message_format = json -# TESTNET or MAINNET, TESTNET is default -hedera.nettype = TESTNET - -# server setup types: test, staging or production -ServerSetupType=test -dev.default_group = docker - - -# Session timeout in minutes -# -session.timeout = 15 - -# Disabling security features for faster develop and testing -unsecure.allow_passwort_via_json_request = 1 -unsecure.allow_auto_sign_transactions = 1 -unsecure.allow_cors_all = 1 -# default disable, passwords must contain a number, a lower character, a high character, special character, and be at least 8 characters long - -unsecure.allow_all_passwords = 1 - diff --git a/configs/login_server/grd_login_test.properties b/configs/login_server/grd_login_test.properties deleted file mode 100644 index 65aa0c5d0..000000000 --- a/configs/login_server/grd_login_test.properties +++ /dev/null @@ -1,57 +0,0 @@ -HTTPServer.port = 1200 -JSONServer.port = 1201 -Gradido.group_id = 1 - -crypto.server_admin_public = f909a866baec97c5460b8d7a93b72d3d4d20cc45d9f15d78bd83944eb9286b7f -crypto.server_key = a51ef8ac7ef1abf162fb7a65261acd7a -# TODO auto-generate in docker build step -crypto.app_secret = 21ffbbc616fe - -# Server admin Passphrase -# nerve execute merit pool talk hockey basic win cargo spin disagree ethics swear price purchase say clutch decrease slow half forest reform cheese able -# - -phpServer.url = http://localhost/ -phpServer.host = nginx - -loginServer.path = http://localhost/account -loginServer.default_locale = de -loginServer.db.host = mariadb -loginServer.db.name = gradido_community_test -loginServer.db.user = root -loginServer.db.password = -loginServer.db.port = 3306 - -frontend.checkEmailPath = http://localhost/reset - -email.disable = true - -#email.username = -#email.sender = -#email.admin_receiver = -#email.password = -#email.smtp.url = -#email.smtp.port = - -# binary is default, for debugging also json is possible -#hedera.consensus.message_format = json -# TESTNET or MAINNET, TESTNET is default -hedera.nettype = TESTNET - -# server setup types: test, staging or production -ServerSetupType=test -dev.default_group = docker - - -# Session timeout in minutes -# -session.timeout = 15 - -# Disabling security features for faster develop and testing -unsecure.allow_passwort_via_json_request = 1 -unsecure.allow_auto_sign_transactions = 1 -unsecure.allow_cors_all = 1 -# default disable, passwords must contain a number, a lower character, a high character, special character, and be at least 8 characters long - -unsecure.allow_all_passwords = 1 - diff --git a/configs/node_server/.gradido/sibling_nodes.txt b/configs/node_server/.gradido/sibling_nodes.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/configs/node_server/gradido.conf b/configs/node_server/gradido.conf deleted file mode 100644 index c16adf5d5..000000000 --- a/configs/node_server/gradido.conf +++ /dev/null @@ -1,20 +0,0 @@ -worker_count = 2 -io_worker_count = 1 -data_root_folder = /opt/instance/.gradido -hedera_mirror_endpoint = hcs.testnet.mirrornode.hedera.com:5600 -sibling_node_file = /opt/instance/.gradido/sibling_nodes.txt -#group_requests_endpoint = 0.0.0.0:13701 -#record_requests_endpoint = 0.0.0.0:13702 -#manage_network_requests_endpoint = 0.0.0.0:13703 -grpc_endpoint = 0.0.0.0:13701 -json_rpc_port = 13702 - - -# larger value, larger batch, less concurrency -blockchain_append_batch_size = 1000 -#blochchain_init_batch_size = 1000 -#block_record_outbound_batch_size = 100 -general_batch_size = 1000 -group_register_topic_id = 0.0.79574 - -topic_reset_allowed = 1 diff --git a/database/.env.dist b/database/.env.dist index 689e4f509..58362a7b9 100644 --- a/database/.env.dist +++ b/database/.env.dist @@ -1,3 +1,5 @@ +CONFIG_VERSION=v1.2022-03-18 + DB_HOST=localhost DB_PORT=3306 DB_USER=root diff --git a/database/.env.template b/database/.env.template new file mode 100644 index 000000000..f2517a397 --- /dev/null +++ b/database/.env.template @@ -0,0 +1,10 @@ +CONFIG_VERSION=$DATABASE_CONFIG_VERSION + +DB_HOST=localhost +DB_PORT=3306 +DB_USER=$DB_USER +DB_PASSWORD=$DB_PASSWORD +DB_DATABASE=gradido_community +MIGRATIONS_TABLE=migrations + +TYPEORM_SEEDING_FACTORIES=src/factories/**/*{.ts,.js} diff --git a/database/.gitignore b/database/.gitignore index db7aa096e..bce5da58f 100644 --- a/database/.gitignore +++ b/database/.gitignore @@ -8,7 +8,8 @@ yarn-error.log* test/unit/coverage package-lock.json -.env +/.env +/.env.bak .env.development.local .env.production.local diff --git a/database/Dockerfile b/database/Dockerfile index ec0537ddf..8ffe8e432 100644 --- a/database/Dockerfile +++ b/database/Dockerfile @@ -98,6 +98,8 @@ COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules # COPY --from=build ${DOCKER_WORKDIR}/public ./public # Copy package.json for script definitions (lock file should not be needed) COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json +# Copy Mnemonic files +COPY --from=build ${DOCKER_WORKDIR}/src/config/*.txt ./src/config/ # Copy run scripts run/ # COPY --from=build ${DOCKER_WORKDIR}/run ./run @@ -112,7 +114,7 @@ CMD /bin/sh -c "yarn run up" ################################################################################## # PRODUCTION RESET ############################################################### ################################################################################## -# FROM production as production_reset +FROM production as production_reset # Run command CMD /bin/sh -c "yarn run reset" diff --git a/database/entity/0001-init_db/Transaction.ts b/database/entity/0001-init_db/Transaction.ts index 53dce4d08..a33fbd0be 100644 --- a/database/entity/0001-init_db/Transaction.ts +++ b/database/entity/0001-init_db/Transaction.ts @@ -7,19 +7,28 @@ export class Transaction extends BaseEntity { @PrimaryGeneratedColumn() id: number - @Column({ name: 'transaction_type_id' }) + @Column({ name: 'state_group_id', unsigned: true, default: null }) + stateGroupId: number + + @Column({ name: 'transaction_type_id', unsigned: true, nullable: false }) transactionTypeId: number - @Column({ name: 'tx_hash', type: 'binary', length: 48 }) + @Column({ name: 'tx_hash', type: 'binary', length: 48, default: null }) txHash: Buffer - @Column() + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) memo: string - @Column({ type: 'timestamp' }) + @Column({ type: 'timestamp', nullable: false, default: () => 'CURRENT_TIMESTAMP' }) received: Date - @Column({ name: 'blockchain_type_id' }) + @Column({ + name: 'blockchain_type_id', + type: 'bigint', + unsigned: true, + nullable: false, + default: 1, + }) blockchainTypeId: number @OneToOne(() => TransactionSendCoin, (transactionSendCoin) => transactionSendCoin.transaction) diff --git a/database/entity/0001-init_db/TransactionCreation.ts b/database/entity/0001-init_db/TransactionCreation.ts index 8b9c02623..1837e0789 100644 --- a/database/entity/0001-init_db/TransactionCreation.ts +++ b/database/entity/0001-init_db/TransactionCreation.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' -import { Transaction } from './Transaction' +import { Transaction } from '../Transaction' @Entity('transaction_creations') export class TransactionCreation extends BaseEntity { diff --git a/database/entity/0001-init_db/TransactionSendCoin.ts b/database/entity/0001-init_db/TransactionSendCoin.ts index 6153ee94c..db999cd87 100644 --- a/database/entity/0001-init_db/TransactionSendCoin.ts +++ b/database/entity/0001-init_db/TransactionSendCoin.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' -import { Transaction } from './Transaction' +import { Transaction } from '../Transaction' @Entity('transaction_send_coins') export class TransactionSendCoin extends BaseEntity { diff --git a/database/entity/0001-init_db/TransactionSignature.ts b/database/entity/0001-init_db/TransactionSignature.ts index df3e02ba6..d12a74500 100644 --- a/database/entity/0001-init_db/TransactionSignature.ts +++ b/database/entity/0001-init_db/TransactionSignature.ts @@ -1,21 +1,21 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm' -import { Transaction } from './Transaction' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { Transaction } from '../Transaction' @Entity('transaction_signatures') export class TransactionSignature extends BaseEntity { - @PrimaryGeneratedColumn() + @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number @Column({ name: 'transaction_id' }) transactionId: number - @Column({ type: 'binary', length: 64 }) + @Column({ type: 'binary', length: 64, nullable: false }) signature: Buffer - @Column({ type: 'binary', length: 32 }) + @Column({ type: 'binary', length: 32, nullable: false }) pubkey: Buffer - @ManyToOne(() => Transaction) + @OneToOne(() => Transaction) @JoinColumn({ name: 'transaction_id' }) transaction: Transaction } diff --git a/database/entity/0001-init_db/User.ts b/database/entity/0001-init_db/User.ts index b349e2584..7d20007f7 100644 --- a/database/entity/0001-init_db/User.ts +++ b/database/entity/0001-init_db/User.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm' -import { Balance } from '../Balance' +import { Balance } from './Balance' // Moriz: I do not like the idea of having two user tables @Entity('state_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) @@ -7,13 +7,13 @@ export class User extends BaseEntity { @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number - @Column({ name: 'index_id', default: 0 }) + @Column({ name: 'index_id', type: 'smallint', default: 0, nullable: false }) indexId: number @Column({ name: 'group_id', default: 0, unsigned: true }) groupId: number - @Column({ type: 'binary', length: 32, name: 'public_key' }) + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) pubkey: Buffer @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) @@ -40,7 +40,7 @@ export class User extends BaseEntity { @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) username: string - @Column() + @Column({ type: 'bool', default: false }) disabled: boolean @OneToOne(() => Balance, (balance) => balance.user) diff --git a/database/entity/0002-add_settings/User.ts b/database/entity/0002-add_settings/User.ts index 78e774489..a756cbbd5 100644 --- a/database/entity/0002-add_settings/User.ts +++ b/database/entity/0002-add_settings/User.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm' -import { UserSetting } from './UserSetting' +import { UserSetting } from '../UserSetting' // Moriz: I do not like the idea of having two user tables @Entity('state_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) @@ -7,13 +7,13 @@ export class User extends BaseEntity { @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number - @Column({ name: 'index_id', default: 0 }) + @Column({ name: 'index_id', type: 'smallint', default: 0, nullable: false }) indexId: number @Column({ name: 'group_id', default: 0, unsigned: true }) groupId: number - @Column({ type: 'binary', length: 32, name: 'public_key' }) + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) pubkey: Buffer @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) @@ -40,7 +40,7 @@ export class User extends BaseEntity { @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) username: string - @Column() + @Column({ type: 'bool', default: false }) disabled: boolean @OneToMany(() => UserSetting, (userSetting) => userSetting.user) diff --git a/database/entity/0002-add_settings/UserSetting.ts b/database/entity/0002-add_settings/UserSetting.ts index 02d2236c2..006d63e3e 100644 --- a/database/entity/0002-add_settings/UserSetting.ts +++ b/database/entity/0002-add_settings/UserSetting.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm' -import { User } from './User' +import { User } from '../User' @Entity() export class UserSetting extends BaseEntity { diff --git a/database/entity/0003-login_server_tables/LoginElopageBuys.ts b/database/entity/0003-login_server_tables/LoginElopageBuys.ts index fc0d6c355..1f94faffe 100644 --- a/database/entity/0003-login_server_tables/LoginElopageBuys.ts +++ b/database/entity/0003-login_server_tables/LoginElopageBuys.ts @@ -5,8 +5,8 @@ export class LoginElopageBuys extends BaseEntity { @PrimaryGeneratedColumn('increment', { unsigned: true }) id: number - @Column({ name: 'elopage_user_id', nullable: false }) - elopageUserId: number + @Column({ type: 'int', width: 11, name: 'elopage_user_id', nullable: true, default: null }) + elopageUserId: number | null @Column({ name: 'affiliate_program_id', nullable: false }) affiliateProgramId: number diff --git a/database/entity/0003-login_server_tables/LoginUser.ts b/database/entity/0003-login_server_tables/LoginUser.ts index ebaf8ad53..a3a83f450 100644 --- a/database/entity/0003-login_server_tables/LoginUser.ts +++ b/database/entity/0003-login_server_tables/LoginUser.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm' -import { LoginUserBackup } from '../LoginUserBackup' +import { LoginUserBackup } from './LoginUserBackup' // Moriz: I do not like the idea of having two user tables @Entity('login_users') @@ -19,7 +19,7 @@ export class LoginUser extends BaseEntity { @Column({ length: 255, default: '' }) username: string - @Column({ default: '' }) + @Column({ type: 'mediumtext', default: '', nullable: true }) description: string @Column({ type: 'bigint', default: 0, unsigned: true }) @@ -34,19 +34,19 @@ export class LoginUser extends BaseEntity { @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) emailHash: Buffer - @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP' }) + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) createdAt: Date - @Column({ name: 'email_checked', default: 0 }) + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) emailChecked: boolean - @Column({ name: 'passphrase_shown', default: 0 }) + @Column({ name: 'passphrase_shown', type: 'bool', nullable: false, default: false }) passphraseShown: boolean - @Column({ length: 4, default: 'de' }) + @Column({ length: 4, default: 'de', nullable: false }) language: string - @Column({ default: 0 }) + @Column({ type: 'bool', default: false }) disabled: boolean @Column({ name: 'group_id', default: 0, unsigned: true }) diff --git a/database/entity/0003-login_server_tables/LoginUserBackup.ts b/database/entity/0003-login_server_tables/LoginUserBackup.ts index 7152e12e5..39f5e0db5 100644 --- a/database/entity/0003-login_server_tables/LoginUserBackup.ts +++ b/database/entity/0003-login_server_tables/LoginUserBackup.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, JoinColumn, OneToOne } from 'typeorm' -import { LoginUser } from '../LoginUser' +import { LoginUser } from './LoginUser' @Entity('login_user_backups') export class LoginUserBackup extends BaseEntity { diff --git a/database/entity/0006-login_users_collation/LoginUser.ts b/database/entity/0006-login_users_collation/LoginUser.ts index e404a3937..fdb17f4ad 100644 --- a/database/entity/0006-login_users_collation/LoginUser.ts +++ b/database/entity/0006-login_users_collation/LoginUser.ts @@ -1,5 +1,5 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm' -import { LoginUserBackup } from '../LoginUserBackup' +import { LoginUserBackup } from '../0003-login_server_tables/LoginUserBackup' // Moriz: I do not like the idea of having two user tables @Entity('login_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) @@ -19,7 +19,7 @@ export class LoginUser extends BaseEntity { @Column({ length: 255, default: '', collation: 'utf8mb4_unicode_ci' }) username: string - @Column({ default: '', collation: 'utf8mb4_unicode_ci' }) + @Column({ type: 'mediumtext', default: '', collation: 'utf8mb4_unicode_ci', nullable: true }) description: string @Column({ type: 'bigint', default: 0, unsigned: true }) @@ -34,19 +34,19 @@ export class LoginUser extends BaseEntity { @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) emailHash: Buffer - @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP' }) + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) createdAt: Date - @Column({ name: 'email_checked', default: 0 }) + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) emailChecked: boolean - @Column({ name: 'passphrase_shown', default: 0 }) + @Column({ name: 'passphrase_shown', type: 'bool', nullable: false, default: false }) passphraseShown: boolean - @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci' }) + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) language: string - @Column({ default: 0 }) + @Column({ type: 'bool', default: false }) disabled: boolean @Column({ name: 'group_id', default: 0, unsigned: true }) diff --git a/database/entity/0015-admin_pending_creations/AdminPendingCreation.ts b/database/entity/0015-admin_pending_creations/AdminPendingCreation.ts new file mode 100644 index 000000000..1c3027867 --- /dev/null +++ b/database/entity/0015-admin_pending_creations/AdminPendingCreation.ts @@ -0,0 +1,25 @@ +import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm' + +@Entity('admin_pending_creations') +export class AdminPendingCreation extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ unsigned: true, nullable: false }) + userId: number + + @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' }) + created: Date + + @Column({ type: 'datetime', nullable: false }) + date: Date + + @Column({ length: 256, nullable: true, default: null }) + memo: string + + @Column({ type: 'bigint', nullable: false }) + amount: BigInt + + @Column() + moderator: number +} diff --git a/database/entity/0016-transaction_signatures/Transaction.ts b/database/entity/0016-transaction_signatures/Transaction.ts new file mode 100644 index 000000000..5410d010b --- /dev/null +++ b/database/entity/0016-transaction_signatures/Transaction.ts @@ -0,0 +1,34 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm' +import { TransactionCreation } from '../0001-init_db/TransactionCreation' +import { TransactionSendCoin } from '../0001-init_db/TransactionSendCoin' + +@Entity('transactions') +export class Transaction extends BaseEntity { + // TODO the id is defined as bigint(20) - there might be problems with that: https://github.com/typeorm/typeorm/issues/2400 + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'transaction_type_id', unsigned: true, nullable: false }) + transactionTypeId: number + + @Column({ name: 'tx_hash', type: 'binary', length: 48, default: null }) + txHash: Buffer + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ type: 'timestamp', nullable: false, default: () => 'CURRENT_TIMESTAMP' }) + received: Date + + @Column({ type: 'binary', length: 64, nullable: true, default: null }) + signature: Buffer + + @Column({ type: 'binary', length: 32, nullable: true, default: null }) + pubkey: Buffer + + @OneToOne(() => TransactionSendCoin, (transactionSendCoin) => transactionSendCoin.transaction) + transactionSendCoin: TransactionSendCoin + + @OneToOne(() => TransactionCreation, (transactionCreation) => transactionCreation.transaction) + transactionCreation: TransactionCreation +} diff --git a/database/entity/0017-combine_user_tables/LoginUserBackup.ts b/database/entity/0017-combine_user_tables/LoginUserBackup.ts new file mode 100644 index 000000000..7aa69a021 --- /dev/null +++ b/database/entity/0017-combine_user_tables/LoginUserBackup.ts @@ -0,0 +1,16 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('login_user_backups') +export class LoginUserBackup extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ type: 'text', name: 'passphrase', nullable: false }) + passphrase: string + + @Column({ name: 'user_id', nullable: false }) + userId: number + + @Column({ name: 'mnemonic_type', default: -1 }) + mnemonicType: number +} diff --git a/database/entity/0017-combine_user_tables/User.ts b/database/entity/0017-combine_user_tables/User.ts new file mode 100644 index 000000000..a9bf29d24 --- /dev/null +++ b/database/entity/0017-combine_user_tables/User.ts @@ -0,0 +1,74 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('state_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'login_user_id', default: null, unsigned: true }) + loginUserId: number + + @Column({ name: 'index_id', type: 'smallint', default: 0, nullable: false }) + indexId: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) + username: string + + @Column({ type: 'bool', default: false }) + disabled: boolean + + @Column({ type: 'mediumtext', default: '', collation: 'utf8mb4_unicode_ci', nullable: true }) + description: string + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ name: 'passphrase_shown', type: 'bool', nullable: false, default: false }) + passphraseShown: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/0018-combine_login_user_backups_and_user_table/User.ts b/database/entity/0018-combine_login_user_backups_and_user_table/User.ts new file mode 100644 index 000000000..2ae351e47 --- /dev/null +++ b/database/entity/0018-combine_login_user_backups_and_user_table/User.ts @@ -0,0 +1,83 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('state_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'login_user_id', default: null, unsigned: true }) + loginUserId: number + + @Column({ name: 'index_id', type: 'smallint', default: 0, nullable: false }) + indexId: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) + username: string + + @Column({ type: 'bool', default: false }) + disabled: boolean + + @Column({ type: 'mediumtext', default: '', collation: 'utf8mb4_unicode_ci', nullable: true }) + description: string + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ name: 'passphrase_shown', type: 'bool', nullable: false, default: false }) + passphraseShown: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/0019-replace_login_user_id_with_state_user_id/User.ts b/database/entity/0019-replace_login_user_id_with_state_user_id/User.ts new file mode 100644 index 000000000..b469a55a7 --- /dev/null +++ b/database/entity/0019-replace_login_user_id_with_state_user_id/User.ts @@ -0,0 +1,80 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('state_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'index_id', type: 'smallint', default: 0, nullable: false }) + indexId: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ length: 255, nullable: true, default: null, collation: 'utf8mb4_unicode_ci' }) + username: string + + @Column({ type: 'bool', default: false }) + disabled: boolean + + @Column({ type: 'mediumtext', default: '', collation: 'utf8mb4_unicode_ci', nullable: true }) + description: string + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ name: 'passphrase_shown', type: 'bool', nullable: false, default: false }) + passphraseShown: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/0020-rename_and_clean_state_users/User.ts b/database/entity/0020-rename_and_clean_state_users/User.ts new file mode 100644 index 000000000..3d3b4d7b1 --- /dev/null +++ b/database/entity/0020-rename_and_clean_state_users/User.ts @@ -0,0 +1,68 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ type: 'bool', default: false }) + disabled: boolean + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/0021-elopagebuys_fields_nullable/LoginElopageBuys.ts b/database/entity/0021-elopagebuys_fields_nullable/LoginElopageBuys.ts new file mode 100644 index 000000000..501276ea7 --- /dev/null +++ b/database/entity/0021-elopagebuys_fields_nullable/LoginElopageBuys.ts @@ -0,0 +1,52 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('login_elopage_buys') +export class LoginElopageBuys extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ type: 'int', width: 11, name: 'elopage_user_id', nullable: true, default: null }) + elopageUserId: number | null + + @Column({ type: 'int', width: 11, name: 'affiliate_program_id', nullable: true, default: null }) + affiliateProgramId: number | null + + @Column({ type: 'int', width: 11, name: 'publisher_id', nullable: true, default: null }) + publisherId: number | null + + @Column({ type: 'int', width: 11, name: 'order_id', nullable: true, default: null }) + orderId: number | null + + @Column({ type: 'int', width: 11, name: 'product_id', nullable: true, default: null }) + productId: number | null + + @Column({ name: 'product_price', nullable: false }) + productPrice: number + + @Column({ + name: 'payer_email', + length: 255, + nullable: false, + charset: 'utf8', + collation: 'utf8_bin', + }) + payerEmail: string + + @Column({ + name: 'publisher_email', + length: 255, + nullable: false, + charset: 'utf8', + collation: 'utf8_bin', + }) + publisherEmail: string + + @Column({ nullable: false }) + payed: boolean + + @Column({ name: 'success_date', nullable: false }) + successDate: Date + + @Column({ length: 255, nullable: false }) + event: string +} diff --git a/database/entity/0023-users_disabled_soft_delete/User.ts b/database/entity/0023-users_disabled_soft_delete/User.ts new file mode 100644 index 000000000..95fe1b3f7 --- /dev/null +++ b/database/entity/0023-users_disabled_soft_delete/User.ts @@ -0,0 +1,75 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + OneToMany, + DeleteDateColumn, +} from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @DeleteDateColumn() + deletedAt: Date | null + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/0024-combine_transaction_tables/Transaction.ts b/database/entity/0024-combine_transaction_tables/Transaction.ts new file mode 100644 index 000000000..5834c007a --- /dev/null +++ b/database/entity/0024-combine_transaction_tables/Transaction.ts @@ -0,0 +1,70 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('transactions') +export class Transaction extends BaseEntity { + // TODO the id is defined as bigint(20) - there might be problems with that: https://github.com/typeorm/typeorm/issues/2400 + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'transaction_type_id', unsigned: true, nullable: false }) + transactionTypeId: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ type: 'bigint', nullable: false }) + amount: BigInt + + @Column({ name: 'tx_hash', type: 'binary', length: 48, default: null, nullable: true }) + txHash: Buffer + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ type: 'timestamp', nullable: false, default: () => 'CURRENT_TIMESTAMP' }) + received: Date + + @Column({ type: 'binary', length: 64, nullable: true, default: null }) + signature: Buffer + + @Column({ type: 'binary', length: 32, nullable: true, default: null }) + pubkey: Buffer + + @Column({ + name: 'creation_ident_hash', + type: 'binary', + length: 32, + nullable: true, + default: null, + }) + creationIdentHash: Buffer + + @Column({ name: 'creation_date', type: 'timestamp', nullable: true, default: null }) + creationDate: Date + + @Column({ + name: 'send_receiver_public_key', + type: 'binary', + length: 32, + nullable: true, + default: null, + }) + sendReceiverPublicKey: Buffer | null + + @Column({ + name: 'send_receiver_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + sendReceiverUserId?: number | null + + @Column({ + name: 'send_sender_final_balance', + type: 'bigint', + nullable: true, + default: null, + }) + sendSenderFinalBalance: BigInt | null +} diff --git a/database/entity/0026-combine_transaction_tables2/Transaction.ts b/database/entity/0026-combine_transaction_tables2/Transaction.ts new file mode 100644 index 000000000..77f23e4e4 --- /dev/null +++ b/database/entity/0026-combine_transaction_tables2/Transaction.ts @@ -0,0 +1,83 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ name: 'transaction_id', unsigned: true, nullable: false }) + transactionId: number + + @Column({ name: 'transaction_type_id', unsigned: true, nullable: false }) + transactionTypeId: number + + @Column({ type: 'bigint', nullable: false }) + amount: BigInt + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ + name: 'send_sender_final_balance', + type: 'bigint', + nullable: true, + default: null, + }) + sendSenderFinalBalance: BigInt | null + + @Column({ name: 'balance', type: 'bigint', default: 0 }) + balance: BigInt + + @Column({ + name: 'balance_date', + type: 'timestamp', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + received: Date + + @Column({ name: 'creation_date', type: 'timestamp', nullable: true, default: null }) + creationDate: Date + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_state_user_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedStateUserTransactionId?: number | null + + @Column({ type: 'binary', length: 64, nullable: true, default: null }) + signature: Buffer + + @Column({ name: 'tx_hash', type: 'binary', length: 48, default: null, nullable: true }) + txHash: Buffer + + @Column({ type: 'binary', length: 32, nullable: true, default: null }) + pubkey: Buffer + + @Column({ + name: 'creation_ident_hash', + type: 'binary', + length: 32, + nullable: true, + default: null, + }) + creationIdentHash: Buffer +} diff --git a/database/entity/0027-clean_transaction_table/Transaction.ts b/database/entity/0027-clean_transaction_table/Transaction.ts new file mode 100644 index 000000000..e50f5d164 --- /dev/null +++ b/database/entity/0027-clean_transaction_table/Transaction.ts @@ -0,0 +1,59 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ type: 'bigint', nullable: false }) + amount: BigInt + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ + name: 'send_sender_final_balance', + type: 'bigint', + nullable: true, + default: null, + }) + sendSenderFinalBalance: BigInt | null + + @Column({ name: 'balance', type: 'bigint', default: 0 }) + balance: BigInt + + @Column({ + name: 'balance_date', + type: 'timestamp', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ name: 'creation_date', type: 'timestamp', nullable: true, default: null }) + creationDate: Date + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: number | null +} diff --git a/database/entity/0028-decimal_types/Transaction.ts b/database/entity/0028-decimal_types/Transaction.ts new file mode 100644 index 000000000..9352e6335 --- /dev/null +++ b/database/entity/0028-decimal_types/Transaction.ts @@ -0,0 +1,146 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ type: 'int', unsigned: true, nullable: true, default: null }) + previous: number | null + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ + name: 'dec_amount', + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decAmount: Decimal + + @Column({ + name: 'dec_balance', + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decBalance: Decimal + + @Column({ + name: 'balance_date', + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ + name: 'dec_decay', + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decDecay: Decimal + + @Column({ + name: 'decay_start', + type: 'datetime', + nullable: true, + default: null, + }) + decayStart: Date | null + + @Column({ type: 'bigint', nullable: false }) + amount: BigInt + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ + name: 'send_sender_final_balance', + type: 'bigint', + nullable: true, + default: null, + }) + sendSenderFinalBalance: BigInt | null + + @Column({ name: 'balance', type: 'bigint', default: 0 }) + balance: BigInt + + @Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null }) + creationDate: Date + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: number | null + + @Column({ + name: 'temp_dec_send_sender_final_balance', + type: 'decimal', + precision: 40, + scale: 20, + nullable: true, + default: null, + transformer: DecimalTransformer, + }) + tempDecSendSenderFinalBalance: Decimal + + @Column({ + name: 'temp_dec_diff_send_sender_final_balance', + type: 'decimal', + precision: 40, + scale: 20, + nullable: true, + default: null, + transformer: DecimalTransformer, + }) + tempDecDiffSendSenderFinalBalance: Decimal + + @Column({ + name: 'temp_dec_old_balance', + type: 'decimal', + precision: 40, + scale: 20, + nullable: true, + default: null, + transformer: DecimalTransformer, + }) + tempDecOldBalance: Decimal + + @Column({ + name: 'temp_dec_diff_balance', + type: 'decimal', + precision: 40, + scale: 20, + nullable: true, + default: null, + transformer: DecimalTransformer, + }) + tempDecDiffBalance: Decimal +} diff --git a/database/entity/0029-clean_transaction_table/Transaction.ts b/database/entity/0029-clean_transaction_table/Transaction.ts new file mode 100644 index 000000000..5931c153f --- /dev/null +++ b/database/entity/0029-clean_transaction_table/Transaction.ts @@ -0,0 +1,85 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ type: 'int', unsigned: true, nullable: true, default: null }) + previous: number | null + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + balance: Decimal + + @Column({ + name: 'balance_date', + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decay: Decimal + + @Column({ + name: 'decay_start', + type: 'datetime', + nullable: true, + default: null, + }) + decayStart: Date | null + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null }) + creationDate: Date | null + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: number | null +} diff --git a/database/entity/0030-transaction_link/TransactionLink.ts b/database/entity/0030-transaction_link/TransactionLink.ts new file mode 100644 index 000000000..177f23561 --- /dev/null +++ b/database/entity/0030-transaction_link/TransactionLink.ts @@ -0,0 +1,68 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' + +@Entity('transaction_links') +export class TransactionLink extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ unsigned: true, nullable: false }) + userId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + name: 'hold_available_amount', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + holdAvailableAmount: Decimal + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ length: 24, nullable: false, collation: 'utf8mb4_unicode_ci' }) + code: string + + @Column({ + type: 'datetime', + nullable: false, + }) + createdAt: Date + + @DeleteDateColumn() + deletedAt: Date | null + + @Column({ + type: 'datetime', + nullable: false, + }) + validUntil: Date + + @Column({ + type: 'boolean', + default: () => false, + nullable: false, + }) + showEmail: boolean + + @Column({ + type: 'datetime', + nullable: true, + }) + redeemedAt: Date | null + + @Column({ type: 'int', unsigned: true, nullable: true }) + redeemedBy: number | null +} diff --git a/database/entity/0031-remove_sendEmail_from_transaction_link/TransactionLink.ts b/database/entity/0031-remove_sendEmail_from_transaction_link/TransactionLink.ts new file mode 100644 index 000000000..9cd42258a --- /dev/null +++ b/database/entity/0031-remove_sendEmail_from_transaction_link/TransactionLink.ts @@ -0,0 +1,61 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' + +@Entity('transaction_links') +export class TransactionLink extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ unsigned: true, nullable: false }) + userId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + name: 'hold_available_amount', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + holdAvailableAmount: Decimal + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ length: 24, nullable: false, collation: 'utf8mb4_unicode_ci' }) + code: string + + @Column({ + type: 'datetime', + nullable: false, + }) + createdAt: Date + + @DeleteDateColumn() + deletedAt: Date | null + + @Column({ + type: 'datetime', + nullable: false, + }) + validUntil: Date + + @Column({ + type: 'datetime', + nullable: true, + }) + redeemedAt: Date | null + + @Column({ type: 'int', unsigned: true, nullable: true }) + redeemedBy: number | null +} diff --git a/database/entity/0032-add-transaction-link-to-transaction/Transaction.ts b/database/entity/0032-add-transaction-link-to-transaction/Transaction.ts new file mode 100644 index 000000000..398fa03db --- /dev/null +++ b/database/entity/0032-add-transaction-link-to-transaction/Transaction.ts @@ -0,0 +1,94 @@ +import Decimal from 'decimal.js-light' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ type: 'int', unsigned: true, nullable: true, default: null }) + previous: number | null + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + balance: Decimal + + @Column({ + name: 'balance_date', + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decay: Decimal + + @Column({ + name: 'decay_start', + type: 'datetime', + nullable: true, + default: null, + }) + decayStart: Date | null + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null }) + creationDate: Date | null + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: number | null + + @Column({ + name: 'transaction_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + transactionLinkId?: number | null +} diff --git a/database/entity/0033-add_referrer_id/User.ts b/database/entity/0033-add_referrer_id/User.ts new file mode 100644 index 000000000..48c804b63 --- /dev/null +++ b/database/entity/0033-add_referrer_id/User.ts @@ -0,0 +1,78 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + OneToMany, + DeleteDateColumn, +} from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @DeleteDateColumn() + deletedAt: Date | null + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'referrer_id', type: 'int', unsigned: true, nullable: true, default: null }) + referrerId?: number | null + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/AdminPendingCreation.ts b/database/entity/AdminPendingCreation.ts new file mode 100644 index 000000000..03eeab883 --- /dev/null +++ b/database/entity/AdminPendingCreation.ts @@ -0,0 +1 @@ +export { AdminPendingCreation } from './0015-admin_pending_creations/AdminPendingCreation' diff --git a/database/entity/Balance.ts b/database/entity/Balance.ts deleted file mode 100644 index c4fde6334..000000000 --- a/database/entity/Balance.ts +++ /dev/null @@ -1 +0,0 @@ -export { Balance } from './0001-init_db/Balance' diff --git a/database/entity/LoginElopageBuys.ts b/database/entity/LoginElopageBuys.ts index 6a1f3230b..cb0d212fa 100644 --- a/database/entity/LoginElopageBuys.ts +++ b/database/entity/LoginElopageBuys.ts @@ -1 +1 @@ -export { LoginElopageBuys } from './0003-login_server_tables/LoginElopageBuys' +export { LoginElopageBuys } from './0021-elopagebuys_fields_nullable/LoginElopageBuys' diff --git a/database/entity/LoginPendingTasksAdmin.ts b/database/entity/LoginPendingTasksAdmin.ts deleted file mode 100644 index f766b74dd..000000000 --- a/database/entity/LoginPendingTasksAdmin.ts +++ /dev/null @@ -1 +0,0 @@ -export { LoginPendingTasksAdmin } from './0005-admin_tables/LoginPendingTasksAdmin' diff --git a/database/entity/LoginUser.ts b/database/entity/LoginUser.ts deleted file mode 100644 index b22e1137f..000000000 --- a/database/entity/LoginUser.ts +++ /dev/null @@ -1 +0,0 @@ -export { LoginUser } from './0006-login_users_collation/LoginUser' diff --git a/database/entity/LoginUserBackup.ts b/database/entity/LoginUserBackup.ts deleted file mode 100644 index 23d2c9271..000000000 --- a/database/entity/LoginUserBackup.ts +++ /dev/null @@ -1 +0,0 @@ -export { LoginUserBackup } from './0003-login_server_tables/LoginUserBackup' diff --git a/database/entity/LoginUserRoles.ts b/database/entity/LoginUserRoles.ts deleted file mode 100644 index 1efa81caf..000000000 --- a/database/entity/LoginUserRoles.ts +++ /dev/null @@ -1 +0,0 @@ -export { LoginUserRoles } from './0003-login_server_tables/LoginUserRoles' diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts index d3915c05d..3515202d0 100644 --- a/database/entity/Transaction.ts +++ b/database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0001-init_db/Transaction' +export { Transaction } from './0032-add-transaction-link-to-transaction/Transaction' diff --git a/database/entity/TransactionCreation.ts b/database/entity/TransactionCreation.ts deleted file mode 100644 index 100e948a1..000000000 --- a/database/entity/TransactionCreation.ts +++ /dev/null @@ -1 +0,0 @@ -export { TransactionCreation } from './0001-init_db/TransactionCreation' diff --git a/database/entity/TransactionLink.ts b/database/entity/TransactionLink.ts new file mode 100644 index 000000000..a483f0171 --- /dev/null +++ b/database/entity/TransactionLink.ts @@ -0,0 +1 @@ +export { TransactionLink } from './0031-remove_sendEmail_from_transaction_link/TransactionLink' diff --git a/database/entity/TransactionSendCoin.ts b/database/entity/TransactionSendCoin.ts deleted file mode 100644 index 5c47d3961..000000000 --- a/database/entity/TransactionSendCoin.ts +++ /dev/null @@ -1 +0,0 @@ -export { TransactionSendCoin } from './0001-init_db/TransactionSendCoin' diff --git a/database/entity/TransactionSignature.ts b/database/entity/TransactionSignature.ts deleted file mode 100644 index e3c9cbe1c..000000000 --- a/database/entity/TransactionSignature.ts +++ /dev/null @@ -1 +0,0 @@ -export { TransactionSignature } from './0001-init_db/TransactionSignature' diff --git a/database/entity/User.ts b/database/entity/User.ts index b20e934f1..35dfb7bbe 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0002-add_settings/User' +export { User } from './0033-add_referrer_id/User' diff --git a/database/entity/UserTransaction.ts b/database/entity/UserTransaction.ts deleted file mode 100644 index bcbe6a65a..000000000 --- a/database/entity/UserTransaction.ts +++ /dev/null @@ -1 +0,0 @@ -export { UserTransaction } from './0001-init_db/UserTransaction' diff --git a/database/entity/index.ts b/database/entity/index.ts index 9d3b10ea7..cb6f56ab0 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -1,35 +1,21 @@ -import { Balance } from './Balance' import { LoginElopageBuys } from './LoginElopageBuys' import { LoginEmailOptIn } from './LoginEmailOptIn' -import { LoginUser } from './LoginUser' -import { LoginUserRoles } from './LoginUserRoles' -import { LoginUserBackup } from './LoginUserBackup' import { Migration } from './Migration' import { ServerUser } from './ServerUser' import { Transaction } from './Transaction' -import { TransactionCreation } from './TransactionCreation' -import { TransactionSignature } from './TransactionSignature' -import { TransactionSendCoin } from './TransactionSendCoin' +import { TransactionLink } from './TransactionLink' import { User } from './User' import { UserSetting } from './UserSetting' -import { UserTransaction } from './UserTransaction' -import { LoginPendingTasksAdmin } from './LoginPendingTasksAdmin' +import { AdminPendingCreation } from './AdminPendingCreation' export const entities = [ - Balance, + AdminPendingCreation, LoginElopageBuys, LoginEmailOptIn, - LoginUser, - LoginUserRoles, - LoginUserBackup, Migration, ServerUser, Transaction, - TransactionCreation, - TransactionSignature, - TransactionSendCoin, + TransactionLink, User, UserSetting, - UserTransaction, - LoginPendingTasksAdmin, ] diff --git a/database/integrity/0013-test.ts.keep b/database/integrity/0013-test.ts.keep new file mode 100644 index 000000000..b020c0657 --- /dev/null +++ b/database/integrity/0013-test.ts.keep @@ -0,0 +1,86 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * the way the passphrases are stored in login_user_backups is inconsistent. + * we need to try to detect which word list was used and transform it accordingly + */ + +import fs from 'fs' + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const sodium = require('sodium-native') + +const PHRASE_WORD_COUNT = 24 +const WORDS = fs + .readFileSync('src/config/mnemonic.uncompressed_buffer13116.txt') + .toString() + .split(',') + +const KeyPairEd25519Create = (passphrase: string[]): Buffer[] => { + if (!passphrase.length || passphrase.length < PHRASE_WORD_COUNT) { + throw new Error('passphrase empty or to short') + } + + const state = Buffer.alloc(sodium.crypto_hash_sha512_STATEBYTES) + sodium.crypto_hash_sha512_init(state) + + for (let i = 0; i < PHRASE_WORD_COUNT; i++) { + const value = Buffer.alloc(8) + const wordIndex = WORDS.indexOf(passphrase[i]) + value.writeBigInt64LE(BigInt(wordIndex)) + sodium.crypto_hash_sha512_update(state, value) + } + // trailing space is part of the login_server implementation + const clearPassphrase = passphrase.slice(0, PHRASE_WORD_COUNT).join(' ') + ' ' + sodium.crypto_hash_sha512_update(state, Buffer.from(clearPassphrase)) + const outputHashBuffer = Buffer.alloc(sodium.crypto_hash_sha512_BYTES) + sodium.crypto_hash_sha512_final(state, outputHashBuffer) + + const pubKey = Buffer.alloc(sodium.crypto_sign_PUBLICKEYBYTES) + const privKey = Buffer.alloc(sodium.crypto_sign_SECRETKEYBYTES) + + sodium.crypto_sign_seed_keypair( + pubKey, + privKey, + outputHashBuffer.slice(0, sodium.crypto_sign_SEEDBYTES), + ) + + return [pubKey, privKey] +} + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Delete data with no reference in login_users table + // eslint-disable-next-line no-console + // 663 affected rows + const userBackups = await queryFn( + `SELECT passphrase, LOWER(HEX(pubkey)) as pubkey, user_id + FROM login_user_backups + LEFT JOIN login_users ON login_user_backups.user_id = login_users.id + WHERE user_id=1503`, + // WHERE pubkey is not null`, // todo fix this condition and regenerate + ) + let i = 0 + // eslint-disable-next-line no-console + userBackups.forEach(async (userBackup) => { + const passphrase = userBackup.passphrase.split(' ') + const keyPair = KeyPairEd25519Create(passphrase) + if (keyPair[0].toString('hex') !== userBackup.pubkey) { + i++ + // eslint-disable-next-line no-console + console.log( + 'Missmatch Pubkey', + i, + userBackup.user_id, + `"${userBackup.passphrase}"`, + `"${keyPair[0].toString('hex')}`, + `"${userBackup.pubkey}"`, + ) + } else { + // eslint-disable-next-line no-console + // console.log('SUCCESS: ', `"${keyPair[0].toString('hex')}`, `"${userBackup.pubkey}"`) + } + }) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + return [] // cannot transform things back +} \ No newline at end of file diff --git a/database/integrity/README.md b/database/integrity/README.md new file mode 100644 index 000000000..c960a270e --- /dev/null +++ b/database/integrity/README.md @@ -0,0 +1,5 @@ +This is a test to find if all passphrases evaluate to the saved public key. + +You need `yarn add sodium-native` in order to make it work. + +This could be the start of database integrity tests in oder to evaluate the correctness of the database \ No newline at end of file diff --git a/database/migrations/0001-init_db.ts b/database/migrations/0001-init_db.ts index 242037363..e26c2c1a7 100644 --- a/database/migrations/0001-init_db.ts +++ b/database/migrations/0001-init_db.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - /* FIRST MIGRATION * * This migration is special since it takes into account that @@ -12,6 +9,9 @@ * databases. */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { // write upgrade logic as parameter of queryFn await queryFn(` diff --git a/database/migrations/0002-add_settings.ts b/database/migrations/0002-add_settings.ts index aed4feab4..ae9e72757 100644 --- a/database/migrations/0002-add_settings.ts +++ b/database/migrations/0002-add_settings.ts @@ -1,11 +1,11 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - /* MIGRATION TO ADD USER SETTINGS * * This migration adds the table `user_setting` in order to store all sorts of user configuration data */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { await queryFn(` CREATE TABLE IF NOT EXISTS \`user_setting\` ( diff --git a/database/migrations/0003-login_server_tables.ts b/database/migrations/0003-login_server_tables.ts index 909e63c0b..bb6f56ac8 100644 --- a/database/migrations/0003-login_server_tables.ts +++ b/database/migrations/0003-login_server_tables.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - /* MIGRATION TO CREATE THE LOGIN_SERVER TABLES * * This migration creates the `login_server` tables in the `community_server` database (`gradido_community`). @@ -8,6 +5,9 @@ * `0004-login_server_data` which will fill the tables with the existing data */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { await queryFn(` CREATE TABLE IF NOT EXISTS \`login_app_access_tokens\` ( diff --git a/database/migrations/0004-login_server_data.ts b/database/migrations/0004-login_server_data.ts index 4a38e016e..8c9f3497c 100644 --- a/database/migrations/0004-login_server_data.ts +++ b/database/migrations/0004-login_server_data.ts @@ -1,6 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - /* MIGRATION TO COPY LOGIN_SERVER DATA * * This migration copies all existing data from the `login_server` database (`gradido_login`) @@ -12,6 +9,9 @@ * NOTE: This migration does not delete the data when downgrading! */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + const LOGIN_SERVER_DB = 'gradido_login' export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { @@ -62,6 +62,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis `) } -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // TODO NO EMPTY FUNCTION +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // EMPTY FUNCTION } diff --git a/database/migrations/0005-admin_tables.ts b/database/migrations/0005-admin_tables.ts index 832008970..6351d146e 100644 --- a/database/migrations/0005-admin_tables.ts +++ b/database/migrations/0005-admin_tables.ts @@ -3,6 +3,9 @@ * This migration adds the table `login_pending_tasks_admin` to store pending creations */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { await queryFn(` CREATE TABLE IF NOT EXISTS \`login_pending_tasks_admin\` ( diff --git a/database/migrations/0006-login_users_collation.ts b/database/migrations/0006-login_users_collation.ts index 579bb0a7a..aa786ba34 100644 --- a/database/migrations/0006-login_users_collation.ts +++ b/database/migrations/0006-login_users_collation.ts @@ -5,12 +5,17 @@ * to also explicitly define it in the table */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Explicitly change the charset and collate to the one used to then change it + await queryFn('ALTER TABLE `login_users` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;') await queryFn( 'ALTER TABLE `login_users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;', ) } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn('ALTER TABLE `login_users` CONVERT TO CHARACTER SET utf8mb4;') + await queryFn('ALTER TABLE `login_users` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;') } diff --git a/database/migrations/0007-login_pending_tasks_delete.ts b/database/migrations/0007-login_pending_tasks_delete.ts new file mode 100644 index 000000000..baf6f5191 --- /dev/null +++ b/database/migrations/0007-login_pending_tasks_delete.ts @@ -0,0 +1,18 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * delete the pending tasks to not have any dead entries. + * the way we interact with the table is now differently + * and therefore we should clear it to avoid conflicts + * and dead entries + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('DELETE FROM `login_pending_tasks`;') +} + +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // cannot undelete things +} diff --git a/database/migrations/0008-state_users_plug_holes.ts b/database/migrations/0008-state_users_plug_holes.ts new file mode 100644 index 000000000..3607c6233 --- /dev/null +++ b/database/migrations/0008-state_users_plug_holes.ts @@ -0,0 +1,26 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * some entries in the state_users table do not have an email. + * this is required tho to work with the new environment. + * to mitigate 38 out of 50 emails could be restored from + * login_users. + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Fill in missing emails from login_users + await queryFn( + `UPDATE state_users + INNER JOIN login_users ON state_users.public_key = login_users.pubkey + SET state_users.email = login_users.email + WHERE state_users.email = '';`, + ) + // Delete remaining ones + await queryFn(`DELETE FROM state_users WHERE email = ''`) +} + +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // cannot undelete things +} diff --git a/database/migrations/0009-login_users_plug_holes.ts b/database/migrations/0009-login_users_plug_holes.ts new file mode 100644 index 000000000..506f8934c --- /dev/null +++ b/database/migrations/0009-login_users_plug_holes.ts @@ -0,0 +1,31 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * some entries in the login_users table are inconsistent. + * As solution the inconsistent data is purged and the corresponding + * account is set as not yet activated + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Generate a random private key where the required data is present (pubkey + password + passphrase). + // Furthermore the email needs to be confirmed + await queryFn( + `UPDATE login_users SET privkey = UNHEX(SHA1(RAND())) + WHERE privkey IS NULL + AND pubkey IS NOT NULL + AND password != 0 + AND email_checked = 1 + AND id IN (SELECT user_id FROM login_user_backups);`, + ) + + // Remove incomplete data and set account as not activated yet. + await queryFn( + `UPDATE login_users SET password = 0, pubkey = NULL, email_checked = 0 WHERE privkey IS NULL;`, + ) +} + +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // cannot undelete things +} diff --git a/database/migrations/0010-login_users_state_users_sync.ts b/database/migrations/0010-login_users_state_users_sync.ts new file mode 100644 index 000000000..dea9c6de7 --- /dev/null +++ b/database/migrations/0010-login_users_state_users_sync.ts @@ -0,0 +1,48 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * login_users and state_users are not in sync. + * Copy missing data from login_users to state_users. + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Copy data with intact private key + await queryFn( + `INSERT INTO state_users + (public_key, email, first_name, last_name, username, disabled) + (SELECT pubkey as public_key, email, first_name, last_name, username, disabled + FROM login_users + WHERE email NOT IN (SELECT email from state_users) + AND privkey IS NOT NULL + )`, + ) + // Copy data without intact private key, generate random pubkey + await queryFn( + `INSERT INTO state_users + (public_key, email, first_name, last_name, username, disabled) + (SELECT UNHEX(SHA1(RAND())) as public_key, email, first_name, last_name, username, disabled + FROM login_users + WHERE email NOT IN (SELECT email from state_users) + AND privkey IS NULL + )`, + ) + // Remove duplicate data from state_users with dead pubkeys + // 18 entries + await queryFn( + `DELETE FROM state_users + WHERE id IN + (SELECT state_users.id FROM state_users + WHERE public_key NOT IN + (SELECT pubkey FROM login_users + WHERE pubkey IS NOT NULL) + AND email IN (SELECT email FROM state_users GROUP BY email HAVING COUNT(*) > 1 + ) + )`, + ) +} + +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // cannot undelete things +} diff --git a/database/migrations/0011-login_user_backups_plug_holes.ts b/database/migrations/0011-login_user_backups_plug_holes.ts new file mode 100644 index 000000000..87f38486d --- /dev/null +++ b/database/migrations/0011-login_user_backups_plug_holes.ts @@ -0,0 +1,21 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * cleanup the login_user_backups. + * Delete data with no reference in login_users table and + * delete the right one of the duplicate keys + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Delete data with no reference in login_users table + await queryFn(`DELETE FROM login_user_backups WHERE user_id NOT IN (SELECT id FROM login_users)`) + + // Delete duplicates which have changed for some reasons + await queryFn(`DELETE FROM login_user_backups WHERE id IN (21, 103, 313, 325, 726, 750, 1098)`) +} + +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // cannot undelete things +} diff --git a/database/migrations/0012-login_user_backups_unify_wordlist.ts b/database/migrations/0012-login_user_backups_unify_wordlist.ts new file mode 100644 index 000000000..9825bb791 --- /dev/null +++ b/database/migrations/0012-login_user_backups_unify_wordlist.ts @@ -0,0 +1,71 @@ +/* MIGRATION TO CLEAN PRODUCTION DATA + * + * the way the passphrases are stored in login_user_backups is inconsistent. + * we need to detect which word list was used and transform it accordingly. + * This also removes the trailing space + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import fs from 'fs' +import path from 'path' + +const TARGET_MNEMONIC_TYPE = 2 +const PHRASE_WORD_COUNT = 24 +const WORDS_MNEMONIC_0 = fs + .readFileSync(path.resolve(__dirname, '../src/config/mnemonic.uncompressed_buffer18112.txt')) + .toString() + .split(',') +const WORDS_MNEMONIC_1 = fs + .readFileSync(path.resolve(__dirname, '../src/config/mnemonic.uncompressed_buffer18113.txt')) + .toString() + .split(',') +const WORDS_MNEMONIC_2 = fs + .readFileSync(path.resolve(__dirname, '../src/config/mnemonic.uncompressed_buffer13116.txt')) + .toString() + .split(',') +const WORDS_MNEMONIC = [WORDS_MNEMONIC_0, WORDS_MNEMONIC_1, WORDS_MNEMONIC_2] + +const detectMnemonic = (passphrase: string[]): string[] => { + if (passphrase.length < PHRASE_WORD_COUNT) { + throw new Error( + `Passphrase is not long enough ${passphrase.length}/${PHRASE_WORD_COUNT}; passphrase: ${passphrase}`, + ) + } + + const passphraseSliced = passphrase.slice(0, PHRASE_WORD_COUNT) + + // Loop through all word lists + for (let i = 0; i < WORDS_MNEMONIC.length; i++) { + // Does the wordlist contain all elements of the passphrase + if (passphraseSliced.every((word) => WORDS_MNEMONIC[i].includes(word))) { + if (i === TARGET_MNEMONIC_TYPE) { + return passphraseSliced + } else { + return passphraseSliced.map((word) => WORDS_MNEMONIC_2[WORDS_MNEMONIC[i].indexOf(word)]) + } + } + } + + throw new Error(`Could not find mnemonic type for passphrase: ${passphrase}`) +} + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Loop through all user backups and update passphrase and mnemonic type if needed + const userBackups = await queryFn(`SELECT * FROM login_user_backups`) + userBackups.forEach(async (userBackup) => { + const passphrase = userBackup.passphrase.split(' ') + const newPassphrase = detectMnemonic(passphrase).join(' ') + if (newPassphrase !== userBackup.passphrase) { + await queryFn( + `UPDATE login_user_backups SET passphrase = ?, mnemonic_type = ? WHERE id = ?`, + [newPassphrase, TARGET_MNEMONIC_TYPE, userBackup.id], + ) + } + }) +} + +export async function downgrade(/* queryFn: (query: string, values?: any[]) => Promise> */) { + // cannot transform things back +} diff --git a/database/migrations/0013-drop_unused_tables.ts b/database/migrations/0013-drop_unused_tables.ts new file mode 100644 index 000000000..1097270f9 --- /dev/null +++ b/database/migrations/0013-drop_unused_tables.ts @@ -0,0 +1,145 @@ +/* MIGRATION TO DROP UNUSED TABLES + * + * This migration removes all tables without data and entity definition. + * Base for evaluation are the production data from 27.01.2022 which had 40 tables present + * The migration reduces the amount of tables to 28 + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE \`login_app_access_tokens\`;`) + await queryFn(`DROP TABLE \`pending_transactions\`;`) + await queryFn(`DROP TABLE \`roles\`;`) + await queryFn(`DROP TABLE \`state_created\`;`) + await queryFn(`DROP TABLE \`state_groups\`;`) + await queryFn(`DROP TABLE \`state_group_addresses\`;`) + await queryFn(`DROP TABLE \`state_group_relationships\`;`) + await queryFn(`DROP TABLE \`state_relationship_types\`;`) + await queryFn(`DROP TABLE \`state_user_roles\`;`) + await queryFn(`DROP TABLE \`transaction_group_addaddress\`;`) + await queryFn(`DROP TABLE \`transaction_group_allowtrades\`;`) + await queryFn(`DROP TABLE \`transaction_group_creates\`;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE IF NOT EXISTS \`login_app_access_tokens\` ( + \`id\` int unsigned NOT NULL AUTO_INCREMENT, + \`user_id\` int NOT NULL, + \`access_code\` bigint unsigned NOT NULL, + \`created\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + \`updated\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (\`id\`), + UNIQUE KEY \`access_code\` (\`access_code\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + `) + await queryFn(` + CREATE TABLE \`pending_transactions\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transactionID\` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL, + \`service\` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + \`method\` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, + \`h_server_id\` int(11) NOT NULL, + \`timeout\` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (\`id\`), + UNIQUE KEY \`transactionID\` (\`transactionID\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`roles\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`title\` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`state_created\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`month\` tinyint(3) unsigned NOT NULL, + \`year\` smallint(5) unsigned NOT NULL, + \`state_user_id\` int(10) unsigned NOT NULL, + \`created\` datetime NOT NULL, + \`short_ident_hash\` int(10) unsigned NOT NULL, + PRIMARY KEY (\`id\`), + KEY \`short_ident_hash\` (\`short_ident_hash\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`state_groups\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`index_id\` varbinary(64) NOT NULL, + \`name\` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + \`root_public_key\` binary(32) NOT NULL, + \`user_count\` smallint(5) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`state_group_addresses\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`group_id\` int(10) unsigned NOT NULL, + \`public_key\` binary(32) NOT NULL, + \`address_type_id\` int(10) unsigned NOT NULL, + PRIMARY KEY (\`id\`), + UNIQUE KEY \`public_key\` (\`public_key\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`state_group_relationships\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`group1_id\` int(10) unsigned NOT NULL, + \`group2_id\` int(10) unsigned NOT NULL, + \`state_relationship_id\` int(10) unsigned NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`state_relationship_types\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL, + \`text\` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`state_user_roles\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`state_user_id\` int(11) NOT NULL, + \`role_id\` int(11) NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`transaction_group_addaddress\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`address_type_id\` int(10) unsigned NOT NULL, + \`remove_from_group\` tinyint(1) DEFAULT 0, + \`public_key\` binary(32) NOT NULL, + \`state_user_id\` int(10) unsigned NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`transaction_group_allowtrades\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`remote_group_id\` varbinary(64) NOT NULL, + \`allow\` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`transaction_group_creates\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`group_public_key\` binary(32) NOT NULL, + \`group_id\` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + \`name\` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) +} diff --git a/database/migrations/0014-drop_unused_tables_with_data.ts b/database/migrations/0014-drop_unused_tables_with_data.ts new file mode 100644 index 000000000..af1e27cb4 --- /dev/null +++ b/database/migrations/0014-drop_unused_tables_with_data.ts @@ -0,0 +1,354 @@ +/* MIGRATION TO DROP UNUSED TABLES + * + * This migration removes all tables with static or unused data and entity definition. + * Base for evaluation are the production data from 27.01.2022 which had 28 tables present + * The migration reduces the amount of tables to 16 + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE \`address_types\`;`) + await queryFn(`DROP TABLE \`admin_errors\`;`) + await queryFn(`DROP TABLE \`blockchain_types\`;`) + await queryFn(`DROP TABLE \`community_profiles\`;`) + await queryFn(`DROP TABLE \`login_email_opt_in_types\`;`) + await queryFn(`DROP TABLE \`login_groups\`;`) + await queryFn(`DROP TABLE \`login_roles\`;`) + await queryFn(`DROP TABLE \`login_user_roles\`;`) + await queryFn(`DROP TABLE \`operators\`;`) + await queryFn(`DROP TABLE \`operator_types\`;`) + await queryFn(`DROP TABLE \`state_errors\`;`) + await queryFn(`DROP TABLE \`transaction_types\`;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`address_types\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL, + \`text\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`address_types\` VALUES + (1,'user main','user main address'); + `) + + await queryFn(` + CREATE TABLE \`admin_errors\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`state_user_id\` int(11) NOT NULL, + \`controller\` varchar(255) NOT NULL, + \`action\` varchar(255) NOT NULL, + \`state\` varchar(255) NOT NULL, + \`msg\` varchar(255) NOT NULL, + \`details\` varchar(255) DEFAULT NULL, + \`created\` datetime NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=155 DEFAULT CHARSET=utf8mb4; + `) + // NOTE: This data is no longer generated + await queryFn(` + INSERT INTO \`admin_errors\` VALUES + (54,272,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2020-11-04 17:57:07'), + (55,272,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2020-11-04 17:57:16'), + (56,193,'StateBalancesController','overview','error','server response status code isn\\'t 200','403','2020-11-24 12:44:31'), + (57,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2020-12-31 19:17:52'), + (58,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2020-12-31 19:18:04'), + (59,44,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-12 20:58:45'), + (60,44,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-12 21:02:02'), + (61,44,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-12 21:02:04'), + (62,44,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-12 21:02:19'), + (63,20,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-13 22:32:59'), + (64,20,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-14 23:54:19'), + (65,161,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-27 10:29:09'), + (66,161,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-27 10:29:11'), + (67,161,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-01-27 10:29:23'), + (68,20,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-02-03 00:27:36'), + (69,685,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-02-06 11:48:09'), + (70,685,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-02-06 11:53:14'), + (71,685,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-02-06 11:53:20'), + (72,502,'TransactionCreations','createMulti','error','json exception','System exception: cannot unlock mutex','2021-03-24 21:22:14'), + (73,502,'TransactionCreations','createMulti','error','json exception','System exception: cannot unlock mutex','2021-03-24 21:23:38'), + (74,259,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-02 15:07:07'), + (75,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 20:31:50'), + (76,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 20:31:57'), + (77,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 20:32:23'), + (78,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 20:32:57'), + (79,199,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 21:43:13'), + (80,199,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 21:43:47'), + (81,199,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 21:44:45'), + (82,272,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 22:57:10'), + (83,272,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-14 22:57:18'), + (84,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:50:53'), + (85,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:51:27'), + (86,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:51:32'), + (87,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:51:54'), + (88,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:52:29'), + (89,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:53:33'), + (90,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-21 12:53:37'), + (91,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-23 12:27:57'), + (92,1162,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-23 12:28:02'), + (93,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 18:59:08'), + (94,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 18:59:16'), + (95,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 18:59:27'), + (96,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 19:00:51'), + (97,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 19:01:18'), + (98,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 19:04:22'), + (99,900,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 19:04:39'), + (100,1087,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-27 19:43:18'), + (101,240,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-28 22:00:05'), + (102,240,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-28 22:00:35'), + (103,240,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-28 22:00:37'), + (104,240,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-28 22:00:44'), + (105,90,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-29 14:05:59'), + (106,90,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-29 14:06:07'), + (107,90,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-29 14:06:15'), + (108,90,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-04-29 14:07:13'), + (109,79,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-05-01 10:18:03'), + (110,20,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-05-08 00:25:20'), + (111,84,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-05-08 22:34:27'), + (112,84,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-05-08 22:35:47'), + (113,776,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-05-12 10:24:55'), + (114,776,'TransactionSendCoins','create','success','(Leere Message)','(Leere Details)','2021-05-13 13:47:07'), + (115,1339,'StateBalancesController','overview','success','(Leere Message)','(Leere Details)','2021-07-13 08:54:30'), + (116,1339,'StateBalancesController','overview','success','(Leere Message)','(Leere Details)','2021-07-13 08:54:30'), + (117,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:46:40'), + (118,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:05'), + (119,943,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:05'), + (120,751,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:20'), + (121,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:21'), + (122,943,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:21'), + (123,751,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:22'), + (124,751,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:22'), + (125,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:36'), + (126,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:43'), + (127,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:43'), + (128,11,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:43'), + (129,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:46'), + (130,943,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:47:46'), + (131,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:48:47'), + (132,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:48:52'), + (133,11,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:48:52'), + (134,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:49:24'), + (135,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:49:26'), + (136,943,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:49:26'), + (137,751,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:49:58'), + (138,751,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:50:00'), + (139,751,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:50:00'), + (140,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:50:57'), + (141,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:51:01'), + (142,943,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:51:02'), + (143,11,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-08-12 14:51:10'), + (144,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:51:10'), + (145,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:52:39'), + (146,943,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:52:44'), + (147,82,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:54:25'), + (148,284,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-08-12 14:54:35'), + (149,1439,'StateBalancesController','overview','success','(Leere Message)','(Leere Details)','2021-09-16 15:44:16'), + (150,1439,'StateBalancesController','overview','success','(Leere Message)','(Leere Details)','2021-09-16 15:44:27'), + (151,11,'StateBalancesController','overview','error','server response status code isn\\'t 200','500','2021-09-22 11:03:10'), + (152,11,'StateBalancesController','ajaxGdtOverview','error','server response status code isn\\'t 200','500','2021-09-22 11:16:33'), + (153,82,'StateBalancesController','overview','error','server response status code isn\\'t 200','403','2021-11-23 16:03:57'), + (154,82,'StateBalancesController','overview','error','server response status code isn\\'t 200','403','2021-11-23 16:04:10'); + `) + + await queryFn(` + CREATE TABLE \`blockchain_types\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL, + \`text\` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + \`symbol\` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`blockchain_types\` VALUES + (1,'mysql','use mysql db as blockchain, work only with single community-server',NULL), + (2,'hedera','use hedera for transactions','HBAR'); + `) + + await queryFn(` + CREATE TABLE \`community_profiles\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`state_user_id\` int(10) unsigned NOT NULL, + \`profile_img\` longblob DEFAULT NULL, + \`profile_desc\` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (\`id\`), + KEY \`state_user_id\` (\`state_user_id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: The data was removed due to large binary images in the database. If this data is needed please get it from the backup file. + + await queryFn(` + CREATE TABLE \`login_email_opt_in_types\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(255) NOT NULL, + \`description\` varchar(255) NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`login_email_opt_in_types\` VALUES + (1,'register','Email Verification Code for register from new User.'), + (2,'resetPassword','Email Verification Code for reset Password (only if passphrase is known)'); + `) + + await queryFn(` + CREATE TABLE \`login_groups\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`alias\` varchar(190) NOT NULL, + \`name\` varchar(255) NOT NULL, + \`url\` varchar(255) NOT NULL, + \`host\` varchar(255) DEFAULT '/', + \`home\` varchar(255) DEFAULT '/', + \`description\` text DEFAULT NULL, + PRIMARY KEY (\`id\`), + UNIQUE KEY \`alias\` (\`alias\`) + ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`login_groups\` VALUES + (1,'gdd1','gdd1','gdd1.gradido.com','','/','gdd1 group'); + `) + + await queryFn(` + CREATE TABLE \`login_roles\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(255) NOT NULL, + \`description\` varchar(255) NOT NULL, + \`flags\` bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`login_roles\` VALUES + (1,'admin','darf einfach alles',0); + `) + + await queryFn(` + CREATE TABLE \`login_user_roles\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`user_id\` int(11) NOT NULL, + \`role_id\` int(11) NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; + `) + // NOTE: This data is not used - therefore we remove it. + // This data is aligned to the `server_users` table except the entry 4, + // this one is missing in the other table + // and after checking with administration, we figured out that + // this is a data fragement no longer needed. + await queryFn(` + INSERT INTO \`login_user_roles\` VALUES + (1,28,1), + (2,37,1), + (3,50,1), + (4,44,1), + (5,872,1); + `) + + await queryFn(` + CREATE TABLE \`operators\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`username\` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + \`user_pubkey\` binary(32) NOT NULL, + \`data_base64\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + \`modified\` datetime NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: This data seems not to have any use + await queryFn(` + INSERT INTO \`operators\` VALUES + (5,'einhornimmond',0x78DCFAA8341B3A39B3C5502B4D9ACDBC4B181A10CC0D94187498E0A0C74288E0,'i99a5/wWGmQN4AF8ilUXhHJVV/3At82f6CNNh3ewdVyTTAqugcdeG53DEMNUxCTFwk7KIg==','2019-09-17 13:08:22'); + `) + + await queryFn(` + CREATE TABLE \`operator_types\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL, + \`text\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`operator_types\` VALUES + (1,'hedera','Hedera Keys for sign and pay hedera transactions'), + (2,'gradido-user','default gradido user keys'), + (3,'gradido-group','default gradido group root keys, other address are derived'); + `) + + await queryFn(` + CREATE TABLE \`state_errors\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`state_user_id\` int(10) unsigned NOT NULL, + \`transaction_type_id\` int(10) unsigned NOT NULL, + \`created\` datetime NOT NULL, + \`message_json\` text COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=161 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: This data is no longer generated + await queryFn(` + INSERT INTO \`state_errors\` VALUES + (9,11,1,'2020-08-07 10:40:03','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (17,528,2,'2021-02-10 08:04:32','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"sender 0 hasn\\'t enough GDD"}]}'), + (115,82,1,'2021-09-01 11:14:25','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (119,82,1,'2021-09-06 18:55:55','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (138,502,1,'2021-10-31 00:00:32','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (139,502,1,'2021-11-02 19:50:36','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (140,502,1,'2021-11-07 13:32:11','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (141,502,1,'2021-11-16 22:04:59','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (142,502,1,'2021-11-21 23:47:14','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (143,502,1,'2021-11-22 00:14:40','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (144,502,1,'2021-11-25 21:40:15','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (145,502,1,'2021-11-25 22:45:06','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (146,502,1,'2021-11-29 12:52:12','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (147,502,1,'2021-12-04 01:56:10','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (148,502,1,'2021-12-06 13:12:08','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (149,502,1,'2021-12-06 13:18:20','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (150,502,1,'2021-12-16 21:06:34','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (151,502,1,'2021-12-20 23:11:44','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (152,502,1,'2022-01-04 13:19:31','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (153,502,1,'2022-01-04 13:54:33','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (154,502,1,'2022-01-04 13:55:32','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (155,502,1,'2022-01-04 14:02:35','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (156,502,1,'2022-01-04 14:50:49','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (157,502,1,'2022-01-04 14:51:41','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (158,502,1,'2022-01-19 00:32:46','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (159,502,1,'2022-01-19 00:52:42','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'), + (160,502,1,'2022-01-25 08:31:57','{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}'); + `) + + await queryFn(` + CREATE TABLE \`transaction_types\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`name\` varchar(90) COLLATE utf8mb4_unicode_ci NOT NULL, + \`text\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + // NOTE: Static data might be needed as enum definitions + await queryFn(` + INSERT INTO \`transaction_types\` VALUES + (1,'creation','create new gradidos for member and also for group (in development)'), + (2,'transfer','send gradidos from one member to another, also cross group transfer'), + (3,'group create','create a new group, trigger creation of new hedera topic and new blockchain on node server'), + (4,'group add member','add user to a group or move if he was already in a group'), + (5,'group remove member','remove user from group, maybe he was moved elsewhere'), + (6,'hedera topic create','create new topic on hedera'), + (7,'hedera topic send message','send consensus message over hedera topic'), + (8,'hedera account create','create new account on hedera for holding some founds with unencrypted keys'), + (9,'decay start','signalize the starting point for decay calculation, allowed only once per chain'); + `) +} diff --git a/database/migrations/0015-admin_pending_creations.ts b/database/migrations/0015-admin_pending_creations.ts new file mode 100644 index 000000000..c48d81792 --- /dev/null +++ b/database/migrations/0015-admin_pending_creations.ts @@ -0,0 +1,38 @@ +/* MIGRATION TO PROPERLY STORE PENDING CREATIONS + * + * There were two tables for the pending tasks, + * since the login_server used some crypto to store its + * tasks there. It was easier to create a new table. + * This migration drops the old unused table and renames + * the new table to properly describe what it does + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // drop duplicate table, it was unused + await queryFn('DROP TABLE `login_pending_tasks`;') + + // rename the new pending creations table to a proper table name + await queryFn('RENAME TABLE `login_pending_tasks_admin` TO `admin_pending_creations`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('RENAME TABLE `admin_pending_creations` TO `login_pending_tasks_admin`;') + await queryFn(` + CREATE TABLE \`login_pending_tasks\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`user_id\` int(10) unsigned DEFAULT 0, + \`request\` varbinary(2048) NOT NULL, + \`created\` datetime NOT NULL, + \`finished\` datetime DEFAULT '2000-01-01 00:00:00', + \`result_json\` text DEFAULT NULL, + \`param_json\` text DEFAULT NULL, + \`task_type_id\` int(10) unsigned NOT NULL, + \`child_pending_task_id\` int(10) unsigned DEFAULT 0, + \`parent_pending_task_id\` int(10) unsigned DEFAULT 0, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=795 DEFAULT CHARSET=utf8mb4 + `) +} diff --git a/database/migrations/0016-transaction_signatures.ts b/database/migrations/0016-transaction_signatures.ts new file mode 100644 index 000000000..37910e269 --- /dev/null +++ b/database/migrations/0016-transaction_signatures.ts @@ -0,0 +1,63 @@ +/* MIGRATION TO CLEANUP TRANSACTIONS TABLE + * + * This migration cleans up the transactions table and + * combines its data with transaction_signatures. + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Drop column `state_group_id` since it only contains "0" as value, no variation. + // Furthermore it was not present in our model itself (meaning that newly created ) + await queryFn('ALTER TABLE `transactions` DROP COLUMN `state_group_id`;') + + // Drop column `blockchain_type_id` since it only contains "1" as value, no variation. + await queryFn('ALTER TABLE `transactions` DROP COLUMN `blockchain_type_id`;') + + // Create `signature` column - for data from `transaction_signatures` table. + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `signature` binary(64) DEFAULT NULL AFTER `received`;', + ) + + // Create `pubkey` column - for data from `transaction_signatures` table. + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `pubkey` binary(32) DEFAULT NULL AFTER `signature`;', + ) + + // Transfer data from `transaction_signatures` table to `transactions` table + await queryFn(` + UPDATE transactions + INNER JOIN transaction_signatures ON transactions.id = transaction_signatures.transaction_id + SET transactions.signature = transaction_signatures.signature, transactions.pubkey = transaction_signatures.pubkey; + `) + + // Drop `transaction_signatures` table + await queryFn('DROP TABLE `transaction_signatures`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`transaction_signatures\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`signature\` binary(64) NOT NULL, + \`pubkey\` binary(32) NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci + `) + await queryFn(` + INSERT INTO transaction_signatures (transaction_id, signature, pubkey) + (SELECT id as transaction_id, signature, pubkey FROM transactions WHERE signature IS NOT NULL and pubkey IS NOT NULL); + `) + await queryFn('ALTER TABLE `transactions` DROP COLUMN `pubkey`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `signature`;') + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `blockchain_type_id` bigint(20) unsigned NOT NULL DEFAULT 1 AFTER `received` ;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `state_group_id` int(10) unsigned DEFAULT NULL AFTER `id`;', + ) + // We have to set the correct values previously in the table , since its not the same as the column's default + await queryFn('UPDATE `transactions` SET `state_group_id` = 0;') +} diff --git a/database/migrations/0017-combine_user_tables.ts b/database/migrations/0017-combine_user_tables.ts new file mode 100644 index 000000000..c2f76374d --- /dev/null +++ b/database/migrations/0017-combine_user_tables.ts @@ -0,0 +1,153 @@ +/* MIGRATION TO COMBINE LOGIN_USERS WITH STATE_USERS TABLE + * + * This migration combines the table `login_users` with + * the `state_users` table, where the later is the target. + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Drop column `group_id` since it contains uniform data which is not the same as the uniform data + // on login_users. Since we do not need this data anyway, we sjust throw it away. + await queryFn('ALTER TABLE `state_users` DROP COLUMN `group_id`;') + + // Remove the unique constraint from the pubkey + await queryFn('ALTER TABLE `state_users` DROP INDEX `public_key`;') + + // Allow NULL on the `state_users` pubkey like it is allowed on `login_users` + await queryFn('ALTER TABLE `state_users` MODIFY COLUMN `public_key` binary(32) DEFAULT NULL;') + + // instead use a unique constraint for the email like on `login_users` + // therefore do not allow null on `email` anymore + await queryFn( + 'ALTER TABLE `state_users` MODIFY COLUMN `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL;', + ) + await queryFn('ALTER TABLE `state_users` ADD CONSTRAINT `email` UNIQUE KEY (`email`);') + + // Create `login_user_id` column - to store the login_users.id field to not break references. + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `login_user_id` int(10) unsigned DEFAULT NULL AFTER `id`;', + ) + + // Create missing data columns for the data stored in `login_users` + await queryFn( + "ALTER TABLE `state_users` ADD COLUMN `description` mediumtext COLLATE utf8mb4_unicode_ci DEFAULT '' AFTER `disabled`;", + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `password` bigint(20) unsigned DEFAULT 0 AFTER `description`;', + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `privkey` binary(80) DEFAULT NULL AFTER `public_key`;', + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `email_hash` binary(32) DEFAULT NULL AFTER `password`;', + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `created` datetime NOT NULL DEFAULT current_timestamp() AFTER `email_hash`;', + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `email_checked` tinyint(4) NOT NULL DEFAULT 0 AFTER `created`;', + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `passphrase_shown` tinyint(4) NOT NULL DEFAULT 0 AFTER `email_checked`;', + ) + await queryFn( + "ALTER TABLE `state_users` ADD COLUMN `language` varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'de' AFTER `passphrase_shown`;", + ) + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `publisher_id` int(11) DEFAULT 0 AFTER `language`;', + ) + + // Move data from `login_users` to the newly modified `state_users` table. + // The following rules for overwriting data applies: + // email is the matching criteria + // public_key is overwritten by `login_users`.`pubkey` (we have validated the passphrases here) (2 keys differ) + // first_name is more accurate on `state_users` and stays unchanged (1 users with different first_* & last_name) + // last_name is more accurate on `state_users` and stays unchanged (1 users with different first_* & last_name) + // username does not contain any relevant data, either NULL or '' and therefore we do not change anything here + // disabled does not differ, we can omit it + await queryFn(` + UPDATE state_users + LEFT JOIN login_users ON state_users.email = login_users.email + SET state_users.public_key = login_users.pubkey, + state_users.login_user_id = login_users.id, + state_users.description = login_users.description, + state_users.password = login_users.password, + state_users.privkey = login_users.privkey, + state_users.email_hash = login_users.email_hash, + state_users.created = login_users.created, + state_users.email_checked = login_users.email_checked, + state_users.passphrase_shown = login_users.passphrase_shown, + state_users.language = login_users.language, + state_users.publisher_id = login_users.publisher_id + ; + `) + + // Drop `login_users` table + await queryFn('DROP TABLE `login_users`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`login_users\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`email\` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, + \`first_name\` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL, + \`last_name\` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '', + \`username\` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '', + \`description\` mediumtext COLLATE utf8mb4_unicode_ci DEFAULT '', + \`password\` bigint(20) unsigned DEFAULT 0, + \`pubkey\` binary(32) DEFAULT NULL, + \`privkey\` binary(80) DEFAULT NULL, + \`email_hash\` binary(32) DEFAULT NULL, + \`created\` datetime NOT NULL DEFAULT current_timestamp(), + \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, + \`passphrase_shown\` tinyint(4) NOT NULL DEFAULT 0, + \`language\` varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'de', + \`disabled\` tinyint(4) DEFAULT 0, + \`group_id\` int(10) unsigned DEFAULT 0, + \`publisher_id\` int(11) DEFAULT 0, + PRIMARY KEY (\`id\`), + UNIQUE KEY \`email\` (\`email\`) + ) ENGINE=InnoDB AUTO_INCREMENT=2363 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + INSERT INTO login_users + ( id, email, first_name, last_name, username, + description, password, pubkey, privkey, email_hash, + created, email_checked, passphrase_shown, language, + disabled, group_id, publisher_id ) + ( SELECT login_user_id AS id, email, first_name, + last_name, username, description, password, + public_key AS pubkey, privkey, email_hash, + created, email_checked, passphrase_shown, + language, disabled, '1' AS group_id, + publisher_id + FROM state_users ) + ; + `) + await queryFn('ALTER TABLE `state_users` DROP COLUMN `publisher_id`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `language`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `passphrase_shown`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `email_checked`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `created`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `email_hash`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `privkey`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `password`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `description`;') + await queryFn('ALTER TABLE `state_users` DROP COLUMN `login_user_id`;') + await queryFn('ALTER TABLE `state_users` DROP INDEX `email`;') + await queryFn( + 'ALTER TABLE `state_users` MODIFY COLUMN `email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL;', + ) + // Note: if the public_key is NULL, we need to set a random key in order to meet the constraint + await queryFn( + 'UPDATE `state_users` SET public_key = UNHEX(SHA1(RAND())) WHERE public_key IS NULL;', + ) + await queryFn('ALTER TABLE `state_users` MODIFY COLUMN `public_key` binary(32) NOT NULL;') + await queryFn('ALTER TABLE `state_users` ADD CONSTRAINT `public_key` UNIQUE KEY (`public_key`);') + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `group_id` int(10) unsigned NOT NULL DEFAULT 0 AFTER index_id;', + ) +} diff --git a/database/migrations/0018-combine_login_user_backups_and_user_table.ts b/database/migrations/0018-combine_login_user_backups_and_user_table.ts new file mode 100644 index 000000000..9209e461d --- /dev/null +++ b/database/migrations/0018-combine_login_user_backups_and_user_table.ts @@ -0,0 +1,51 @@ +/* MIGRATION TO COMBINE LOGIN_BACKUP_USERS TABLE WITH STATE_USERS + * + * This migration combines the table `login_user_backups` into + * the `state_users` table, where the later is the target. + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // We only keep the passphrase, the mnemonic type is a constant, + // since every passphrase was converted to mnemonic type 2 + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `passphrase` text DEFAULT NULL AFTER `publisher_id`;', + ) + + // Move data from `login_user_backups` to the newly modified `state_users` table. + await queryFn(` + UPDATE state_users + LEFT JOIN login_user_backups ON state_users.login_user_id = login_user_backups.user_id + SET state_users.passphrase = login_user_backups.passphrase + WHERE login_user_backups.passphrase IS NOT NULL + ; + `) + + // Drop `login_user_backups` table + await queryFn('DROP TABLE `login_user_backups`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`login_user_backups\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`user_id\` int(11) NOT NULL, + \`passphrase\` text NOT NULL, + \`mnemonic_type\` int(11) DEFAULT -1, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=1862 DEFAULT CHARSET=utf8mb4; + `) + await queryFn(` + INSERT INTO login_user_backups + ( user_id, passphrase, mnemonic_type ) + ( SELECT login_user_id AS user_id, + passphrase, + '2' as mnemonic_type + FROM state_users + WHERE passphrase IS NOT NULL ) + ; + `) + await queryFn('ALTER TABLE `state_users` DROP COLUMN `passphrase`;') +} diff --git a/database/migrations/0019-replace_login_user_id_with_state_user_id.ts b/database/migrations/0019-replace_login_user_id_with_state_user_id.ts new file mode 100644 index 000000000..cef608c29 --- /dev/null +++ b/database/migrations/0019-replace_login_user_id_with_state_user_id.ts @@ -0,0 +1,60 @@ +/* MIGRATION TO REPLACE LOGIN_USER_ID WITH STATE_USER_ID + * + * This migration replaces the `login_user_id with` the + * `state_user.id` and removes corresponding columns. + * The table affected is `login_email_opt_in` + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Delete email opt in codes which can not be linked to an user + await queryFn(` + DELETE FROM \`login_email_opt_in\` + WHERE user_id NOT IN + ( SELECT login_user_id FROM state_users ) + `) + + // Replace user_id in `login_email_opt_in` + await queryFn(` + UPDATE login_email_opt_in + LEFT JOIN state_users ON state_users.login_user_id = login_email_opt_in.user_id + SET login_email_opt_in.user_id = state_users.id; + `) + + // Remove the column `login_user_id` from `state_users` + await queryFn('ALTER TABLE `state_users` DROP COLUMN `login_user_id`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `state_users` ADD COLUMN `login_user_id` int(10) unsigned DEFAULT NULL AFTER `id`;', + ) + // Instead of generating new `login_user_id`'s we just use the id of state user. + // This way we do not need to alter the `user_id`'s of `login_email_opt_in` table + // at all when migrating down. + // This is possible since there are no old `login_user.id` referenced anymore and + // we can freely choose them + await queryFn('UPDATE `state_users` SET login_user_id = id') + + // Insert back broken data, since we generate new `user_id`'s the old data might be now + // linked to existing accounts. To prevent that all invalid `user_id`'s are now negative. + // This renders them invalid while still keeping the original value + await queryFn(` + INSERT INTO login_email_opt_in + (id, user_id, verification_code, email_opt_in_type_id, created, resend_count, updated) + VALUES + ('38','-41','7544440030630126261','0','2019-11-09 13:58:21','0','2020-07-17 13:58:29'), + ('1262','-1185','2702555860489093775','3','2020-10-17 00:57:29','0','2020-10-17 00:57:29'), + ('1431','-1319','9846213635571107141','3','2020-12-29 00:07:32','0','2020-12-29 00:07:32'), + ('1548','-1185','1009203004512986277','1','2021-01-26 01:07:29','0','2021-01-26 01:07:29'), + ('1549','-1185','2144334450300724903','1','2021-01-26 01:07:32','0','2021-01-26 01:07:32'), + ('1683','-1525','14803676216828342915','3','2021-03-10 08:39:39','0','2021-03-10 08:39:39'), + ('1899','-1663','16616172057370363741','3','2021-04-12 14:49:18','0','2021-04-12 14:49:18'), + ('2168','-1865','13129474130315401087','3','2021-07-08 11:58:54','0','2021-07-08 11:58:54'), + ('2274','-1935','5775135935896874129','3','2021-08-24 11:40:04','0','2021-08-24 11:40:04'), + ('2318','-1967','5713731625139303791','3','2021-09-06 21:38:30','0','2021-09-06 21:38:30'), + ('2762','-2263','6997866521554931275','1','2021-12-25 11:44:30','0','2021-12-25 11:44:30'); + `) +} diff --git a/database/migrations/0020-rename_and_clean_state_users.ts b/database/migrations/0020-rename_and_clean_state_users.ts new file mode 100644 index 000000000..39dbfa093 --- /dev/null +++ b/database/migrations/0020-rename_and_clean_state_users.ts @@ -0,0 +1,42 @@ +/* MIGRATION TO CLEAN UP AND RENAME STATE_USERS + * + * This migration renames 'state_users` to `users` + * and removes columns with no meaningful value + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // rename `state_users` table to `users` + await queryFn('RENAME TABLE `state_users` TO `users`;') + + // Remove the column `index_id` from `users`, it only contains 0 as value + await queryFn('ALTER TABLE `users` DROP COLUMN `index_id`;') + + // Remove the column `username` from `users`, it contains only '' or NULL + await queryFn('ALTER TABLE `users` DROP COLUMN `username`;') + + // Remove the column `description` from `users`, it contains only '' or NULL + await queryFn('ALTER TABLE `users` DROP COLUMN `description`;') + + // Remove the column `passphrase_shown` from `users`, it contains only 0 as value + await queryFn('ALTER TABLE `users` DROP COLUMN `passphrase_shown`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `passphrase_shown` tinyint(4) NOT NULL DEFAULT 0 AFTER `email_checked`;', + ) + await queryFn( + "ALTER TABLE `users` ADD COLUMN `description` mediumtext COLLATE utf8mb4_unicode_ci DEFAULT '' AFTER `disabled`;", + ) + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER `last_name`;', + ) + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `index_id` smallint(6) NOT NULL DEFAULT 0 AFTER `id`;', + ) + + await queryFn('RENAME TABLE `users` TO `state_users`;') +} diff --git a/database/migrations/0021-elopagebuys_fields_nullable.ts b/database/migrations/0021-elopagebuys_fields_nullable.ts new file mode 100644 index 000000000..14ba00b3a --- /dev/null +++ b/database/migrations/0021-elopagebuys_fields_nullable.ts @@ -0,0 +1,28 @@ +/* MIGRATION TO ALLOW NULL FIELDS ON ELOPAGEBUYS + * + * This migration allows null on `affiliate_program_id`, + * `publisher_id`, `order_id`. `product_id`. + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `login_elopage_buys` MODIFY COLUMN `affiliate_program_id` int(11) DEFAULT NULL;', + ) + await queryFn( + 'ALTER TABLE `login_elopage_buys` MODIFY COLUMN `publisher_id` int(11) DEFAULT NULL;', + ) + await queryFn('ALTER TABLE `login_elopage_buys` MODIFY COLUMN `order_id` int(11) DEFAULT NULL;') + await queryFn('ALTER TABLE `login_elopage_buys` MODIFY COLUMN `product_id` int(11) DEFAULT NULL;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `login_elopage_buys` MODIFY COLUMN `affiliate_program_id` int(11) NOT NULL;', + ) + await queryFn('ALTER TABLE `login_elopage_buys` MODIFY COLUMN `publisher_id` int(11) NOT NULL;') + await queryFn('ALTER TABLE `login_elopage_buys` MODIFY COLUMN `order_id` int(11) NOT NULL;') + await queryFn('ALTER TABLE `login_elopage_buys` MODIFY COLUMN `product_id` int(11) NOT NULL;') +} diff --git a/database/migrations/0022-delete_decay_start_block.ts b/database/migrations/0022-delete_decay_start_block.ts new file mode 100644 index 000000000..a31f9c441 --- /dev/null +++ b/database/migrations/0022-delete_decay_start_block.ts @@ -0,0 +1,21 @@ +/* MIGRATION TO DELETE DECAY START BLOCK + * + * the decay start block is now specified as static value + * we can delete it from the database + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Remove transactions with type 9 (start decay block). This should affect exactly 1 row + await queryFn(`DELETE FROM transactions WHERE transaction_type_id = 9;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // When rolling back an empty database this entry is newly created. This should not hurt in any way tho. + await queryFn(` + INSERT INTO transactions + VALUES(1682,9,0xC27BE999D7B4704E5F294099E780C5D6A275B165AFABFD8BECCEA39059CBB7B600000000000000000000000000000000,'','2021-05-13 15:46:31',NULL,NULL) + `) +} diff --git a/database/migrations/0023-users_disabled_soft_delete.ts b/database/migrations/0023-users_disabled_soft_delete.ts new file mode 100644 index 000000000..d85c2f019 --- /dev/null +++ b/database/migrations/0023-users_disabled_soft_delete.ts @@ -0,0 +1,29 @@ +/* MIGRATION TO IMPLEMENT SOFT DELETE ON THE USERS TABLE + * + * Replace the `disabled` column with `deletedAt` containing + * a date as it is standard for soft delete fields + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Create new `deletedAt` column + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `deletedAt` datetime DEFAULT NULL AFTER `disabled`;', + ) + + // Insert a 1.1.2022 as date for those users with `disabled=1` + await queryFn('UPDATE `users` SET `deletedAt` = "2022-01-01 00:00:00" WHERE `disabled` = 1;') + + // Delete `disabled` column + await queryFn('ALTER TABLE `users` DROP COLUMN `disabled`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `disabled` tinyint(4) NOT NULL DEFAULT 0 AFTER `deletedAt`;', + ) + await queryFn('UPDATE `users` SET `disabled` = 1 WHERE `deletedAt` IS NOT NULL;') + await queryFn('ALTER TABLE `users` DROP COLUMN `deletedAt`;') +} diff --git a/database/migrations/0024-combine_transaction_tables.ts b/database/migrations/0024-combine_transaction_tables.ts new file mode 100644 index 000000000..5b8ec8be8 --- /dev/null +++ b/database/migrations/0024-combine_transaction_tables.ts @@ -0,0 +1,128 @@ +/* MIGRATION TO COMBINE SEVERAL TRANSACTION TABLES + * + * Combine several transaction tables into one table with all data + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Create new `user_id` column (former `state_user_id`), with a temporary default of null + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `user_id` int(10) unsigned DEFAULT NULL AFTER `transaction_type_id`;', + ) + // Create new `amount` column, with a temporary default of null + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `amount` bigint(20) DEFAULT NULL AFTER `user_id`;', + ) + // Create new `creation_ident_hash` column (former `ident_hash`) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `creation_ident_hash` binary(32) DEFAULT NULL AFTER `pubkey`;', + ) + // Create new `creation_date` column (former `target_date`) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `creation_date` timestamp NULL DEFAULT NULL AFTER `creation_ident_hash`;', + ) + // Create new `send_receiver_public_key` column (former `receiver_public_key`) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `send_receiver_public_key` binary(32) DEFAULT NULL AFTER `creation_date`;', + ) + // Create new `send_receiver_user_id` column (former `receiver_user_id`) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `send_receiver_user_id` int(10) unsigned DEFAULT NULL AFTER `send_receiver_public_key`;', + ) + // Create new `send_sender_final_balance` column (former `sender_final_balance`) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `send_sender_final_balance` bigint(20) DEFAULT NULL AFTER `send_receiver_user_id`;', + ) + + // Insert Data from `transaction_creations` + await queryFn(` + UPDATE transactions + INNER JOIN transaction_creations ON transaction_creations.transaction_id = transactions.id + SET transactions.user_id = transaction_creations.state_user_id, + transactions.amount = transaction_creations.amount, + transactions.creation_ident_hash = transaction_creations.ident_hash, + transactions.creation_date = transaction_creations.target_date; + `) + + // Insert Data from `transaction_send_coins` + // Note: we drop `sender_public_key` in favor of `pubkey` from the original `transactions` table + // the data from `transaction_send_coins` seems incomplete for half the dataset (zeroed pubkey) + // with one key being different. + await queryFn(` + UPDATE transactions + INNER JOIN transaction_send_coins ON transaction_send_coins.transaction_id = transactions.id + SET transactions.user_id = transaction_send_coins.state_user_id, + transactions.amount = transaction_send_coins.amount, + transactions.send_receiver_public_key = transaction_send_coins.receiver_public_key, + transactions.send_receiver_user_id = transaction_send_coins.receiver_user_id, + transactions.send_sender_final_balance = transaction_send_coins.sender_final_balance; + `) + + // Modify defaults after our inserts + await queryFn('ALTER TABLE `transactions` MODIFY COLUMN `user_id` int(10) unsigned NOT NULL;') + await queryFn('ALTER TABLE `transactions` MODIFY COLUMN `amount` bigint(20) NOT NULL;') + + // Drop table `transaction_creations` + await queryFn('DROP TABLE `transaction_creations`;') + // Drop table `transaction_send_coins` + await queryFn('DROP TABLE `transaction_send_coins`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`transaction_send_coins\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`sender_public_key\` binary(32) NOT NULL, + \`state_user_id\` int(10) unsigned DEFAULT 0, + \`receiver_public_key\` binary(32) NOT NULL, + \`receiver_user_id\` int(10) unsigned DEFAULT 0, + \`amount\` bigint(20) NOT NULL, + \`sender_final_balance\` bigint(20) NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=659 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + CREATE TABLE \`transaction_creations\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_id\` int(10) unsigned NOT NULL, + \`state_user_id\` int(10) unsigned NOT NULL, + \`amount\` bigint(20) NOT NULL, + \`ident_hash\` binary(32) DEFAULT NULL, + \`target_date\` timestamp NULL DEFAULT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=2769 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + + await queryFn(` + INSERT INTO transaction_send_coins + ( transaction_id, sender_public_key, state_user_id, + receiver_public_key, receiver_user_id, + amount, sender_final_balance ) + ( SELECT id AS transaction_id, IF(pubkey, pubkey, 0x00000000000000000000000000000000) AS sender_public_key, user_id AS state_user_id, + send_receiver_public_key AS receiver_public_key, send_receiver_user_id AS receiver_user_id, + amount, send_sender_final_balance AS sender_final_balance + FROM transactions + WHERE transaction_type_id = 2 ); + `) + + await queryFn(` + INSERT INTO transaction_creations + ( transaction_id, state_user_id, + amount, ident_hash, target_date ) + ( SELECT id AS transaction_id, user_id AS state_user_id, + amount, creation_ident_hash AS ident_hash, creation_date AS target_date + FROM transactions + WHERE transaction_type_id = 1 ); + `) + + await queryFn('ALTER TABLE `transactions` DROP COLUMN `send_sender_final_balance`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `send_receiver_user_id`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `send_receiver_public_key`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `creation_date`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `creation_ident_hash`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `amount`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `user_id`;') +} diff --git a/database/migrations/0025-emails_to_lower.ts b/database/migrations/0025-emails_to_lower.ts new file mode 100644 index 000000000..33f085e69 --- /dev/null +++ b/database/migrations/0025-emails_to_lower.ts @@ -0,0 +1,17 @@ +/* MIGRATION TO MAKE ALL EMAILS LOWERCASE + * + * Make all `email` values in `users` lowercase. + * This allows safe queries without any modificators + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('UPDATE `users` SET `email` = LOWER(`email`);') +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // This migration cannot be revered +} diff --git a/database/migrations/0026-combine_transaction_tables2.ts b/database/migrations/0026-combine_transaction_tables2.ts new file mode 100644 index 000000000..3abf77354 --- /dev/null +++ b/database/migrations/0026-combine_transaction_tables2.ts @@ -0,0 +1,218 @@ +/* MIGRATION TO COMBINE AND REFACTOR SOME TRANSACTION TABLES + * + * Combine `state_user_transactions` and `transactions` tables. + * This changes the structure of transactions from 1 transaction for + * each send-coins to two transactions per send-coin + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + /* + * This migration has a possible incompatibility + * due to the construction of the tables. + * For our production data it works well. + * With this migration we decide for int instead of bigint + * to handle things more easily + * + * CREATE TABLE `transactions` ( + * `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + * ... + * ) + * CREATE TABLE `state_user_transactions` ( + * ... + * `transaction_id` int(10) unsigned NOT NULL, + * ... + * ) + */ + + // rename `state_user_id` to `user_id` + await queryFn('ALTER TABLE `state_user_transactions` RENAME COLUMN state_user_id TO user_id;') + // Create new `amount` column, with a temporary default of null + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `amount` bigint(20) DEFAULT NULL AFTER `transaction_type_id`;', + ) + // Create new `send_sender_final_balance` + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `send_sender_final_balance` bigint(20) DEFAULT NULL AFTER `amount`;', + ) + // Create new `memo` column, with a temporary default of null + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `memo` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL AFTER `amount`;', + ) + // Create new `received` column, with a temporary default of null + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `received` timestamp NULL DEFAULT NULL AFTER `balance_date`;', + ) + // Create new `creation_date` column + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `creation_date` timestamp NULL DEFAULT NULL AFTER `received`;', + ) + // Create new `linked_user_id` column (former `send_receiver_user_id`) + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `linked_user_id` int(10) unsigned DEFAULT NULL AFTER `creation_date`;', + ) + // Create new `linked_state_user_transaction_id` + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `linked_state_user_transaction_id` int(10) unsigned DEFAULT NULL AFTER `linked_user_id`;', + ) + // Create new `tx_hash` + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `tx_hash` binary(48) DEFAULT NULL AFTER `linked_state_user_transaction_id`;', + ) + // Create new `signature` + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `signature` binary(64) DEFAULT NULL AFTER `tx_hash`;', + ) + // Create new `pubkey` + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `pubkey` binary(32) DEFAULT NULL AFTER `signature`;', + ) + // Create new `creation_ident_hash` + await queryFn( + 'ALTER TABLE `state_user_transactions` ADD COLUMN `creation_ident_hash` binary(32) DEFAULT NULL AFTER `pubkey`;', + ) + + // Insert Data from `transactions` for creations + await queryFn(` + UPDATE state_user_transactions + LEFT JOIN transactions ON state_user_transactions.transaction_id = transactions.id + SET state_user_transactions.amount = transactions.amount, + state_user_transactions.send_sender_final_balance = transactions.send_sender_final_balance, + state_user_transactions.memo = transactions.memo, + state_user_transactions.received = transactions.received, + state_user_transactions.creation_date = transactions.creation_date, + state_user_transactions.linked_user_id = transactions.send_receiver_user_id, + state_user_transactions.linked_state_user_transaction_id = NULL, + state_user_transactions.tx_hash = transactions.tx_hash, + state_user_transactions.signature = transactions.signature, + state_user_transactions.pubkey = transactions.pubkey, + state_user_transactions.creation_ident_hash = transactions.creation_ident_hash + WHERE state_user_transactions.transaction_type_id = 1; + `) + + // Insert Data from `transactions` for sendCoin sender + await queryFn(` + UPDATE state_user_transactions + LEFT JOIN transactions ON state_user_transactions.transaction_id = transactions.id + SET state_user_transactions.amount = transactions.amount, + state_user_transactions.send_sender_final_balance = transactions.send_sender_final_balance, + state_user_transactions.memo = transactions.memo, + state_user_transactions.received = transactions.received, + state_user_transactions.creation_date = transactions.creation_date, + state_user_transactions.linked_user_id = transactions.send_receiver_user_id, + state_user_transactions.linked_state_user_transaction_id = ( + SELECT id FROM state_user_transactions AS sut + WHERE sut.transaction_type_id = 2 + AND sut.transaction_id = state_user_transactions.transaction_id + AND sut.user_id = transactions.send_receiver_user_id + ), + state_user_transactions.tx_hash = transactions.tx_hash, + state_user_transactions.signature = transactions.signature, + state_user_transactions.pubkey = transactions.pubkey, + state_user_transactions.creation_ident_hash = transactions.creation_ident_hash + WHERE state_user_transactions.transaction_type_id = 2 + AND state_user_transactions.user_id = transactions.user_id; + `) + + // Insert Data from `transactions` for sendCoin receiver + await queryFn(` + UPDATE state_user_transactions + LEFT JOIN transactions ON state_user_transactions.transaction_id = transactions.id + SET state_user_transactions.amount = transactions.amount, + state_user_transactions.send_sender_final_balance = transactions.send_sender_final_balance, + state_user_transactions.memo = transactions.memo, + state_user_transactions.received = transactions.received, + state_user_transactions.creation_date = transactions.creation_date, + state_user_transactions.linked_user_id = transactions.user_id, + state_user_transactions.linked_state_user_transaction_id = ( + SELECT id FROM state_user_transactions AS sut + WHERE sut.transaction_type_id = 2 + AND sut.transaction_id = state_user_transactions.transaction_id + AND sut.user_id = transactions.user_id + ), + state_user_transactions.tx_hash = transactions.tx_hash, + state_user_transactions.signature = transactions.signature, + state_user_transactions.pubkey = transactions.send_receiver_public_key, + state_user_transactions.creation_ident_hash = transactions.creation_ident_hash, + state_user_transactions.transaction_type_id = 3 + WHERE state_user_transactions.transaction_type_id = 2 + AND state_user_transactions.user_id = transactions.send_receiver_user_id; + `) + + // Modify defaults after our inserts + await queryFn('ALTER TABLE `state_user_transactions` MODIFY COLUMN `amount` bigint(20) NOT NULL;') + await queryFn( + 'ALTER TABLE `state_user_transactions` MODIFY COLUMN `memo` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL', + ) + await queryFn( + 'ALTER TABLE `state_user_transactions` MODIFY COLUMN `received` timestamp NOT NULL DEFAULT current_timestamp()', + ) + + // Drop table `transactions` + await queryFn('DROP TABLE `transactions`;') + + // Rename table `transaction_send_coins` to `transactions` + await queryFn('RENAME TABLE `state_user_transactions` TO `transactions`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('RENAME TABLE `transactions` TO `state_user_transactions`;') + await queryFn(`CREATE TABLE \`transactions\` ( + \`id\` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + \`transaction_type_id\` int(10) unsigned NOT NULL, + \`user_id\` int(10) unsigned NOT NULL, + \`amount\` bigint(20) NOT NULL, + \`tx_hash\` binary(48) DEFAULT NULL, + \`memo\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + \`received\` timestamp NOT NULL DEFAULT current_timestamp(), + \`signature\` binary(64) DEFAULT NULL, + \`pubkey\` binary(32) DEFAULT NULL, + \`creation_ident_hash\` binary(32) DEFAULT NULL, + \`creation_date\` timestamp NULL DEFAULT NULL, + \`send_receiver_public_key\` binary(32) DEFAULT NULL, + \`send_receiver_user_id\` int(10) unsigned DEFAULT NULL, + \`send_sender_final_balance\` bigint(20) DEFAULT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=3424 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci + `) + await queryFn(` + INSERT INTO transactions ( + id, transaction_type_id, user_id, amount, + tx_hash, memo, received, signature, pubkey, + creation_ident_hash, creation_date, + send_receiver_public_key, send_receiver_user_id, + send_sender_final_balance + ) + SELECT transaction_id AS id, transaction_type_id, + user_id, amount, tx_hash, memo, received, + signature, pubkey, creation_ident_hash, + creation_date, send_receiver_public_key, + linked_user_id AS send_receiver_user_id, + send_sender_final_balance + FROM state_user_transactions LEFT JOIN ( + SELECT id, pubkey AS send_receiver_public_key + FROM state_user_transactions AS sut + WHERE sut.transaction_type_id = 3 + ) AS sutj ON sutj.id = state_user_transactions.id + WHERE transaction_type_id IN (1,2) + `) + await queryFn( + 'UPDATE state_user_transactions SET transaction_type_id = 2 WHERE transaction_type_id = 3;', + ) + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `creation_ident_hash`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `pubkey`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `signature`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `tx_hash`;') + await queryFn( + 'ALTER TABLE `state_user_transactions` DROP COLUMN `linked_state_user_transaction_id`;', + ) + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `linked_user_id`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `creation_date`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `received`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `memo`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `send_sender_final_balance`;') + await queryFn('ALTER TABLE `state_user_transactions` DROP COLUMN `amount`;') + await queryFn('ALTER TABLE `state_user_transactions` RENAME COLUMN user_id TO state_user_id;') +} diff --git a/database/migrations/0027-clean_transaction_table.ts b/database/migrations/0027-clean_transaction_table.ts new file mode 100644 index 000000000..b5a0e0e2e --- /dev/null +++ b/database/migrations/0027-clean_transaction_table.ts @@ -0,0 +1,73 @@ +/* MIGRATION TO CLEAN THE TRANSACTION TABLE + * + * Remove several unused fields or those with duplicate data + * and rename fields to a proper name in `transactions` . + * + * This migration has data loss + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // drop column `transaction_id`, it is not needed + await queryFn('ALTER TABLE `transactions` DROP COLUMN `transaction_id`;') + // drop column `received`, it is a duplicate of balance_date + await queryFn('ALTER TABLE `transactions` DROP COLUMN `received`;') + // drop column `tx_hash`, it is not needed + await queryFn('ALTER TABLE `transactions` DROP COLUMN `tx_hash`;') + // drop column `signature`, it is not needed + await queryFn('ALTER TABLE `transactions` DROP COLUMN `signature`;') + // drop column `pubkey`, it is not needed + await queryFn('ALTER TABLE `transactions` DROP COLUMN `pubkey`;') + // drop column `creation_ident_hash`, it is not needed + await queryFn('ALTER TABLE `transactions` DROP COLUMN `creation_ident_hash`;') + + // rename `transaction_type_id` to `type_id` + await queryFn('ALTER TABLE `transactions` RENAME COLUMN transaction_type_id TO type_id;') + // rename `linked_state_user_transaction_id` to `linked_transaction_id` + await queryFn( + 'ALTER TABLE `transactions` RENAME COLUMN linked_state_user_transaction_id TO linked_transaction_id;', + ) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Not all data is recoverable here, some data is simulated, + // but we have data loss on: + // - transaction_id (we have data here, but its not the same as before) + // - tx_hash (null) + // - signature (null) + // - pubkey (null) + // - creation_ident_hash (null) + + await queryFn( + 'ALTER TABLE `transactions` RENAME COLUMN linked_transaction_id TO linked_state_user_transaction_id;', + ) + await queryFn('ALTER TABLE `transactions` RENAME COLUMN type_id TO transaction_type_id;') + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `creation_ident_hash` binary(32) DEFAULT NULL AFTER `linked_state_user_transaction_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `pubkey` binary(32) DEFAULT NULL AFTER `linked_state_user_transaction_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `signature` binary(64) DEFAULT NULL AFTER `linked_state_user_transaction_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `tx_hash` binary(48) DEFAULT NULL AFTER `linked_state_user_transaction_id`;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `received` timestamp NULL DEFAULT NULL AFTER `balance_date`;', + ) + await queryFn('UPDATE `transactions` SET `received` = `balance_date`;') + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `received` timestamp NOT NULL DEFAULT current_timestamp();', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `transaction_id` int(10) unsigned DEFAULT NULL AFTER `user_id`;', + ) + await queryFn('UPDATE `transactions` SET `transaction_id` = `id`;') + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `transaction_id` int(10) unsigned NOT NULL;', + ) +} diff --git a/database/migrations/0028-decimal_types.ts b/database/migrations/0028-decimal_types.ts new file mode 100644 index 000000000..7b158d6ee --- /dev/null +++ b/database/migrations/0028-decimal_types.ts @@ -0,0 +1,231 @@ +/* MIGRATION TO INTRODUCE THE DECIMAL TYPE + * + * This migration adds fields of type DECIMAL + * and corrects the corresponding values of + * each by recalculating the history of all + * user transactions. + * + * Furthermore it increases precision of the + * stored values and stores additional data + * points to avoid repetitive calculations. + * + * It will also add a link to the last + * transaction, creating a linked list + * + * And it will convert all timestamps to + * datetime. + * + * WARNING: This Migration must be run in TZ=UTC + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import Decimal from 'decimal.js-light' + +// Set precision value +Decimal.set({ + precision: 25, + rounding: Decimal.ROUND_HALF_UP, +}) + +const DECAY_START_TIME = new Date('2021-05-13 17:46:31') // GMT+0 + +// TODO: externalize all those definitions and functions into an external decay library +interface Decay { + balance: Decimal + decay: Decimal | null + start: Date | null + end: Date | null + duration: number | null +} + +export enum TransactionTypeId { + CREATION = 1, + SEND = 2, + RECEIVE = 3, +} + +function decayFormula(value: Decimal, seconds: number): Decimal { + return value.mul(new Decimal('0.99999997803504048973201202316767079413460520837376').pow(seconds)) +} + +function calculateDecay( + amount: Decimal, + from: Date, + to: Date, + startBlock: Date = DECAY_START_TIME, +): Decay { + const fromMs = from.getTime() + const toMs = to.getTime() + const startBlockMs = startBlock.getTime() + + if (toMs < fromMs) { + throw new Error('to < from, reverse decay calculation is invalid') + } + + // Initialize with no decay + const decay: Decay = { + balance: amount, + decay: null, + start: null, + end: null, + duration: null, + } + + // decay started after end date; no decay + if (startBlockMs > toMs) { + return decay + } + // decay started before start date; decay for full duration + if (startBlockMs < fromMs) { + decay.start = from + decay.duration = (toMs - fromMs) / 1000 + } + // decay started between start and end date; decay from decay start till end date + else { + decay.start = startBlock + decay.duration = (toMs - startBlockMs) / 1000 + } + + decay.end = to + decay.balance = decayFormula(amount, decay.duration) + decay.decay = decay.balance.minus(amount) + return decay +} + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Add Columns + + // add column `previous` for a link to the previous transaction + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `previous` int(10) unsigned DEFAULT NULL AFTER `user_id`;', + ) + // add column `dec_amount` with temporary NULL and DEFAULT NULL definition + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `dec_amount` DECIMAL(40,20) NULL DEFAULT NULL AFTER `type_id`;', + ) + // add column `dec_balance` with temporary NULL and DEFAULT NULL definition + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `dec_balance` DECIMAL(40,20) NULL DEFAULT NULL AFTER `dec_amount`;', + ) + // add new column `dec_decay` with temporary NULL and DEFAULT NULL definition + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `dec_decay` DECIMAL(40,20) NULL DEFAULT NULL AFTER `dec_balance`;', + ) + // add new column `decay_start` + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `decay_start` datetime DEFAULT NULL AFTER `dec_decay`;', + ) + + // Modify columns + + // modify date type of `balance_date` to datetime + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `balance_date` datetime NOT NULL DEFAULT current_timestamp() AFTER `dec_balance`;', + ) + // modify date type of `creation_date` to datetime + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `creation_date` datetime DEFAULT NULL AFTER `balance`;', + ) + + // Temporary columns + + // temporary decimal column `temp_dec_send_sender_final_balance` + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_send_sender_final_balance` DECIMAL(40,20) NULL DEFAULT NULL AFTER `linked_transaction_id`;', + ) + // temporary decimal column `temp_dec_diff_send_sender_final_balance` + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_diff_send_sender_final_balance` DECIMAL(40,20) NULL DEFAULT NULL AFTER `temp_dec_send_sender_final_balance`;', + ) + // temporary decimal column `temp_dec_old_balance` + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_old_balance` DECIMAL(40,20) NULL DEFAULT NULL AFTER `temp_dec_diff_send_sender_final_balance`;', + ) + // temporary decimal column `temp_dec_diff_balance` + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_diff_balance` DECIMAL(40,20) NULL DEFAULT NULL AFTER `temp_dec_old_balance`;', + ) + + // Find all users & loop over them + const users = await queryFn('SELECT user_id FROM transactions GROUP BY user_id') + for (let u = 0; u < users.length; u++) { + // find all transactions for a user + const transactions = await queryFn( + `SELECT * FROM transactions WHERE user_id = ${users[u].user_id} ORDER BY balance_date ASC;`, + ) + let previous = null + let balance = new Decimal(0) + for (let t = 0; t < transactions.length; t++) { + const transaction = transactions[t] + + // This should also fix the rounding error on amount + let decAmount = new Decimal(transaction.amount).dividedBy(10000).toDecimalPlaces(2) + if (transaction.type_id === TransactionTypeId.SEND) { + decAmount = decAmount.mul(-1) + } + const decayStartDate = previous ? previous.balance_date : transaction.balance_date + const decay = calculateDecay(balance, decayStartDate, transaction.balance_date) + // WARNING: `toISOString()` needs UTC Timezone to work properly! + const decayStart = + previous && decay.start + ? '"' + decay.start.toISOString().slice(0, 19).replace('T', ' ') + '"' + : null + balance = decay.balance.add(decAmount) + const tempDecSendSenderFinalBalance = transaction.send_sender_final_balance + ? new Decimal(transaction.send_sender_final_balance).dividedBy(10000) + : null + const tempDecDiffSendSenderFinalBalance = tempDecSendSenderFinalBalance + ? balance.minus(tempDecSendSenderFinalBalance) + : null + const tempDecOldBalance = new Decimal(transaction.balance).dividedBy(10000) + const tempDecDiffBalance = balance.minus(tempDecOldBalance) + + // Update + await queryFn(` + UPDATE transactions SET + previous = ${previous ? previous.id : null}, + dec_amount = ${decAmount.toString()}, + dec_balance = ${balance.toString()}, + dec_decay = ${decay.decay ? decay.decay.toString() : '0'}, + decay_start = ${decayStart}, + temp_dec_send_sender_final_balance = ${ + tempDecSendSenderFinalBalance ? tempDecSendSenderFinalBalance.toString() : null + }, + temp_dec_diff_send_sender_final_balance = ${ + tempDecDiffSendSenderFinalBalance ? tempDecDiffSendSenderFinalBalance.toString() : null + }, + temp_dec_old_balance = ${tempDecOldBalance.toString()}, + temp_dec_diff_balance = ${tempDecDiffBalance.toString()} + WHERE id = ${transaction.id}; + `) + + // previous + previous = transaction + } + } + + // Remove null as value & default value from `dec_amount`, `dec_balance` and `dec_decay` + await queryFn('ALTER TABLE `transactions` MODIFY COLUMN `dec_amount` DECIMAL(40,20) NOT NULL;') + await queryFn('ALTER TABLE `transactions` MODIFY COLUMN `dec_balance` DECIMAL(40,20) NOT NULL;') + await queryFn('ALTER TABLE `transactions` MODIFY COLUMN `dec_decay` DECIMAL(40,20) NOT NULL;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_diff_balance`') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_old_balance`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_diff_send_sender_final_balance`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_send_sender_final_balance`;') + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `creation_date` timestamp NULL DEFAULT NULL AFTER `balance`;', + ) + await queryFn( + 'ALTER TABLE `transactions` MODIFY COLUMN `balance_date` timestamp NOT NULL DEFAULT current_timestamp() AFTER `dec_balance`;', + ) + await queryFn('ALTER TABLE `transactions` DROP COLUMN `decay_start`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `dec_decay`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `dec_balance`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `dec_amount`;') + await queryFn('ALTER TABLE `transactions` DROP COLUMN `previous`;') +} diff --git a/database/migrations/0029-clean_transaction_table.ts b/database/migrations/0029-clean_transaction_table.ts new file mode 100644 index 000000000..0b9e2cc0d --- /dev/null +++ b/database/migrations/0029-clean_transaction_table.ts @@ -0,0 +1,105 @@ +/* MIGRATION TO CLEAN THE TRANSACTION TABLE + * + * This migration deletes and renames several + * columns of the `transactions` table. + * + * This migration has data loss + */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Delete columns + + // delete column `amount` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `amount`;') + // delete column `send_sender_final_balance` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `send_sender_final_balance`;') + // delete column `balance` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `balance`;') + // delete column `temp_dec_send_sender_final_balance` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_send_sender_final_balance`;') + // delete column `temp_dec_diff_send_sender_final_balance` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_diff_send_sender_final_balance`;') + // delete column `temp_dec_old_balance` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_old_balance`;') + // delete column `temp_dec_diff_balance` + await queryFn('ALTER TABLE `transactions` DROP COLUMN `temp_dec_diff_balance`;') + + // Rename columns + + // rename column `dec_amount` to `amount` + await queryFn('ALTER TABLE `transactions` RENAME COLUMN `dec_amount` to `amount`;') + + // rename column `dec_balance` to `balance` + await queryFn('ALTER TABLE `transactions` RENAME COLUMN `dec_balance` to `balance`;') + + // rename column `dec_decay` to `decay` + await queryFn('ALTER TABLE `transactions` RENAME COLUMN `dec_decay` to `decay`;') + + // Drop tables + + // drop `state_balances` + await queryFn('DROP TABLE `state_balances`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Not all data is recoverable here, this data is simulated, + // We lose all incorrect balances and wrongly rounded amounts. + + await queryFn(` + CREATE TABLE \`state_balances\` ( + \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, + \`state_user_id\` int(10) unsigned NOT NULL, + \`modified\` datetime NOT NULL, + \`record_date\` datetime DEFAULT NULL, + \`amount\` bigint(20) NOT NULL, + PRIMARY KEY (\`id\`) + ) ENGINE=InnoDB AUTO_INCREMENT=568 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) + await queryFn(` + INSERT INTO \`state_balances\` + (state_user_id, modified, record_date, amount) + SELECT user_id as state_user_id, balance_date as modified, balance_date as record_date, amount * 10000 as amount FROM + (SELECT user_id as uid, MAX(balance_date) AS date FROM transactions GROUP BY uid) AS t + LEFT JOIN transactions ON t.uid = transactions.user_id AND t.date = transactions.balance_date; + `) + + await queryFn('ALTER TABLE `transactions` RENAME COLUMN `decay` to `dec_decay`;') + await queryFn('ALTER TABLE `transactions` RENAME COLUMN `balance` to `dec_balance`;') + await queryFn('ALTER TABLE `transactions` RENAME COLUMN `amount` to `dec_amount`;') + + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_diff_balance` decimal(40,20) DEFAULT NULL AFTER linked_transaction_id;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_old_balance` decimal(40,20) DEFAULT NULL AFTER linked_transaction_id;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_diff_send_sender_final_balance` decimal(40,20) DEFAULT NULL AFTER linked_transaction_id;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `temp_dec_send_sender_final_balance` decimal(40,20) DEFAULT NULL AFTER linked_transaction_id;', + ) + await queryFn('ALTER TABLE `transactions` ADD COLUMN `balance` bigint(20) DEFAULT 0 AFTER memo;') + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `send_sender_final_balance` bigint(20) DEFAULT NULL AFTER memo;', + ) + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `amount` bigint(20) DEFAULT NULL AFTER decay_start;', + ) + + await queryFn(` + UPDATE transactions SET + temp_dec_diff_balance = 0, + temp_dec_old_balance = dec_balance, + temp_dec_diff_send_sender_final_balance = 0, + temp_dec_send_sender_final_balance = dec_balance, + balance = dec_balance * 10000, + send_sender_final_balance = dec_balance * 10000, + amount = dec_amount * 10000; + `) + + await queryFn('ALTER TABLE `transactions` MODIFY COLUMN `amount` bigint(20) NOT NULL;') +} diff --git a/database/migrations/0030-transaction_link.ts b/database/migrations/0030-transaction_link.ts new file mode 100644 index 000000000..ee76c980d --- /dev/null +++ b/database/migrations/0030-transaction_link.ts @@ -0,0 +1,28 @@ +/* MIGRATION TO CREATE TRANSACTION_LINK TABLE */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`transaction_links\` ( + \`id\` int UNSIGNED NOT NULL AUTO_INCREMENT, + \`userId\` int UNSIGNED NOT NULL, + \`amount\` DECIMAL(40,20) NOT NULL, + \`hold_available_amount\` DECIMAL(40,20) NOT NULL, + \`memo\` varchar(255) NOT NULL, + \`code\` varchar(24) NOT NULL, + \`createdAt\` datetime NOT NULL, + \`deletedAt\` datetime DEFAULT NULL, + \`validUntil\` datetime NOT NULL, + \`showEmail\` boolean NOT NULL DEFAULT false, + \`redeemedAt\` datetime, + \`redeemedBy\` int UNSIGNED, + PRIMARY KEY (\`id\`) + ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + `) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE \`transaction_links\`;`) +} diff --git a/database/migrations/0031-remove_sendEmail_from_transaction_link.ts b/database/migrations/0031-remove_sendEmail_from_transaction_link.ts new file mode 100644 index 000000000..76b2ee742 --- /dev/null +++ b/database/migrations/0031-remove_sendEmail_from_transaction_link.ts @@ -0,0 +1,14 @@ +/* MIGRATION TO REMOVE sendEmail FIELD FROM TRANSACTION_LINK TABLE */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('ALTER TABLE `transaction_links` DROP COLUMN `showEmail`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `transaction_links` ADD COLUMN `showEmail` boolean NOT NULL DEFAULT false AFTER `validUntil`;', + ) +} diff --git a/database/migrations/0032-add-transaction-link-to-transaction.ts b/database/migrations/0032-add-transaction-link-to-transaction.ts new file mode 100644 index 000000000..79cdf195a --- /dev/null +++ b/database/migrations/0032-add-transaction-link-to-transaction.ts @@ -0,0 +1,14 @@ +/* MIGRATION TO ADD transactionLinkId FIELDTO TRANSACTION */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `transactions` ADD COLUMN `transaction_link_id` int UNSIGNED DEFAULT NULL AFTER `linked_transaction_id`;', + ) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('ALTER TABLE `transactions` DROP COLUMN `transaction_link_id`;') +} diff --git a/database/migrations/0033-add_referrer_id.ts b/database/migrations/0033-add_referrer_id.ts new file mode 100644 index 000000000..e45d1faf7 --- /dev/null +++ b/database/migrations/0033-add_referrer_id.ts @@ -0,0 +1,14 @@ +/* MIGRATION TO ADD referrer_id FIELD TO users */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `referrer_id` int UNSIGNED DEFAULT NULL AFTER `language`;', + ) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('ALTER TABLE `users` DROP COLUMN `referrer_id`;') +} diff --git a/database/package.json b/database/package.json index 515fbcd74..d4b247082 100644 --- a/database/package.json +++ b/database/package.json @@ -1,6 +1,6 @@ { "name": "gradido-database", - "version": "0.0.1", + "version": "1.6.6", "description": "Gradido Database Tool to execute database migrations", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/database", @@ -8,17 +8,17 @@ "license": "MIT", "private": false, "scripts": { - "build": "tsc --build", + "build": "mkdir -p build/src/config/ && cp src/config/*.txt build/src/config/ && tsc --build", "clean": "tsc --build --clean", - "up": "node build/src/index.js up", - "down": "node build/src/index.js down", - "reset": "node build/src/index.js reset", - "dev_up": "ts-node src/index.ts up", - "dev_down": "ts-node src/index.ts down", - "dev_reset": "ts-node src/index.ts reset", - "lint": "eslint . --ext .js,.ts", + "up": "TZ=UTC node build/src/index.js up", + "down": "TZ=UTC node build/src/index.js down", + "reset": "TZ=UTC node build/src/index.js reset", + "dev_up": "TZ=UTC ts-node src/index.ts up", + "dev_down": "TZ=UTC ts-node src/index.ts down", + "dev_reset": "TZ=UTC ts-node src/index.ts reset", + "lint": "eslint --max-warnings=0 --ext .js,.ts .", "seed:config": "ts-node ./node_modules/typeorm-seeding/dist/cli.js config", - "seed": "ts-node src/index.ts seed" + "seed": "TZ=UTC ts-node src/index.ts seed" }, "devDependencies": { "@types/faker": "^5.5.9", @@ -38,6 +38,7 @@ }, "dependencies": { "crypto": "^1.0.1", + "decimal.js-light": "^2.5.1", "dotenv": "^10.0.0", "faker": "^5.5.3", "mysql2": "^2.3.0", diff --git a/database/src/config/index.ts b/database/src/config/index.ts index 2dde06c96..ba41f11d4 100644 --- a/database/src/config/index.ts +++ b/database/src/config/index.ts @@ -3,6 +3,14 @@ import dotenv from 'dotenv' dotenv.config() +const constants = { + CONFIG_VERSION: { + DEFAULT: 'DEFAULT', + EXPECTED: 'v1.2022-03-18', + CURRENT: '', + }, +} + const database = { DB_HOST: process.env.DB_HOST || 'localhost', DB_PORT: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 3306, @@ -15,6 +23,18 @@ const migrations = { MIGRATIONS_TABLE: process.env.MIGRATIONS_TABLE || 'migrations', } -const CONFIG = { ...database, ...migrations } +// Check config version +constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION || constants.CONFIG_VERSION.DEFAULT +if ( + ![constants.CONFIG_VERSION.EXPECTED, constants.CONFIG_VERSION.DEFAULT].includes( + constants.CONFIG_VERSION.CURRENT, + ) +) { + throw new Error( + `Fatal: Config Version incorrect - expected "${constants.CONFIG_VERSION.EXPECTED}" or "${constants.CONFIG_VERSION.DEFAULT}", but found "${constants.CONFIG_VERSION.CURRENT}"`, + ) +} + +const CONFIG = { ...constants, ...database, ...migrations } export default CONFIG diff --git a/database/src/config/mnemonic.uncompressed_buffer13116.txt b/database/src/config/mnemonic.uncompressed_buffer13116.txt new file mode 100644 index 000000000..8eceb1e2f --- /dev/null +++ b/database/src/config/mnemonic.uncompressed_buffer13116.txt @@ -0,0 +1 @@ +abandon,ability,able,about,above,absent,absorb,abstract,absurd,abuse,access,accident,account,accuse,achieve,acid,acoustic,acquire,across,act,action,actor,actress,actual,adapt,add,addict,address,adjust,admit,adult,advance,advice,aerobic,affair,afford,afraid,again,age,agent,agree,ahead,aim,air,airport,aisle,alarm,album,alcohol,alert,alien,all,alley,allow,almost,alone,alpha,already,also,alter,always,amateur,amazing,among,amount,amused,analyst,anchor,ancient,anger,angle,angry,animal,ankle,announce,annual,another,answer,antenna,antique,anxiety,any,apart,apology,appear,apple,approve,april,arch,arctic,area,arena,argue,arm,armed,armor,army,around,arrange,arrest,arrive,arrow,art,artefact,artist,artwork,ask,aspect,assault,asset,assist,assume,asthma,athlete,atom,attack,attend,attitude,attract,auction,audit,august,aunt,author,auto,autumn,average,avocado,avoid,awake,aware,away,awesome,awful,awkward,axis,baby,bachelor,bacon,badge,bag,balance,balcony,ball,bamboo,banana,banner,bar,barely,bargain,barrel,base,basic,basket,battle,beach,bean,beauty,because,become,beef,before,begin,behave,behind,believe,below,belt,bench,benefit,best,betray,better,between,beyond,bicycle,bid,bike,bind,biology,bird,birth,bitter,black,blade,blame,blanket,blast,bleak,bless,blind,blood,blossom,blouse,blue,blur,blush,board,boat,body,boil,bomb,bone,bonus,book,boost,border,boring,borrow,boss,bottom,bounce,box,boy,bracket,brain,brand,brass,brave,bread,breeze,brick,bridge,brief,bright,bring,brisk,broccoli,broken,bronze,broom,brother,brown,brush,bubble,buddy,budget,buffalo,build,bulb,bulk,bullet,bundle,bunker,burden,burger,burst,bus,business,busy,butter,buyer,buzz,cabbage,cabin,cable,cactus,cage,cake,call,calm,camera,camp,can,canal,cancel,candy,cannon,canoe,canvas,canyon,capable,capital,captain,car,carbon,card,cargo,carpet,carry,cart,case,cash,casino,castle,casual,cat,catalog,catch,category,cattle,caught,cause,caution,cave,ceiling,celery,cement,census,century,cereal,certain,chair,chalk,champion,change,chaos,chapter,charge,chase,chat,cheap,check,cheese,chef,cherry,chest,chicken,chief,child,chimney,choice,choose,chronic,chuckle,chunk,churn,cigar,cinnamon,circle,citizen,city,civil,claim,clap,clarify,claw,clay,clean,clerk,clever,click,client,cliff,climb,clinic,clip,clock,clog,close,cloth,cloud,clown,club,clump,cluster,clutch,coach,coast,coconut,code,coffee,coil,coin,collect,color,column,combine,come,comfort,comic,common,company,concert,conduct,confirm,congress,connect,consider,control,convince,cook,cool,copper,copy,coral,core,corn,correct,cost,cotton,couch,country,couple,course,cousin,cover,coyote,crack,cradle,craft,cram,crane,crash,crater,crawl,crazy,cream,credit,creek,crew,cricket,crime,crisp,critic,crop,cross,crouch,crowd,crucial,cruel,cruise,crumble,crunch,crush,cry,crystal,cube,culture,cup,cupboard,curious,current,curtain,curve,cushion,custom,cute,cycle,dad,damage,damp,dance,danger,daring,dash,daughter,dawn,day,deal,debate,debris,decade,december,decide,decline,decorate,decrease,deer,defense,define,defy,degree,delay,deliver,demand,demise,denial,dentist,deny,depart,depend,deposit,depth,deputy,derive,describe,desert,design,desk,despair,destroy,detail,detect,develop,device,devote,diagram,dial,diamond,diary,dice,diesel,diet,differ,digital,dignity,dilemma,dinner,dinosaur,direct,dirt,disagree,discover,disease,dish,dismiss,disorder,display,distance,divert,divide,divorce,dizzy,doctor,document,dog,doll,dolphin,domain,donate,donkey,donor,door,dose,double,dove,draft,dragon,drama,drastic,draw,dream,dress,drift,drill,drink,drip,drive,drop,drum,dry,duck,dumb,dune,during,dust,dutch,duty,dwarf,dynamic,eager,eagle,early,earn,earth,easily,east,easy,echo,ecology,economy,edge,edit,educate,effort,egg,eight,either,elbow,elder,electric,elegant,element,elephant,elevator,elite,else,embark,embody,embrace,emerge,emotion,employ,empower,empty,enable,enact,end,endless,endorse,enemy,energy,enforce,engage,engine,enhance,enjoy,enlist,enough,enrich,enroll,ensure,enter,entire,entry,envelope,episode,equal,equip,era,erase,erode,erosion,error,erupt,escape,essay,essence,estate,eternal,ethics,evidence,evil,evoke,evolve,exact,example,excess,exchange,excite,exclude,excuse,execute,exercise,exhaust,exhibit,exile,exist,exit,exotic,expand,expect,expire,explain,expose,express,extend,extra,eye,eyebrow,fabric,face,faculty,fade,faint,faith,fall,false,fame,family,famous,fan,fancy,fantasy,farm,fashion,fat,fatal,father,fatigue,fault,favorite,feature,february,federal,fee,feed,feel,female,fence,festival,fetch,fever,few,fiber,fiction,field,figure,file,film,filter,final,find,fine,finger,finish,fire,firm,first,fiscal,fish,fit,fitness,fix,flag,flame,flash,flat,flavor,flee,flight,flip,float,flock,floor,flower,fluid,flush,fly,foam,focus,fog,foil,fold,follow,food,foot,force,forest,forget,fork,fortune,forum,forward,fossil,foster,found,fox,fragile,frame,frequent,fresh,friend,fringe,frog,front,frost,frown,frozen,fruit,fuel,fun,funny,furnace,fury,future,gadget,gain,galaxy,gallery,game,gap,garage,garbage,garden,garlic,garment,gas,gasp,gate,gather,gauge,gaze,general,genius,genre,gentle,genuine,gesture,ghost,giant,gift,giggle,ginger,giraffe,girl,give,glad,glance,glare,glass,glide,glimpse,globe,gloom,glory,glove,glow,glue,goat,goddess,gold,good,goose,gorilla,gospel,gossip,govern,gown,grab,grace,grain,grant,grape,grass,gravity,great,green,grid,grief,grit,grocery,group,grow,grunt,guard,guess,guide,guilt,guitar,gun,gym,habit,hair,half,hammer,hamster,hand,happy,harbor,hard,harsh,harvest,hat,have,hawk,hazard,head,health,heart,heavy,hedgehog,height,hello,helmet,help,hen,hero,hidden,high,hill,hint,hip,hire,history,hobby,hockey,hold,hole,holiday,hollow,home,honey,hood,hope,horn,horror,horse,hospital,host,hotel,hour,hover,hub,huge,human,humble,humor,hundred,hungry,hunt,hurdle,hurry,hurt,husband,hybrid,ice,icon,idea,identify,idle,ignore,ill,illegal,illness,image,imitate,immense,immune,impact,impose,improve,impulse,inch,include,income,increase,index,indicate,indoor,industry,infant,inflict,inform,inhale,inherit,initial,inject,injury,inmate,inner,innocent,input,inquiry,insane,insect,inside,inspire,install,intact,interest,into,invest,invite,involve,iron,island,isolate,issue,item,ivory,jacket,jaguar,jar,jazz,jealous,jeans,jelly,jewel,job,join,joke,journey,joy,judge,juice,jump,jungle,junior,junk,just,kangaroo,keen,keep,ketchup,key,kick,kid,kidney,kind,kingdom,kiss,kit,kitchen,kite,kitten,kiwi,knee,knife,knock,know,lab,label,labor,ladder,lady,lake,lamp,language,laptop,large,later,latin,laugh,laundry,lava,law,lawn,lawsuit,layer,lazy,leader,leaf,learn,leave,lecture,left,leg,legal,legend,leisure,lemon,lend,length,lens,leopard,lesson,letter,level,liar,liberty,library,license,life,lift,light,like,limb,limit,link,lion,liquid,list,little,live,lizard,load,loan,lobster,local,lock,logic,lonely,long,loop,lottery,loud,lounge,love,loyal,lucky,luggage,lumber,lunar,lunch,luxury,lyrics,machine,mad,magic,magnet,maid,mail,main,major,make,mammal,man,manage,mandate,mango,mansion,manual,maple,marble,march,margin,marine,market,marriage,mask,mass,master,match,material,math,matrix,matter,maximum,maze,meadow,mean,measure,meat,mechanic,medal,media,melody,melt,member,memory,mention,menu,mercy,merge,merit,merry,mesh,message,metal,method,middle,midnight,milk,million,mimic,mind,minimum,minor,minute,miracle,mirror,misery,miss,mistake,mix,mixed,mixture,mobile,model,modify,mom,moment,monitor,monkey,monster,month,moon,moral,more,morning,mosquito,mother,motion,motor,mountain,mouse,move,movie,much,muffin,mule,multiply,muscle,museum,mushroom,music,must,mutual,myself,mystery,myth,naive,name,napkin,narrow,nasty,nation,nature,near,neck,need,negative,neglect,neither,nephew,nerve,nest,net,network,neutral,never,news,next,nice,night,noble,noise,nominee,noodle,normal,north,nose,notable,note,nothing,notice,novel,now,nuclear,number,nurse,nut,oak,obey,object,oblige,obscure,observe,obtain,obvious,occur,ocean,october,odor,off,offer,office,often,oil,okay,old,olive,olympic,omit,once,one,onion,online,only,open,opera,opinion,oppose,option,orange,orbit,orchard,order,ordinary,organ,orient,original,orphan,ostrich,other,outdoor,outer,output,outside,oval,oven,over,own,owner,oxygen,oyster,ozone,pact,paddle,page,pair,palace,palm,panda,panel,panic,panther,paper,parade,parent,park,parrot,party,pass,patch,path,patient,patrol,pattern,pause,pave,payment,peace,peanut,pear,peasant,pelican,pen,penalty,pencil,people,pepper,perfect,permit,person,pet,phone,photo,phrase,physical,piano,picnic,picture,piece,pig,pigeon,pill,pilot,pink,pioneer,pipe,pistol,pitch,pizza,place,planet,plastic,plate,play,please,pledge,pluck,plug,plunge,poem,poet,point,polar,pole,police,pond,pony,pool,popular,portion,position,possible,post,potato,pottery,poverty,powder,power,practice,praise,predict,prefer,prepare,present,pretty,prevent,price,pride,primary,print,priority,prison,private,prize,problem,process,produce,profit,program,project,promote,proof,property,prosper,protect,proud,provide,public,pudding,pull,pulp,pulse,pumpkin,punch,pupil,puppy,purchase,purity,purpose,purse,push,put,puzzle,pyramid,quality,quantum,quarter,question,quick,quit,quiz,quote,rabbit,raccoon,race,rack,radar,radio,rail,rain,raise,rally,ramp,ranch,random,range,rapid,rare,rate,rather,raven,raw,razor,ready,real,reason,rebel,rebuild,recall,receive,recipe,record,recycle,reduce,reflect,reform,refuse,region,regret,regular,reject,relax,release,relief,rely,remain,remember,remind,remove,render,renew,rent,reopen,repair,repeat,replace,report,require,rescue,resemble,resist,resource,response,result,retire,retreat,return,reunion,reveal,review,reward,rhythm,rib,ribbon,rice,rich,ride,ridge,rifle,right,rigid,ring,riot,ripple,risk,ritual,rival,river,road,roast,robot,robust,rocket,romance,roof,rookie,room,rose,rotate,rough,round,route,royal,rubber,rude,rug,rule,run,runway,rural,sad,saddle,sadness,safe,sail,salad,salmon,salon,salt,salute,same,sample,sand,satisfy,satoshi,sauce,sausage,save,say,scale,scan,scare,scatter,scene,scheme,school,science,scissors,scorpion,scout,scrap,screen,script,scrub,sea,search,season,seat,second,secret,section,security,seed,seek,segment,select,sell,seminar,senior,sense,sentence,series,service,session,settle,setup,seven,shadow,shaft,shallow,share,shed,shell,sheriff,shield,shift,shine,ship,shiver,shock,shoe,shoot,shop,short,shoulder,shove,shrimp,shrug,shuffle,shy,sibling,sick,side,siege,sight,sign,silent,silk,silly,silver,similar,simple,since,sing,siren,sister,situate,six,size,skate,sketch,ski,skill,skin,skirt,skull,slab,slam,sleep,slender,slice,slide,slight,slim,slogan,slot,slow,slush,small,smart,smile,smoke,smooth,snack,snake,snap,sniff,snow,soap,soccer,social,sock,soda,soft,solar,soldier,solid,solution,solve,someone,song,soon,sorry,sort,soul,sound,soup,source,south,space,spare,spatial,spawn,speak,special,speed,spell,spend,sphere,spice,spider,spike,spin,spirit,split,spoil,sponsor,spoon,sport,spot,spray,spread,spring,spy,square,squeeze,squirrel,stable,stadium,staff,stage,stairs,stamp,stand,start,state,stay,steak,steel,stem,step,stereo,stick,still,sting,stock,stomach,stone,stool,story,stove,strategy,street,strike,strong,struggle,student,stuff,stumble,style,subject,submit,subway,success,such,sudden,suffer,sugar,suggest,suit,summer,sun,sunny,sunset,super,supply,supreme,sure,surface,surge,surprise,surround,survey,suspect,sustain,swallow,swamp,swap,swarm,swear,sweet,swift,swim,swing,switch,sword,symbol,symptom,syrup,system,table,tackle,tag,tail,talent,talk,tank,tape,target,task,taste,tattoo,taxi,teach,team,tell,ten,tenant,tennis,tent,term,test,text,thank,that,theme,then,theory,there,they,thing,this,thought,three,thrive,throw,thumb,thunder,ticket,tide,tiger,tilt,timber,time,tiny,tip,tired,tissue,title,toast,tobacco,today,toddler,toe,together,toilet,token,tomato,tomorrow,tone,tongue,tonight,tool,tooth,top,topic,topple,torch,tornado,tortoise,toss,total,tourist,toward,tower,town,toy,track,trade,traffic,tragic,train,transfer,trap,trash,travel,tray,treat,tree,trend,trial,tribe,trick,trigger,trim,trip,trophy,trouble,truck,true,truly,trumpet,trust,truth,try,tube,tuition,tumble,tuna,tunnel,turkey,turn,turtle,twelve,twenty,twice,twin,twist,two,type,typical,ugly,umbrella,unable,unaware,uncle,uncover,under,undo,unfair,unfold,unhappy,uniform,unique,unit,universe,unknown,unlock,until,unusual,unveil,update,upgrade,uphold,upon,upper,upset,urban,urge,usage,use,used,useful,useless,usual,utility,vacant,vacuum,vague,valid,valley,valve,van,vanish,vapor,various,vast,vault,vehicle,velvet,vendor,venture,venue,verb,verify,version,very,vessel,veteran,viable,vibrant,vicious,victory,video,view,village,vintage,violin,virtual,virus,visa,visit,visual,vital,vivid,vocal,voice,void,volcano,volume,vote,voyage,wage,wagon,wait,walk,wall,walnut,want,warfare,warm,warrior,wash,wasp,waste,water,wave,way,wealth,weapon,wear,weasel,weather,web,wedding,weekend,weird,welcome,west,wet,whale,what,wheat,wheel,when,where,whip,whisper,wide,width,wife,wild,will,win,window,wine,wing,wink,winner,winter,wire,wisdom,wise,wish,witness,wolf,woman,wonder,wood,wool,word,work,world,worry,worth,wrap,wreck,wrestle,wrist,write,wrong,yard,year,yellow,you,young,youth,zebra,zero,zone,zoo, \ No newline at end of file diff --git a/database/src/config/mnemonic.uncompressed_buffer18112.txt b/database/src/config/mnemonic.uncompressed_buffer18112.txt new file mode 100644 index 000000000..20dad2b08 --- /dev/null +++ b/database/src/config/mnemonic.uncompressed_buffer18112.txt @@ -0,0 +1 @@ +Ecke,König,Zunächst,Fiat,Raum,darf,Hannes,Anwalt,persönlich,Abstand,erlaubt,jammern,debatte,Winter,Definition,sich,kostenlos,Flutwelle,Land,Demografisch,Darlehen,englisch,lokal,epochal,Ewig,abzahlen,ersten,Übel,Ladung,reif,Gedanke,vernachlässigt,sondern,pathologisch,gezwungen,kennen,fundamental,Ursprünglich,Monster,haft,online,Realisierung,blubbern,Vorfall,Derartig,zuschauen,leiten,Loch,mord,Hühner,dass,euer,Boden,bezwingen,Lizenz,Initiative,edle,solch,toast,Element,frei,Woran,Preis,Cäsar,erzählen,Disziplin,Dollar,Phänomen,Forum,stetig,Gerhard,Betätigung,einbringen,fassen,notdurft,anheben,Seerose,Quelle,liebevoll,Software,Weise,sieht,August,studieren,soweit,essen,unmittelbar,prüfen,Heinrich,ergänzen,Atom,höchste,meldete,fuhr,effektiv,explizit,nichtkommerziell,ernähren,Pest,ökologische,zehren,reduzieren,meiner,Lage,Mitwirkender,Hähnchen,Hugo,Auswirkung,Brief,fair,stärken,Ideologie,Klasse,Binnenland,clever,beantworten,Seegras,iran,wollen,Abriss,für,abschreiben,Vogel,erarbeiten,benutzt,vertieft,pendeln,Spekulation,bevölkern,schmackhaft,Strickmuster,Historiker,wieso,fließen,geruch,Fondue,Handel,speichern,Anbau,Häuser,drohen,Lehrer,Zugang,Sanktion,Nebensitzer,ergibt,Anbeginn,dringend,Erdöl,Schatten,Gift,gewusst,Quartett,signifikant,genug,Robert,mehr,Fichte,aufrecht,Traum,Meer,Warum,doch,Ferrari,annimmt,heißen,Wiederherstellung,Franz,spüren,Sympathie,gewehrt,gedeckt,Auflage,Benzin,sowohl,gefunden,zynisch,Meile,Villa,Ding,Wohlstand,Celsius,Aspekt,aktuell,beispiellos,gebaut,Haar,Objektivität,womöglich,Senioren,Elster,Ausatmen,fiel,Zoologe,Sanierung,Terminologie,Hütte,Kurt,Wikipedia,unbewusst,beziffern,Blödsinn,bestimmt,behaupten,Branche,Asche,Ausland,Abhängigkeit,Deshalb,abwechslungsreich,Geteilt,wenig,Foto,Papst,ahnen,Anziehung,Endpreis,teuer,Territorium,Maßstab,fungieren,Premiere,Fehler,willkommen,gerade,reagieren,kommt,subventionieren,Spezial,Bibel,gelohnt,parallel,lateinisch,Kauf,erforderlich,unkonventionell,ehrgeizig,gravierend,Feder,unübersichtlich,physisch,ideal,Erfüllung,dürfen,Mitspieler,einig,exemplarisch,niemand,seil,Zeichner,eisern,ankaufen,Slums,Sorte,Dank,Kampf,Luftfahrt,dezentral,Kapazität,Referat,Opfer,manipulierbar,auskommen,Form,decken,Zwang,sind,Brasilien,Lebzeiten,bietet,comedy,gutwillig,Tausend,aufbauen,Einseitig,geklappt,müde,Affe,losgelöst,Albert,Fenchel,Menü,Wucht,Erfahrung,besser,sensibilisieren,Ausführung,Richtung,architektur,Begegnung,sägemehl,Mama,zugänglich,horchen,Zahnersatz,erdacht,Weiblich,Guido,Rolle,Ehre,Hanf,Ordnung,Flotte,Samstag,Gebrauchsanweisung,Fläche,beurteilen,Gepflogenheit,Silbe,unausweichlich,Datenbank,Journalist,Priorität,Helene,Ahnung,Lösung,Sprung,Margret,Erbe,Africa,stört,dermaßen,Wertschätzung,Idee,uralt,Null,Mitleidenschaft,Praxis,Technologie,notfalls,Projekt,geübt,Nina,Brot,unfair,Angst,heben,allgemein,beglücken,werben,Nektar,günstig,unerlässlich,Orchester,Messbar,griechisch,Maus,fünf,zurzeit,sozusagen,dazwischen,Computer,spontan,Einleitung,Urwissen,acht,angreifen,tapfer,ehrt,derjenige,Hubert,divers,Wörtchen,ausüben,indem,hervor,missionieren,beeinflussen,einher,unter,Himmel,virtuell,indigene,darin,relativ,zumindest,reißen,gegenseitig,futsch,Reihenhaus,Wurzel,geehrt,Umschwung,Obst,Jasmin,reiten,gedruckt,Bausparkasse,Eindeutig,honorieren,leihen,Ausgleich,laden,dran,verändern,väterlich,nächsten,nannte,anfangen,Innerhalb,praktisch,zukunftsfähig,Frau,senden,desto,Senf,Eduard,Arabisch,identisch,Obsoleszenz,Name,Emotion,psychologisch,Buch,insgesamt,Esoterik,Flügel,unruhig,Mechanismus,neueste,Wandel,naiv,klettern,befreien,Salvador,stoßen,beißen,treiben,stolz,Kriminalität,beibringen,ablegen,bequem,benachbart,Absicht,Ülzen,angleichen,merken,beruhen,Abendessen,auftreten,Thomas,Unheil,Fleisch,jüngeren,behindern,Glanz,Frieden,korrigieren,Zeug,restlich,evolutionär,Umdrehung,Wild,Gesellschaft,Elend,fallen,Feld,erklärt,gekürzt,derselbe,skeptisch,toll,Sanft,einpendeln,Tomate,Humorist,wofür,garantiert,Hülle,Hirsch,Summe,zugleich,umfangreich,Garnele,Mutter,sinken,Arzt,religiös,Versorgung,Dung,Umsatz,ernst,autistisch,Symbol,riesig,Ozean,athletisch,perfekt,Duft,Gruppe,Atemlos,Regal,Eier,Smartphone,anzuwenden,lüften,Hinblick,fiktiv,einräumen,Stockwerk,Last,gekommen,hergestellt,Fortschritt,regulieren,Inflation,Zimmerleute,genmanipuliert,müssen,gilt,geworden,Staunen,Ungarn,Mobbing,lecker,Philosoph,bunkern,Müll,besucht,Feier,Damit,Komponist,Hobby,unsere,Guthaben,echt,junge,Georg,belastbar,wann,Daunen,Gott,Tradition,Griff,pure,Trennung,These,kollektiv,Ansatz,pfiffig,Theologe,Stufenplan,Urmutter,einnehmen,Miesmacher,sammeln,unendlich,sechzehn,Seminar,erwerben,Vergänglichkeit,Mitarbeiter,ging,rotieren,Jäger,Eden,Mädchen,Importgüter,sahne,Züge,Baum,spannend,Ebene,beteiligen,kassieren,Dogma,Eigentum,Wussten,Eleganz,Artikel,zukommen,fordern,Fluss,Szene,Meier,toxisch,proportional,Ferienjob,Basis,Tokio,erhielten,Flur,Impressum,Vorbild,heutige,Horde,Mangel,Igor,wagnis,Hase,hingen,belügen,Bauweise,getätigt,Waage,Allen,Hell,Mitmensch,Jeder,verursacht,weder,strukturell,hören,Grenze,Mietshaus,Wozu,fast,verwirklichen,eignen,Qualität,Schriftsteller,unproduktiv,Lunge,werfen,Mystisch,Rohstoff,umkämpft,Spuk,Hallo,Auerhahn,glasklar,Verfütterung,Konzept,bekloppt,taten,Beachtung,Goethe,Horoskop,benennen,hielt,später,Krieg,Impuls,Absatzmarkt,metaphorisch,Tatsache,Dorf,Mahlzeit,Gerüch,Flasche,Strom,Offen,geblieben,genügend,hast,geformt,Rangordnung,Räuber,machbar,Kluft,intakt,segensreich,Herkunft,getauft,zusätzlich,Haupt,Honig,Annahme,Theater,Kunst,nostalgischen,begünstigen,musizieren,Bach,Vorschlag,Weglassen,halten,Menge,früh,verdeckt,erwähnen,Test,Revolution,existenzbedrohend,abrupt,Farbe,Migrant,Gnade,quasi,vorhanden,nennt,zögern,David,Bekommen,superreich,erwarten,bezeichnet,monumental,Henry,jedoch,lernen,Urzustand,Rahmen,auferlegen,Foliant,Daimler,einmal,Fernseher,meisten,Bund,werden,quälen,wobei,Radfahrer,Beitrag,Katze,zwitschern,ignorieren,Deutschland,Selbstregulierend,Welle,ungünstig,Phase,geeignet,akkumulieren,Harmonie,Crash,Koordination,christlich,böse,Sprache,suggerieren,Konkurrenz,flattern,gestorben,auch,brav,Jugend,Nützlich,Leonardo,errichten,optimieren,Analyse,eintauchen,Spirit,Popstar,kameradschaftlich,tierisch,hilft,faul,Norbert,oftmals,zutiefst,erschaffen,Vanessa,darsteller,Bayern,spritzen,extrem,hinein,Dies,aufhören,gleich,zunehmend,delegieren,King,Minute,Danach,Wettbewerb,leuchten,klug,Österreich,Argument,Alte,besonders,Medaille,Kurzgeschichte,umso,Immobilien,womit,denen,bekannt,Erdball,Voraussetzung,gemacht,Irland,Acker,Krise,maximal,neunziger,inländisch,Ethik,käuflich,Befehl,bebauen,fertig,Rohmaterial,logisch,abhalten,Unmenschlichkeit,einzeln,italienisch,Strahlen,dick,zerstören,Entlastung,Diktatur,Staatseinkommen,Apropos,Rasen,Wald,gnädig,Neulich,putzen,Pädagoge,Milch,weichen,Figaro,lindern,Koch,Absätze,Anerkennung,folgen,blind,gigantisch,Pilot,huschen,Luxus,Pflicht,Würdigen,konnten,Wohngemeinschaft,Erasmus,Hoch,Resonanz,Reporter,gehören,Hoffentlich,brauchen,Variante,Anton,zulegen,Heim,allmählich,Wirklichkeit,Berlin,bist,Spitze,renovieren,gerecht,Fasching,motte,Nagel,unehelich,bepacken,haben,Komfort,Neigung,also,Thema,Beileid,Fremdkosten,Verifizieren,Arten,denken,kaltblütig,Bioprodukte,Chip,Aber,dauerhaft,Unkenntlich,zuvor,Fahrzeug,Diamant,Stil,Erneuerung,erbittert,hemmen,zumal,kooperativ,immerwährend,Beamten,notbedingt,Anlass,viertel,global,Uhren,zuwider,unnütz,Brust,Krone,Ufer,bloß,Information,Dumm,Werner,Kolumbus,durch,zufolge,Somalia,halfen,Orientale,vegetarisch,Umfeld,Abraham,gekauft,urheberrecht,Wind,spazieren,jemanden,Ämter,ethnisch,Hunger,Graf,jenseits,gepachtet,weltweit,Boot,römisch,Container,fröhlich,umstellen,Dreck,gequält,Lauf,hart,annehmen,ernten,dynamisch,Dame,pflanzlich,beenden,doof,Begründung,Amerika,Öse,abgeschaut,Ameisenbau,Gebäude,Zelle,außerdem,Apfelbaum,Gemeinschaft,klick,dastehen,zurückerlangen,beflügeln,Papa,Aristoteles,seite,Neuseeland,vorkommen,exakt,ganz,tauchen,darüber,heraus,berühmt,Universität,Negativität,Trotz,Gabe,Gerne,Auge,dessen,Lied,Moment,Designer,etwas,Stabil,Vorwort,Ibiza,Werk,Rose,Kanal,Rendite,Rassenkonflikte,Saat,stirbt,ertragen,Galaxis,steckt,benötigt,Exponential,Stunde,Beeren,murmeln,Hirte,human,Medikament,Klaus,sehen,ersetzen,Simultan,Programm,Niederlande,Ärmel,faszinieren,fangen,Inspiration,Hektik,Gier,Blick,Errungenschaft,Google,geboren,Äste,Hügel,mitverursachen,ändern,vervollständigt,einer,Februar,foppen,legehenne,Bionik,herzlich,butter,bahnbrechend,moralisch,gezeigt,erfrischend,hinzu,riskieren,überhaupt,Gäste,Geld,unangenehm,Kurs,Durst,irrtümlich,Insekt,Foyer,geholfen,gewidmet,spielen,marode,Trinkwasser,Heilkunde,Sperrt,mitnehmen,kopieren,drücken,runden,Pyramide,hereinholen,Chemie,umpolen,Bauer,Stichtag,weinen,woher,Biene,Sonne,Pazifik,gesamt,voneinander,Petrus,ließen,Alibi,Wegfall,polar,Abholzung,erzwingen,paar,frustriert,Teufel,Sternenstaub,Abfall,draußen,keiner,bemerkenswert,somit,wagen,Fidel,Diejenigen,spalten,getragen,verhindern,degradieren,erhält,lehnen,Jürgen,ausdrücklich,Sektor,schief,Estland,bomber,Zivilisation,Kette,sehnen,Querdenker,langfristig,kohärent,erkannt,Busfahrer,Dubai,Chef,Konto,Rand,appellieren,Bande,erfunden,aufdecken,ermöglichen,Bruder,rufen,Bewirtschaftung,Koralle,Göttingen,Reich,nimmt,nirgendwo,Kategorie,Fest,Kabarettist,gutmachen,morphogenetisch,Industrie,Tage,Umkehrschluss,anzetteln,Ende,Gast,Anspruch,gelb,lenken,Peter,erzielen,dadurch,Altlasten,prima,Austausch,Berg,berichten,erwidern,jene,Portal,regnen,erfinden,glauben,dann,Spende,hinweg,Holland,retten,golden,Wasser,Experte,kaum,Professor,sofern,lediglich,Publikum,Blockade,Fips,Unabhängig,Befürworter,Pfarrer,Augsburg,bleiben,Energie,geerbt,Anzahl,Flug,Seele,drehen,entgegengesetzt,Armut,Sekunde,Fackel,Respekt,Hopfen,Ereignis,erniedrigen,Kohle,unrentabel,kannst,Masse,Birne,Notenbank,Urlaub,Lausbub,mich,bewegte,Karte,ressourcen,Internet,Coach,Inhalt,Floh,pervers,Papiergeld,hinter,losfliegen,stammen,sauber,Umwelt,abwaschen,Irgendwann,vorrangig,hegen,Vegan,Anstatt,soeben,bewährt,beliebt,eher,Erbsen,Konsum,fragen,Lothar,Pause,Mathematiker,besprechen,Sklave,beide,Gehalt,getilgt,Chicago,Johannes,dafür,Ball,Mittel,Natürlich,Spreizen,Zyklus,wegweisend,Bewohner,Leser,rumfliegen,chinesisch,Video,Aktiv,bevor,unvorstellbar,plötzlich,Töne,fegen,Positiv,annähern,Anblick,Nein,zitieren,Familie,Hexe,Bewusstsein,Kunde,Lama,drucken,Ihnen,Gesicht,befinden,Aufklärung,hinaus,Wissenschaft,Titel,Packen,Beobachter,Rabatt,John,jeweilig,Netto,Islam,selig,Forschung,Taschendiebe,weil,vorliegend,transformieren,Aufgabe,Empathie,vordringen,Kinder,Hersteller,sein,nahm,horten,großartig,Abgaben,Edwin,sträflich,Schlusswort,Hier,widerstehen,geschützt,Prozess,unfreiwillig,Zwergstaat,Bücher,Kreislauf,Leben,beinhalten,Totalversagen,vereinigt,hundert,September,Institut,Sound,Licht,modern,brachte,bislang,Ironie,einander,Phantasie,drastisch,exzellent,mahnen,dato,Stück,Gregor,konfrontiert,Pleite,Geduld,Passend,Zauberwort,Dschungel,Sachverhalt,bewahrt,klein,Blech,talentiert,Plage,Kilometer,Punkt,waren,zuspitzen,fressen,ausprobieren,Ursachen,bemüht,stimmt,größte,erkämpft,dazu,vorne,mitharbeiten,verknappt,Ansehen,Fachsprache,anderen,Facebook,Angebot,derb,gewaltfrei,beugen,Samen,dich,täglich,absurd,zerrinnen,belgien,dort,nutzen,durften,endlich,Zugriff,Kultur,wesentlich,halb,Paul,ehemalig,Eltern,Engpass,bereits,nötig,liberal,bricht,feindlich,anpreisen,unqualifiziert,Betonung,dunkel,akzeptieren,anbringen,holzig,effizient,Bedingungslos,bote,unwichtig,mobil,Tendenz,erinnern,führen,dein,mitbringen,zeigen,Katastrophe,Anthropologie,Nase,Markus,Südafrika,Neuorientierung,voll,Brezel,verbessert,Insolvenz,Gentechnik,Geburt,verlagern,zukünftig,Karriere,wegdenken,Biedermeier,funktionieren,schnell,Tagtraum,Abwicklung,leer,bonus,untrennbar,Drama,investieren,baut,Potenzial,hinlänglich,aufs,Maurer,lachen,Dreifach,tief,Währung,anschließend,Sockel,Fimmel,servieren,Lohn,zehn,links,Monat,Sven,setzten,soviel,Akademie,Gertrud,leiblich,standen,welches,aufwärts,Discounter,Alexander,Herbizide,Tilgung,Krebs,biologisch,Russland,hübsch,Recht,Nordstern,orden,Bonität,Anweisung,Orte,häkeln,inklusive,Gelingen,klagt,Ansonsten,peinlich,Daniel,Produktiv,Tisch,Arbeitsklima,sorgfältig,bisschen,einkaufen,Zufriedenheit,Gänse,Rente,fantasievoll,Atmosphäre,Brutto,Endverbraucher,Privat,Begabung,Leistung,Dosis,anliegen,leicht,zuteil,Gläubiger,Aussage,Hippie,voriges,ungewöhnlich,Schulden,Präzision,Prinzip,Äther,datum,ehrlich,Vater,feminin,Haufen,Patent,luden,Antwort,ohne,donnerstag,Besen,Pflock,Temperatur,Braten,loslegen,Ingwer,keimen,pickt,Fontane,gutes,Anreiz,mutig,Auffassung,Sabbat,genannt,einverstanden,Satz,Ungleich,Dach,Asien,Garten,Tanten,Anhang,erbringen,Maler,Tennisspielerin,wehren,Chance,sieben,fatal,Gegner,herunter,Puffer,Wahl,Park,Sitz,Umsetzung,bald,Nehmen,Teilhabe,Daher,Rekordgewinne,helfen,pflegen,lustig,gutschreiben,Zweck,Hamburg,bilden,Ergebnis,Ausmaß,Zustand,Nahrung,Einwohner,Wolfgang,satt,stagnieren,gelangen,Kalkulation,Fördern,absolut,Ingenieur,Twitter,Josef,unmöglich,leider,entfalten,Urvertrauen,money,atmen,Regenwald,baden,April,Mensch,Woche,Material,Wischen,Samuel,Hanau,Radio,Diana,anvertrauen,abzählen,Flandern,Hesse,Arthur,Team,erhalten,geistig,Region,fokussieren,Meter,Feuer,Ersatz,gelehrt,Bezugsquelle,Bedürfnisse,Victor,hassen,Sinn,Kapitel,liegen,umtauschen,resultieren,Nummer,auseinander,antreiben,Kreativ,betteln,Horror,Lektorat,Idol,Sauer,Grund,Ablage,neuartig,telefonieren,altbekannt,Sozialabgaben,Film,gespielt,solide,Antike,dörren,Umlaufbahn,Erkenntnis,anbieten,trainieren,Botschafter,Spaß,geplatzt,gang,Gradido,Fenster,Maschine,mindest,Einführung,grau,Heuschrecke,Bezahlung,belohnt,Code,anno,Nationalstaat,zwar,weggefährte,statt,Entstehen,mögen,Zufall,entzünden,Blume,britisch,beherzigen,gucken,zuerst,gegangen,zählen,wunderbar,besitzen,gewöhnt,Flamme,dokumentieren,Klarheit,Ziegler,leugnen,Kredit,erblühen,zahlungsfähig,oben,Erde,unzählig,wechseln,Ketzer,Brücke,Euro,Stein,brillant,allzu,stiege,treten,Quantensprung,oder,militärisch,loszulassen,Klavier,ermorden,weigern,permanent,Kopf,Blut,Beschränkung,Keller,holen,Puzzle,Egotrip,euch,mitfinanzieren,Tsunami,Wachstum,Fähigkeit,Spuren,Höhle,Hautfarbe,Frist,wehen,Steak,Freund,rebellieren,Platz,Prostitution,Rohre,empfinden,anpassbar,Flucht,Aufmerksamkeit,Bube,Gefängnis,wahr,Minimum,Pension,Fetzen,Reise,hätte,bisher,finden,greift,Zusammenfassung,wartung,Apotheke,rasant,Kraft,stellen,gelten,dient,Futter,Schweigen,Schenken,Webseite,Wort,unnatürlich,intuition,genießen,Zweifel,Hände,vorprogrammiert,Oktober,Pilz,paddeln,Helmut,zwischen,erreichen,erproben,Ziel,Zitat,gearbeitet,Planet,ziehen,Metzger,iPhone,Westen,Situation,senkt,sogar,ausreichen,Ratgeber,Jesus,Cicero,Fohlen,Sieger,wegrationalisieren,Gefahr,derzeitig,Direktor,Bank,Hotel,simpel,Elektronisch,gekriegt,steht,Engagement,Zeit,Klima,sonst,heikel,Zugvogel,tragen,verzeihen,Boshaft,Entdeckung,typisch,barbarisch,Busch,zirkulieren,Wenden,egal,enorm,Rücken,wegnehmen,Tellerwäscher,breit,Bilanz,erzeugt,davon,Agrarfläche,Unfähig,Motivation,Entwicklung,Gebiet,diskutiert,Verpackung,falsch,Bernd,aufnehmen,Oberst,florieren,Millionär,selten,Erich,zwingen,repräsentieren,wenn,loben,meckern,backen,Infrastruktur,gehen,wittenberg,wichtigsten,Anker,Stress,Flagge,befassen,insbesondere,Methode,gönnen,verrichtet,bedrängen,Verantwortung,beim,ausbeuten,Horst,Kasten,aushalten,Bedeutung,Diplomat,Faktor,Iris,College,beginnen,Reparatur,anfängt,Nikolaus,ausnahmslos,gezogen,gelöst,Patriarch,Gefrierpunkt,recyclebar,zwölf,dabei,Kupfer,Ozonloch,viel,Vermögen,Kriterium,Wunsch,dritter,Wirtschaft,plausibel,Unsinn,Blase,Sobald,ziemlich,Sportler,dagegen,Dieb,Ruder,Güte,herrschend,Firma,Anleitung,nahezu,Bindung,Porsche,bitte,Leute,Fratze,letzten,gegründet,Gering,eingeführt,suchen,Start,Feedback,zaudern,Baukasten,plus,Totenkopf,Hermann,kulinarisch,Partei,Fossilien,Wilhelm,Onkel,Wickeln,weitergeben,treffen,Blüte,Glück,Protest,Generation,Wegen,Tourismus,Girokonto,Wolke,erleben,Abteil,sogenannten,kehrte,bringt,jetzt,gähnen,Soja,Helikopter,Fieber,unschätzbar,Zunahme,Küche,berauben,jegliche,unverändert,Fischer,Jörg,saagut,klingen,Marianne,hindurch,immateriell,daran,Madonna,laut,eventuell,ergründen,schützen,Stadt,Grün,organisation,raffen,intrinsisch,System,Topmanager,doppelt,Finanzblase,geprägt,Hölderlin,Obwohl,mitdenken,Autor,Mann,zulassen,Krankheit,Haiti,Fabian,dennoch,Neidisch,nachfolgen,sagen,Dahinter,aggressiv,Knappheit,liefern,Steuern,neugeboren,solange,gemäß,bedarf,Japan,Novellierung,zugute,schon,gibt,Himbeere,Risiko,Niveau,zinslos,deren,saugen,nackt,Rede,umhin,darum,Kerl,Finnland,konventionell,Steffi,genommen,Jahr,geben,ankommt,runter,Labor,Hauch,Problem,Sohn,runzlig,Zentralbank,Vision,Illusion,Osten,enthalten,Felix,betreiben,Sofort,lukrativ,Hinsicht,Volksbank,Dotter,Fabel,Gesund,Topf,wovon,Sparen,inmitten,sowie,inzwischen,Locke,erheblich,zudem,hatten,Haus,Enkel,geändert,Netzwerk,jährlich,beleben,Vorteil,umgekehrt,Fuß,manche,ihre,Leasing,Natur,lasst,Forelle,noch,sehr,altruistisch,normalen,Finger,Herde,externe,Gehirn,blau,Frucht,sollt,Hurrikan \ No newline at end of file diff --git a/database/src/config/mnemonic.uncompressed_buffer18113.txt b/database/src/config/mnemonic.uncompressed_buffer18113.txt new file mode 100644 index 000000000..abbeb07bf --- /dev/null +++ b/database/src/config/mnemonic.uncompressed_buffer18113.txt @@ -0,0 +1 @@ +Monumental,Volksbank,Beeren,huschen,leer,Haft,saagut,Positiv,daran,solide,dauerhaft,zahlungsfähig,beinhalten,weglassen,Ausmaß,irrtümlich,Impuls,darüber,Abriss,setzten,Herkunft,manipulierbar,anfängt,anliegen,Mutter,Beobachter,Zeichner,dran,genug,Medikament,Tanten,behindern,Johannes,Rand,Illusion,anzuwenden,Fehler,erniedrigen,gehören,Güte,unangenehm,Horst,Koordination,weltweit,geprägt,unerlässlich,einig,mitbringen,Dieb,dann,Karriere,Ethik,dich,Ursachen,beglücken,Wahl,dermaßen,spritzen,erbittert,Maler,täglich,Wohlstand,hübsch,Klarheit,voneinander,berühmt,Iris,plausibel,verlagern,Lauf,Foyer,Idol,spreizen,Hölderlin,Grenze,Code,Dogma,langfristig,Urzustand,verursacht,Fasching,Finger,König,barbarisch,einbringen,Disziplin,angreifen,speichern,Urheberrecht,ermorden,Diana,Auswirkung,beginnen,kooperativ,Ahnung,allen,bisschen,durften,Prostitution,Strahlen,Umschwung,Foto,taten,Mechanismus,Urvertrauen,Chef,feminin,nirgendwo,Absatzmarkt,welches,Entwicklung,gearbeitet,erblühen,umtauschen,Aufklärung,online,produktiv,Pest,Coach,Anblick,ursprünglich,schon,solange,eventuell,Tatsache,erforderlich,Buch,derartig,werden,auseinander,halten,Maurer,Himmel,Loch,Forum,Kluft,aufbauen,bricht,permanent,saugen,exponential,Fetzen,Mord,unausweichlich,untrennbar,skeptisch,geschützt,Gebäude,Butter,bezeichnet,Daunen,Journalist,ehrgeizig,System,Zugriff,Anwalt,Krone,ankommt,zulassen,Stufenplan,Raum,Sanktion,Währung,Tradition,Money,dafür,Gruppe,solch,geben,geholfen,frei,Rahmen,Rasen,feindlich,Wirklichkeit,Unheil,luden,Ausgleich,leugnen,erklärt,Vater,Ingenieur,Erfahrung,Stil,dörren,wozu,befassen,gemäß,Apotheke,Vegan,simultan,wehen,gang,immateriell,Wilhelm,fertig,kennen,korrigieren,Jahr,Industrie,hier,Glück,Anton,Bionik,abwaschen,Hannes,Diamant,Anweisung,angleichen,Fördern,Helene,glasklar,Abgaben,beflügeln,Trennung,Ziegler,überhaupt,Guido,rotieren,treiben,sowie,Begründung,Erdöl,selig,jegliche,belastbar,ehrlich,Eier,Schulden,Brutto,Paar,Sitz,hast,annähern,Neigung,Menü,messbar,vervollständigt,Erkenntnis,pendeln,Edwin,römisch,entstehen,Gefahr,Resonanz,ungleich,Sprache,Tsunami,Bindung,Sympathie,Bomber,Schlusswort,bislang,befreien,fegen,drastisch,greift,obwohl,bewährt,Jörg,drehen,Quartett,Betätigung,Szene,Kinder,Respekt,Empathie,eher,unwichtig,besser,nein,Kredit,liegen,zulegen,Forschung,Hurrikan,wesentlich,Deutschland,eintauchen,entzünden,betteln,Islam,Rohre,Müll,Tage,sinken,Hunger,fungieren,Radio,Lohn,lenken,Container,marode,gering,Ozean,Revolution,Meter,tausend,Kalkulation,blau,Hautfarbe,Kurt,Ding,Mathematiker,jene,renovieren,Popstar,auferlegen,unübersichtlich,fantasievoll,Bedürfnisse,Maßstab,Feier,Onkel,essen,Stein,einzeln,Woche,Sekunde,Phantasie,Blockade,Chip,Moment,lüften,Jasmin,aufrecht,eisern,oder,Fachsprache,Komponist,Vermögen,allmählich,Urwissen,selbstregulierend,Brust,Leute,Gegner,Pause,unqualifiziert,August,Umdrehung,wegdenken,gucken,leihen,vordringen,Durst,Seite,fast,hinaus,Binnenland,Bund,sollt,Albert,Smartphone,Kriminalität,Protest,Fremdkosten,klingen,Chicago,Baum,sammeln,sehen,soviel,Horoskop,keiner,Pension,soweit,Quantensprung,intrinsisch,anno,Züge,Zeug,Wissenschaft,dass,loszulassen,brauchen,Lehrer,rufen,Lama,Sparen,größte,Kerl,enthalten,Flügel,Rabatt,ehrt,endlich,religiös,Orchester,braten,Feedback,exemplarisch,Zitat,Recht,toll,Zusammenfassung,hervor,Eigentum,teuer,nichtkommerziell,benachbart,leider,Fahrzeug,glauben,putzen,geübt,begünstigen,Kasten,zuspitzen,meckern,organisation,loben,Anthropologie,Seminar,moralisch,Last,merken,Samen,kassieren,Bube,Engpass,Hopfen,Hirte,Gefängnis,Gedanke,bepacken,brillant,verrichtet,drohen,Katze,reif,Fossilien,gezeigt,Packen,persönlich,denen,wegweisend,Horror,Diplomat,Japan,pflanzlich,kaltblütig,Kunde,Geruch,Patriarch,Garnele,bedingungslos,Prinzip,Vergänglichkeit,stört,hinein,Tomate,halb,geplatzt,Theologe,Vogel,September,Steak,repräsentieren,heißen,hoch,hinblick,Wunsch,frustriert,Fidel,Blödsinn,früh,Birne,Hülle,loslegen,jetzt,Biene,regnen,Celsius,hören,genommen,Fleisch,diejenigen,davon,vorrangig,sonst,herrschend,ertragen,Neuorientierung,nächsten,sozusagen,Sabbat,honorieren,verwirklichen,Mobbing,Annahme,Hügel,Bedeutung,Risiko,riskieren,ermöglichen,hemmen,Frist,Klima,böse,sofern,Paul,vertieft,missionieren,zuvor,Nagel,backen,getauft,dazu,Blech,zufolge,Koch,immerwährend,Regenwald,Finnland,altruistisch,grau,Oktober,Universität,Philosoph,Ungarn,Wirtschaft,hinlänglich,Abteil,sperrt,aggressiv,Gast,externe,Saat,Zustand,losfliegen,egal,Dubai,aktiv,flattern,zunehmend,Bauweise,erreichen,Markus,gegründet,zwölf,Rente,zwar,leicht,Fischer,Emotion,dunkel,Vision,fressen,dritter,athletisch,warum,Lage,bestimmt,Mitwirkender,Totenkopf,Qualität,hegen,Ecke,erhalten,fuhr,Sklave,getätigt,belügen,gutmachen,breit,konnten,Obst,subventionieren,Pflicht,Planet,keimen,sogar,deshalb,Milch,Gesicht,zögern,fundamental,Zwang,typisch,gefunden,offen,Publikum,wieso,strukturell,Voraussetzung,umhin,Geduld,dient,Professor,wechseln,Minute,Ärmel,Konto,waren,Information,ganz,studieren,Reihenhaus,Henry,oftmals,Apfelbaum,reißen,Labor,effektiv,Umfeld,sogenannten,Insolvenz,erzwingen,später,funktionieren,Meile,extrem,Hallo,mitdenken,Heim,Praxis,lediglich,Kohle,inmitten,berichten,Soja,Firma,rasant,relativ,doof,Belgien,Rendite,Auge,abschreiben,Direktor,unsere,Absätze,plus,suchen,inklusive,somit,Spirit,verändern,Test,Bewohner,eindeutig,Strom,leiten,Zentralbank,Austausch,pickt,weise,Tourismus,spielen,Absicht,Beachtung,Spekulation,ernst,telefonieren,Trotz,Technologie,indigene,gelöst,Thomas,Blüte,Ferienjob,geteilt,Heinrich,gelangen,Situation,Kunst,Zufall,Haufen,geworden,Wurzel,Punkt,Temperatur,zukunftsfähig,Opfer,Josef,nutzen,Kauf,annehmen,Klaus,berauben,Griff,erdacht,neulich,geändert,besitzen,liberal,kopieren,superreich,bekommen,Kolumbus,Mangel,Steffi,Hase,bahnbrechend,Norbert,Karte,kreativ,unverändert,effizient,Historiker,anschließend,Stichtag,These,nimmt,Finanzblase,wegnehmen,heutige,Hexe,Foliant,Flamme,Diktatur,klick,Mitleidenschaft,dick,vorliegend,verhindern,Klasse,uralt,Abfall,stoßen,lernen,ethnisch,Eleganz,schmackhaft,helfen,Wind,Pfarrer,neueste,anfangen,Erich,ausatmen,Präzision,Stück,aktuell,unproduktiv,dastehen,runter,Figaro,Internet,Gäste,sträflich,Angst,Bedarf,Ozonloch,Bioprodukte,mögen,Abraham,Sohn,Nebensitzer,zudem,Konzept,Russland,erzeugt,Stress,Hanau,Hugo,zehn,resultieren,Dach,junge,lehnen,Bewirtschaftung,gekommen,erproben,durch,Häuser,gigantisch,unendlich,Wegfall,Irland,Reparatur,perfekt,Pilz,Zauberwort,Dorf,darin,absolut,Anbau,Dung,müssen,betreiben,sieht,investieren,Ansatz,Vorwort,ablegen,Verantwortung,gebaut,Dreck,Feld,explizit,Harmonie,Rangordnung,maximal,meiner,vereinigt,Hamburg,clever,global,unfreiwillig,tierisch,Bayern,Importgüter,schenken,Donnerstag,Puffer,Rohstoff,britisch,Samuel,Handel,anstatt,Sprung,Dollar,Lösung,Engagement,Oberst,unmöglich,Goethe,zehren,Humorist,neuartig,plötzlich,Graf,ging,intakt,tragen,nahm,zusätzlich,Potenzial,beeinflussen,ziemlich,Beitrag,Fest,Hektik,beliebt,ergibt,ausbeuten,vorhanden,klagt,wegrationalisieren,bequem,werben,Welle,Spuren,decken,autistisch,Satz,musizieren,Umlaufbahn,nützlich,simpel,sauber,Fortschritt,losgelöst,bist,weder,ungünstig,Meer,treffen,peinlich,einnehmen,bewegte,notbedingt,benennen,Zugvogel,identisch,Infrastruktur,Blase,erfinden,modern,gähnen,Sportler,alte,aufs,Kampf,Nikolaus,fröhlich,Stockwerk,Fabel,Brasilien,passend,abgeschaut,Pädagoge,militärisch,Spaß,beugen,Einwohner,Ressourcen,Lunge,Discounter,insbesondere,lukrativ,bloß,erarbeiten,Referat,Neuseeland,Rose,Abhängigkeit,Gänse,Duft,Pilot,vernachlässigt,Lausbub,Darsteller,Bezahlung,Wörtchen,Seele,altbekannt,Seil,Lothar,irgendwann,Ironie,Titel,zumindest,Aussage,bezwingen,Errungenschaft,Medaille,Uhren,unmittelbar,treten,richtung,wahr,mitverursachen,bilden,Tennisspielerin,jenseits,Mädchen,aber,Territorium,Fenchel,Spende,Definition,draußen,parallel,annimmt,allgemein,King,verbessert,sowohl,Methode,Affe,Dank,Versorgung,Staunen,Vorteil,gegangen,ansonsten,kommt,beim,Gefrierpunkt,senkt,Elster,unter,Äther,niemand,dennoch,Zeit,Schriftsteller,klettern,boshaft,ohne,riesig,sorgfältig,Slums,Beschränkung,Gehalt,hergestellt,Urlaub,Gabe,Kapazität,werfen,suggerieren,Rolle,Guthaben,Höhle,nehmen,unfair,gemacht,Flur,kannst,Rassenkonflikte,Herbizide,Twitter,iPhone,Bausparkasse,entfalten,Vorbild,Orientale,erwidern,abrupt,mich,dein,Krieg,umkämpft,Kriterium,behaupten,Mitarbeiter,runden,Wort,hereinholen,beurteilen,Frieden,totalversagen,Africa,konfrontiert,Grün,sofort,ersten,Dotter,Facebook,gelingen,Unsinn,Arthur,umstellen,Kultur,Urmutter,Pyramide,Obsoleszenz,Biedermeier,gewehrt,heraus,ideal,ihnen,ausnahmslos,gerecht,satt,Inspiration,Sägemehl,jemanden,pflegen,Laden,optimieren,spazieren,mitnehmen,sondern,Nektar,anbringen,vorne,günstig,Vorfall,blind,widerstehen,einpendeln,einmal,Krebs,Einleitung,Institut,desto,Alibi,Besen,auftreten,zuschauen,Haar,Baukasten,ließen,polar,Umsetzung,Millionär,prima,gilt,insgesamt,Wartung,inländisch,reiten,befinden,bekannt,Niveau,Faktor,Antike,gutschreiben,antreiben,Drama,Floh,praktisch,unzählig,heikel,leiblich,Augsburg,Keller,Abendessen,anheben,retten,schnell,erhält,voriges,Wertschätzung,unnütz,neunziger,Prozess,Flutwelle,umfangreich,Geld,haben,gekauft,Öse,zukommen,Querdenker,genmanipuliert,müde,Seerose,gewaltfrei,Fiat,Negativität,faul,Datum,erfunden,gepachtet,sauer,bisher,wollen,Bonität,erbringen,restlich,oben,Fuß,Flotte,Robert,Phase,Inflation,tapfer,weinen,zeigen,hoffentlich,hingen,mutig,prüfen,lustig,gravierend,Fondue,ehemalig,mitharbeiten,Steuern,Holland,stabil,dessen,Initiative,geblieben,nachfolgen,Befehl,Nordstern,dahinter,Gott,Erbsen,Unmenschlichkeit,Reise,euch,Papa,Ersatz,Bande,womit,gerne,auskommen,nahezu,Brücke,Küche,Traum,selten,manche,häkeln,Summe,würdigen,einräumen,Lebzeiten,bitte,atmen,Licht,gekriegt,Neidisch,umso,Erde,Wolfgang,letzten,eignen,dezentral,genießen,klein,Sanft,pathologisch,anbieten,zugänglich,Flug,Bonus,regulieren,stolz,Zyklus,zerstören,fiel,Basis,delegieren,Legehenne,Leser,Fieber,wunderbar,Familie,Hippie,Gemeinschaft,Stunde,Zwergstaat,sagen,fokussieren,toxisch,psychologisch,fragen,Bach,zaudern,Lektorat,Ausland,Fackel,mehr,Datenbank,runzlig,erwähnen,Zimmerleute,Spuk,Preis,Einführung,gewidmet,talentiert,Gregor,Inhalt,Human,Südafrika,Sozialabgaben,Erfüllung,benutzt,Englisch,Nationalstaat,Krankheit,gönnen,unschätzbar,Fähigkeit,Tellerwäscher,damit,bebauen,Ehre,Software,stirbt,Honig,Altlasten,zuwider,Hobby,murmeln,beziffern,degradieren,geformt,Zufriedenheit,erlaubt,Fluss,Ratgeber,Fernseher,Hesse,jammern,verzeihen,Wagen,Mahlzeit,Abwicklung,Lizenz,Umwelt,Papst,Wolke,Fontane,Weggefährte,Fläche,ausdrücklich,stetig,dumm,Webseite,besonders,signifikant,exakt,virtuell,weichen,hilft,Topmanager,dazwischen,dringend,herzlich,kaum,Haupt,gespielt,einher,Arzt,gewöhnt,florieren,Anziehung,senden,Fichte,eingeführt,Anlass,Locke,geboren,zuerst,mahnen,evolutionär,beißen,Forelle,wenden,Umsatz,drucken,führen,Pflock,Haiti,Miesmacher,Estland,Staatseinkommen,Motte,dort,aufhören,Konsum,gutwillig,Befürworter,Ketzer,Blick,Hühner,bunkern,erinnern,Fohlen,hatten,zwitschern,Gentechnik,Berlin,foppen,Gier,Leonardo,väterlich,Hähnchen,bereits,Designer,rebellieren,Ufer,auch,Hütte,Übel,Eden,Hermann,ungewöhnlich,Partei,gnädig,womöglich,Winter,anzetteln,vorprogrammiert,Fips,Flagge,zinslos,weil,bewahrt,Werk,Atom,Akademie,Anker,Sonne,derselbe,Sockel,Somalia,wann,erzählen,Abstand,enorm,indem,etwas,Erasmus,vorkommen,Rede,Tokio,dreifach,halfen,Zivilisation,Luftfahrt,Endverbraucher,Mama,Angebot,Vorschlag,hart,lokal,Sorte,Priorität,jedoch,genügend,dadurch,Branche,großartig,Regal,garantiert,unbewusst,Migrant,Auerhahn,David,stärken,Erbe,notfalls,hindurch,wickeln,quasi,darf,comedy,gehen,Start,verdeckt,Dosis,Brezel,Element,Kurs,Ämter,leuchten,zwischen,Beileid,weiblich,Ruder,Zoologe,aushalten,neugeboren,spüren,Ingwer,fließen,Idee,Samstag,trainieren,Flandern,Auffassung,ziehen,Masse,Nina,Arten,Gnade,Spezial,unkonventionell,Wald,Jugend,Busch,Fabian,dokumentieren,Felix,Film,belohnt,Gertrud,architektur,derzeitig,echt,Tagtraum,Margret,Objektivität,Sieger,empfinden,Beamten,akzeptieren,laut,Sternenstaub,Stadt,Aristoteles,Ferrari,finden,Google,Westen,Fratze,Bauer,Kreislauf,wovon,Jürgen,gerade,Platz,Madonna,Zahnersatz,Marianne,euer,Privat,Schatten,hundert,besucht,aufwärts,dynamisch,Sahne,viel,Teufel,Gebrauchsanweisung,Gradido,sieben,Flucht,holen,baden,ändern,jüngeren,Natur,chinesisch,Rohmaterial,Hauch,Konkurrenz,fiktiv,akkumulieren,Ball,beenden,bemüht,recyclebar,gedruckt,vegetarisch,woran,erwerben,lasst,bleiben,Radfahrer,Bücher,Klavier,genannt,Quelle,erheblich,gegenseitig,abzahlen,stagnieren,Hubert,Ende,Crash,Trinkwasser,Franz,Insekt,sensibilisieren,Erneuerung,Sehnen,Maus,Frau,betonung,stiege,Porsche,beide,absurd,dato,Österreich,beteiligen,dies,gezwungen,anvertrauen,Tilgung,Feder,logisch,konventionell,fatal,kulinarisch,Abholzung,Cicero,nostalgischen,schützen,brachte,Metzger,geehrt,Flasche,bringt,Villa,Krise,bietet,Entlastung,ausführung,Wikipedia,stellen,Park,Video,Papiergeld,voll,inzwischen,Jäger,Topf,ülzen,umgekehrt,Hanf,Februar,zirkulieren,John,heben,Novellierung,unfähig,servieren,Meier,jeweilig,Heuschrecke,daher,Alexander,Peter,erkannt,Gehirn,lateinisch,anpassbar,anderen,Artikel,Wucht,Leben,sein,exzellent,beantworten,Asche,reduzieren,Hersteller,Victor,zumal,Plage,hassen,fünf,liebevoll,für,Acker,morphogenetisch,Sachverhalt,umpolen,gibt,Busfahrer,beherzigen,weitergeben,brav,jeder,sich,Galaxis,steht,Maschine,erzielen,Sanierung,Kraft,Netto,Begabung,ersetzen,mindest,gestorben,Osten,Gebiet,Zweifel,zugleich,wild,kameradschaftlich,Farbe,Mitmensch,bevölkern,gesamt,Mittel,Reporter,Kilometer,kostenlos,mobil,wehren,herunter,Ansehen,erfrischend,Hotel,Analyse,Griechisch,Abwurf,käuflich,Bernd,entgegengesetzt,Bewusstsein,ankaufen,zurzeit,Impressum,Toast,Ladung,Verfütterung,Form,Wasser,gesund,noch,horchen,Variante,Anleitung,Pazifik,Wiederherstellung,Wandel,transformieren,Tisch,verknappt,Material,Realisierung,einer,Daimler,unvorstellbar,meldete,Strickmuster,stammen,Menge,Verifizieren,tief,Puzzle,Gepflogenheit,Ziel,dürfen,doch,Sinn,Region,fangen,zuteil,Anspruch,kehrte,Freund,Fimmel,darum,Girokonto,Zweck,Wohngemeinschaft,Projekt,schweigen,Kupfer,tauchen,holzig,Tendenz,abhalten,Nummer,bald,Töne,Salvador,Kapitel,Ibiza,Komfort,wobei,lachen,Wagnis,metaphorisch,gelb,bevor,unnatürlich,Leasing,bemerkenswert,zugute,beruhen,soeben,Kopf,wischen,appellieren,gelten,statt,Futter,Erdball,benötigt,futsch,Symbol,wofür,Glanz,beispiellos,normalen,mitfinanzieren,Frucht,italienisch,woher,allzu,beleben,weigern,Senf,Gift,atemlos,Cäsar,Begegnung,horten,sobald,Luxus,biologisch,Wettbewerb,Umkehrschluss,fallen,Darlehen,klug,anpreisen,doppelt,abwechslungsreich,Werner,nannte,Wittenberg,existenzbedrohend,deren,zynisch,Feuer,Leistung,Ideologie,Enkel,diskutiert,pervers,Brot,Ordnung,blubbern,einander,College,folgen,Anreiz,Agrarfläche,aufdecken,zerrinnen,ergründen,spalten,unehelich,Experte,viertel,gezogen,Mitspieler,geklappt,Kette,Petrus,Nahrung,Georg,Patent,Unkenntlich,Waage,ernähren,Botschafter,hell,Zelle,Silbe,pfiffig,Mystisch,Acht,ahnen,erkämpft,Team,zunächst,Benzin,falsch,erwarten,raffen,Auflage,Thema,ernten,Monat,lindern,meisten,zurückerlangen,Fenster,unabhängig,Jesus,geistig,divers,Göttingen,unruhig,Kategorie,fassen,hinzu,Wachstum,Sven,Chemie,quälen,Herde,standen,jährlich,Anhang,nötig,Hirsch,derjenige,Kurzgeschichte,ökologische,Theater,willkommen,ausüben,Kanal,nennt,Name,wussten,drücken,aufnehmen,Äste,Rücken,intuition,hätte,Zunahme,Gläubiger,abzählen,Phänomen,Ablage,spontan,spannend,Vanessa,Asien,gewusst,elektronisch,derb,getilgt,Antwort,geeignet,Bote,gequält,Anerkennung,Bilanz,natürlich,machbar,Verpackung,Blut,Eltern,Himbeere,rumfliegen,Senioren,zwingen,Spitze,Taschendiebe,steckt,Monster,Egotrip,Helmut,Bibel,geerbt,zitieren,Ameisenbau,Rekordgewinne,Hände,ergänzen,danach,orden,hinter,wenn,paddeln,gutes,Hinsicht,wegen,Teilhabe,Gesellschaft,christlich,Bezugsquelle,Igor,ausprobieren,Endpreis,links,gekürzt,einkaufen,Lied,Gerhard,gelohnt,nackt,Geburt,gelehrt,einseitig,gedeckt,hinweg,Eduard,Premiere,demografisch,ihre,höchste,wichtigsten,Aufmerksamkeit,Horde,physisch,Arbeitsklima,Brief,Notdurft,proportional,fordern,Ewig,denken,Daniel,Arabisch,edle,golden,Minimum,pure,beibringen,Boden,Anzahl,erschaffen,Energie,sehr,Gerücht,Generation,Räuber,Motivation,Chance,dabei,Programm,segensreich,April,ignorieren,Nase,epochal,Boot,faszinieren,Heilkunde,Helikopter,Computer,Kabarettist,wenig,zukünftig,sechzehn,stimmt,getragen,reagieren,Esoterik,Koralle,Dame,Katastrophe,liefern,Grund,Elend,ausreichen,Notenbank,Garten,zutiefst,Immobilien,Aspekt,naiv,besprechen,zählen,Terminologie,Amerika,Atmosphäre,Iran,debatte,Sound,Zugang,fair,unrentabel,baut,kollektiv,schief,Bank,Mann,Apropos,Ergebnis,Niederlande,Mietshaus,errichten,Ereignis,Portal,erhielten,erleben,Haus,Dschungel,Null,Pleite,Seegras,Entdeckung,also,Ebene,Anbeginn,kohärent,Autor,Mensch,hielt,Reich,Land,bekloppt,außerdem,Berg,gleich,sind,Argument,einverstanden,Euro,Sektor,dagegen,Knappheit,Armut,innerhalb,Blume,Problem,Bruder,Netzwerk,Orte,bedrängen,Aufgabe \ No newline at end of file diff --git a/database/src/factories/balance.factory.ts b/database/src/factories/balance.factory.ts deleted file mode 100644 index 2c344be99..000000000 --- a/database/src/factories/balance.factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { Balance } from '../../entity/Balance' -import { BalanceContext } from '../interface/TransactionContext' - -define(Balance, (faker: typeof Faker, context?: BalanceContext) => { - if (!context || !context.user) { - throw new Error('Balance: No user present!') - } - - const balance = new Balance() - balance.modified = context.modified ? context.modified : faker.date.recent() - balance.recordDate = context.recordDate ? context.recordDate : faker.date.recent() - balance.amount = context.amount ? context.amount : 10000000 - balance.user = context.user - - return balance -}) diff --git a/database/src/factories/login-user-backup.factory.ts b/database/src/factories/login-user-backup.factory.ts deleted file mode 100644 index c4ae18a77..000000000 --- a/database/src/factories/login-user-backup.factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { LoginUserBackup } from '../../entity/LoginUserBackup' -import { LoginUserBackupContext } from '../interface/UserContext' - -define(LoginUserBackup, (faker: typeof Faker, context?: LoginUserBackupContext) => { - if (!context || !context.userId) { - throw new Error('LoginUserBackup: No userId present!') - } - - const userBackup = new LoginUserBackup() - // TODO: Get the real passphrase - userBackup.passphrase = context.passphrase ? context.passphrase : faker.random.words(24) - userBackup.mnemonicType = context.mnemonicType ? context.mnemonicType : 2 - userBackup.userId = context.userId - - return userBackup -}) diff --git a/database/src/factories/login-user-roles.factory.ts b/database/src/factories/login-user-roles.factory.ts deleted file mode 100644 index 5b7ba9c9d..000000000 --- a/database/src/factories/login-user-roles.factory.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { LoginUserRoles } from '../../entity/LoginUserRoles' -import { LoginUserRolesContext } from '../interface/UserContext' - -define(LoginUserRoles, (faker: typeof Faker, context?: LoginUserRolesContext) => { - if (!context) context = {} - if (!context.userId) throw new Error('LoginUserRoles: No userId present!') - if (!context.roleId) throw new Error('LoginUserRoles: No roleId present!') - - const userRoles = new LoginUserRoles() - userRoles.userId = context.userId - userRoles.roleId = context.roleId - - return userRoles -}) diff --git a/database/src/factories/login-user.factory.ts b/database/src/factories/login-user.factory.ts deleted file mode 100644 index a5a28943e..000000000 --- a/database/src/factories/login-user.factory.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { LoginUser } from '../../entity/LoginUser' -import { randomBytes } from 'crypto' -import { LoginUserContext } from '../interface/UserContext' - -define(LoginUser, (faker: typeof Faker, context?: LoginUserContext) => { - if (!context) context = {} - - const user = new LoginUser() - user.email = context.email ? context.email : faker.internet.email() - user.firstName = context.firstName ? context.firstName : faker.name.firstName() - user.lastName = context.lastName ? context.lastName : faker.name.lastName() - user.username = context.username ? context.username : faker.internet.userName() - user.description = context.description ? context.description : faker.random.words(4) - // TODO Create real password and keys/hash - user.password = context.password ? context.password : BigInt(0) - user.pubKey = context.pubKey ? context.pubKey : randomBytes(32) - user.privKey = context.privKey ? context.privKey : randomBytes(80) - user.emailHash = context.emailHash ? context.emailHash : randomBytes(32) - user.createdAt = context.createdAt ? context.createdAt : faker.date.recent() - user.emailChecked = context.emailChecked ? context.emailChecked : true - user.passphraseShown = context.passphraseShown ? context.passphraseShown : false - user.language = context.language ? context.language : 'en' - user.disabled = context.disabled ? context.disabled : false - user.groupId = context.groupId ? context.groupId : 1 - user.publisherId = context.publisherId ? context.publisherId : 0 - - return user -}) diff --git a/database/src/factories/transaction-creation.factory.ts b/database/src/factories/transaction-creation.factory.ts deleted file mode 100644 index ec0b9e8a6..000000000 --- a/database/src/factories/transaction-creation.factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { TransactionCreation } from '../../entity/TransactionCreation' -import { TransactionCreationContext } from '../interface/TransactionContext' - -define(TransactionCreation, (faker: typeof Faker, context?: TransactionCreationContext) => { - if (!context || !context.userId || !context.transaction) { - throw new Error('TransactionCreation: No userId and/or transaction present!') - } - - const transactionCreation = new TransactionCreation() - transactionCreation.userId = context.userId - transactionCreation.amount = context.amount ? context.amount : 100000 - transactionCreation.targetDate = context.targetDate ? context.targetDate : new Date() - transactionCreation.transaction = context.transaction - - return transactionCreation -}) diff --git a/database/src/factories/transaction-signature.factory.ts b/database/src/factories/transaction-signature.factory.ts deleted file mode 100644 index b79e15052..000000000 --- a/database/src/factories/transaction-signature.factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { TransactionSignature } from '../../entity/TransactionSignature' -import { TransactionSignatureContext } from '../interface/TransactionContext' -import { randomBytes } from 'crypto' - -define(TransactionSignature, (faker: typeof Faker, context?: TransactionSignatureContext) => { - if (!context || !context.transaction) { - throw new Error('TransactionSignature: No transaction present!') - } - - const transactionSignature = new TransactionSignature() - transactionSignature.signature = context.signature ? context.signature : randomBytes(64) - transactionSignature.pubkey = context.pubkey ? context.pubkey : randomBytes(32) - transactionSignature.transaction = context.transaction - - return transactionSignature -}) diff --git a/database/src/factories/transaction.factory.ts b/database/src/factories/transaction.factory.ts index 4880ace5b..dd98a88b7 100644 --- a/database/src/factories/transaction.factory.ts +++ b/database/src/factories/transaction.factory.ts @@ -2,19 +2,23 @@ import Faker from 'faker' import { define } from 'typeorm-seeding' import { Transaction } from '../../entity/Transaction' import { TransactionContext } from '../interface/TransactionContext' -import { randomBytes } from 'crypto' +import Decimal from 'decimal.js-light' define(Transaction, (faker: typeof Faker, context?: TransactionContext) => { - if (!context) context = {} + if (!context) { + throw new Error('TransactionContext not well defined.') + } const transaction = new Transaction() - transaction.transactionTypeId = context.transactionTypeId ? context.transactionTypeId : 2 - transaction.txHash = context.txHash ? context.txHash : randomBytes(48) - transaction.memo = context.memo || context.memo === '' ? context.memo : faker.lorem.sentence() - transaction.received = context.received ? context.received : new Date() - transaction.blockchainTypeId = context.blockchainTypeId ? context.blockchainTypeId : 1 - if (context.transactionSendCoin) transaction.transactionSendCoin = context.transactionSendCoin - if (context.transactionCreation) transaction.transactionCreation = context.transactionCreation + transaction.typeId = context.typeId // || 2 + transaction.userId = context.userId + transaction.amount = context.amount + transaction.balance = context.balance + transaction.decay = new Decimal(0) // context.decay + transaction.memo = context.memo + transaction.creationDate = context.creationDate || new Date() + // transaction.sendReceiverPublicKey = context.sendReceiverPublicKey || null + transaction.linkedUserId = context.sendReceiverUserId || null return transaction }) diff --git a/database/src/factories/user-transaction.factory.ts b/database/src/factories/user-transaction.factory.ts deleted file mode 100644 index 7ea79235b..000000000 --- a/database/src/factories/user-transaction.factory.ts +++ /dev/null @@ -1,19 +0,0 @@ -import Faker from 'faker' -import { define } from 'typeorm-seeding' -import { UserTransaction } from '../../entity/UserTransaction' -import { UserTransactionContext } from '../interface/TransactionContext' - -define(UserTransaction, (faker: typeof Faker, context?: UserTransactionContext) => { - if (!context || !context.userId || !context.transactionId) { - throw new Error('UserTransaction: No userId and/or transactionId present!') - } - - const userTransaction = new UserTransaction() - userTransaction.userId = context.userId - userTransaction.transactionId = context.transactionId - userTransaction.transactionTypeId = context.transactionTypeId ? context.transactionTypeId : 1 - userTransaction.balance = context.balance ? context.balance : 100000 - userTransaction.balanceDate = context.balanceDate ? context.balanceDate : new Date() - - return userTransaction -}) diff --git a/database/src/factories/user.factory.ts b/database/src/factories/user.factory.ts index 1f684f23f..d04dcea4c 100644 --- a/database/src/factories/user.factory.ts +++ b/database/src/factories/user.factory.ts @@ -8,14 +8,20 @@ define(User, (faker: typeof Faker, context?: UserContext) => { if (!context) context = {} const user = new User() - user.pubkey = context.pubkey ? context.pubkey : randomBytes(32) + user.pubKey = context.pubKey ? context.pubKey : randomBytes(32) user.email = context.email ? context.email : faker.internet.email() user.firstName = context.firstName ? context.firstName : faker.name.firstName() user.lastName = context.lastName ? context.lastName : faker.name.lastName() - user.username = context.username ? context.username : faker.internet.userName() - user.disabled = context.disabled ? context.disabled : false - user.groupId = 0 - user.indexId = 0 + user.deletedAt = context.deletedAt ? context.deletedAt : null + // TODO Create real password and keys/hash + user.password = context.password ? context.password : BigInt(0) + user.privKey = context.privKey ? context.privKey : randomBytes(80) + user.emailHash = context.emailHash ? context.emailHash : randomBytes(32) + user.createdAt = context.createdAt ? context.createdAt : faker.date.recent() + user.emailChecked = context.emailChecked === undefined ? false : context.emailChecked + user.language = context.language ? context.language : 'en' + user.publisherId = context.publisherId ? context.publisherId : 0 + user.passphrase = context.passphrase ? context.passphrase : faker.random.words(24) return user }) diff --git a/database/src/helpers.ts b/database/src/helpers.ts index 710094548..acd0e6ccd 100644 --- a/database/src/helpers.ts +++ b/database/src/helpers.ts @@ -1,5 +1,6 @@ import CONFIG from './config' import { createPool, PoolConfig } from 'mysql' +import { useSeeding, runSeeder } from 'typeorm-seeding' import { Migration } from 'ts-mysql-migrate' import path from 'path' @@ -31,4 +32,17 @@ const resetDB = async (closePool = false): Promise => { if (closePool) pool.end() } -export { resetDB, pool, migration, initialize } +/* eslint-disable-next-line @typescript-eslint/no-explicit-any */ +const runSeeds = async (seeds: any[]): Promise => { + if (seeds.length > 0) { + await useSeeding({ + root: process.cwd(), + configName: 'ormconfig.js', + }) + for (let i = 0; i < seeds.length; i++) { + await runSeeder(seeds[i]) + } + } +} + +export { resetDB, pool, migration, initialize, runSeeds } diff --git a/database/src/index.ts b/database/src/index.ts index 488d098d3..40c5913e4 100644 --- a/database/src/index.ts +++ b/database/src/index.ts @@ -1,13 +1,14 @@ import 'reflect-metadata' import prepare from './prepare' import connection from './typeorm/connection' -import { useSeeding, runSeeder } from 'typeorm-seeding' import { CreatePeterLustigSeed } from './seeds/users/peter-lustig.admin.seed' import { CreateBibiBloxbergSeed } from './seeds/users/bibi-bloxberg.seed' import { CreateRaeuberHotzenplotzSeed } from './seeds/users/raeuber-hotzenplotz.seed' import { CreateBobBaumeisterSeed } from './seeds/users/bob-baumeister.seed' -import { DecayStartBlockSeed } from './seeds/decay-start-block.seed' -import { resetDB, pool, migration } from './helpers' +import { CreateStephenHawkingSeed } from './seeds/users/stephen-hawking.seed' +import { CreateGarrickOllivanderSeed } from './seeds/users/garrick-ollivander.seed' +import { CreateUserSeed } from './seeds/create-user.seed' +import { resetDB, pool, migration, runSeeds } from './helpers' const run = async (command: string) => { // Database actions not supported by our migration library @@ -35,15 +36,16 @@ const run = async (command: string) => { break case 'seed': // TODO protect from production - await useSeeding({ - root: process.cwd(), - configName: 'ormconfig.js', - }) - await runSeeder(DecayStartBlockSeed) - await runSeeder(CreatePeterLustigSeed) - await runSeeder(CreateBibiBloxbergSeed) - await runSeeder(CreateRaeuberHotzenplotzSeed) - await runSeeder(CreateBobBaumeisterSeed) + // await runSeeder(CreatePeterLustigSeed) + await runSeeds([ + CreatePeterLustigSeed, + CreateBibiBloxbergSeed, + CreateRaeuberHotzenplotzSeed, + CreateBobBaumeisterSeed, + CreateStephenHawkingSeed, + CreateGarrickOllivanderSeed, + ...Array(96).fill(CreateUserSeed), + ]) break default: throw new Error(`Unsupported command ${command}`) diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts index 481959c5f..8eeb579a0 100644 --- a/database/src/interface/TransactionContext.ts +++ b/database/src/interface/TransactionContext.ts @@ -1,52 +1,12 @@ -import { Transaction } from '../../entity/Transaction' -import { TransactionSendCoin } from '../../entity/TransactionSendCoin' -import { TransactionCreation } from '../../entity/TransactionCreation' -import { User } from '../../entity/User' +import Decimal from 'decimal.js-light' export interface TransactionContext { - transactionTypeId?: number - txHash?: Buffer - memo?: string - received?: Date - blockchainTypeId?: number - transactionSendCoin?: TransactionSendCoin - transactionCreation?: TransactionCreation -} - -export interface BalanceContext { - modified?: Date - recordDate?: Date - amount?: number - user?: User -} - -export interface TransactionSendCoinContext { - senderPublic?: Buffer - userId?: number - recipiantPublic?: Buffer - recipiantUserId?: number - amount?: number - senderFinalBalance?: number - transaction?: Transaction -} - -export interface TransactionCreationContext { - userId?: number - amount?: number - targetDate?: Date - transaction?: Transaction -} - -export interface UserTransactionContext { - userId?: number - transactionId?: number - transactionTypeId?: number - balance?: number - balanceDate?: Date -} - -export interface TransactionSignatureContext { - signature?: Buffer - pubkey?: Buffer - transaction?: Transaction + typeId: number + userId: number + balance: Decimal + balanceDate: Date + amount: Decimal + memo: string + creationDate?: Date + sendReceiverUserId?: number } diff --git a/database/src/interface/UserContext.ts b/database/src/interface/UserContext.ts index 4e188904c..f3ccaecf4 100644 --- a/database/src/interface/UserContext.ts +++ b/database/src/interface/UserContext.ts @@ -1,35 +1,17 @@ export interface UserContext { - pubkey?: Buffer - email?: string - firstName?: string - lastName?: string - username?: string - disabled?: boolean -} - -export interface LoginUserContext { - email?: string - firstName?: string - lastName?: string - username?: string - description?: string - password?: BigInt pubKey?: Buffer + email?: string + firstName?: string + lastName?: string + deletedAt?: Date + password?: BigInt privKey?: Buffer emailHash?: Buffer createdAt?: Date emailChecked?: boolean - passphraseShown?: boolean language?: string - disabled?: boolean - groupId?: number - publisherId?: number | null -} - -export interface LoginUserBackupContext { - userId?: number + publisherId?: number passphrase?: string - mnemonicType?: number } export interface ServerUserContext { @@ -42,8 +24,3 @@ export interface ServerUserContext { created?: Date modified?: Date } - -export interface LoginUserRolesContext { - userId?: number - roleId?: number -} diff --git a/database/src/interface/UserInterface.ts b/database/src/interface/UserInterface.ts index 70be6cff4..ca328c092 100644 --- a/database/src/interface/UserInterface.ts +++ b/database/src/interface/UserInterface.ts @@ -1,24 +1,20 @@ +import Decimal from 'decimal.js-light' + export interface UserInterface { - // from login user (contains state user) + // from user email?: string firstName?: string lastName?: string - username?: string - description?: string password?: BigInt pubKey?: Buffer privKey?: Buffer emailHash?: Buffer createdAt?: Date emailChecked?: boolean - passphraseShown?: boolean language?: string - disabled?: boolean - groupId?: number - publisherId?: number | null - // from login user backup + deletedAt?: Date + publisherId?: number passphrase?: string - mnemonicType?: number // from server user serverUserPassword?: string role?: string @@ -30,11 +26,7 @@ export interface UserInterface { // flag for balance (creation of 1000 GDD) addBalance?: boolean // balance - balanceModified?: Date recordDate?: Date - targetDate?: Date - amount?: number - creationTxHash?: Buffer - signature?: Buffer - signaturePubkey?: Buffer + creationDate?: Date + amount?: Decimal } diff --git a/database/src/seeds/create-user.seed.ts b/database/src/seeds/create-user.seed.ts index ca3a182c4..69488a790 100644 --- a/database/src/seeds/create-user.seed.ts +++ b/database/src/seeds/create-user.seed.ts @@ -1,11 +1,8 @@ import { Factory, Seeder } from 'typeorm-seeding' -import { User } from '../../entity/User' -// import { LoginUser } from '../../entity/LoginUser' +import { userSeeder } from './helpers/user-helpers' export class CreateUserSeed implements Seeder { public async run(factory: Factory): Promise { - // const loginUser = await factory(LoginUser)().make() - // console.log(loginUser.email) - await factory(User)().create() + await userSeeder(factory, {}) } } diff --git a/database/src/seeds/decay-start-block.seed.ts b/database/src/seeds/decay-start-block.seed.ts deleted file mode 100644 index fd62ee333..000000000 --- a/database/src/seeds/decay-start-block.seed.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Factory, Seeder } from 'typeorm-seeding' -import { Transaction } from '../../entity/Transaction' - -export class DecayStartBlockSeed implements Seeder { - public async run(factory: Factory): Promise { - await factory(Transaction)({ - transactionTypeId: 9, - txHash: Buffer.from( - '9c9c4152b8a4cfbac287eee18d2d262e9de756fae726fc0ca36b788564973fff00000000000000000000000000000000', - 'hex', - ), - memo: '', - received: new Date('2021-11-30T09:13:26'), - blockchainTypeId: 1, - }).create() - } -} diff --git a/database/src/seeds/helpers/user-helpers.ts b/database/src/seeds/helpers/user-helpers.ts index bd46ecdee..7485c038e 100644 --- a/database/src/seeds/helpers/user-helpers.ts +++ b/database/src/seeds/helpers/user-helpers.ts @@ -1,108 +1,47 @@ -import { - UserContext, - LoginUserContext, - LoginUserBackupContext, - ServerUserContext, - LoginUserRolesContext, -} from '../../interface/UserContext' -import { - BalanceContext, - TransactionContext, - TransactionCreationContext, - UserTransactionContext, - TransactionSignatureContext, -} from '../../interface/TransactionContext' +import { UserContext, ServerUserContext } from '../../interface/UserContext' +import { TransactionContext } from '../../interface/TransactionContext' import { UserInterface } from '../../interface/UserInterface' import { User } from '../../../entity/User' -import { LoginUser } from '../../../entity/LoginUser' -import { LoginUserBackup } from '../../../entity/LoginUserBackup' import { ServerUser } from '../../../entity/ServerUser' -import { LoginUserRoles } from '../../../entity/LoginUserRoles' -import { Balance } from '../../../entity/Balance' import { Transaction } from '../../../entity/Transaction' -import { TransactionSignature } from '../../../entity/TransactionSignature' -import { UserTransaction } from '../../../entity/UserTransaction' -import { TransactionCreation } from '../../../entity/TransactionCreation' import { Factory } from 'typeorm-seeding' +import Decimal from 'decimal.js-light' export const userSeeder = async (factory: Factory, userData: UserInterface): Promise => { const user = await factory(User)(createUserContext(userData)).create() - const loginUser = await factory(LoginUser)(createLoginUserContext(userData)).create() - await factory(LoginUserBackup)(createLoginUserBackupContext(userData, loginUser)).create() if (userData.isAdmin) { await factory(ServerUser)(createServerUserContext(userData)).create() - - // This is crazy: we just need the relation to roleId but no role at all - // It works with LoginRoles empty!! - await factory(LoginUserRoles)(createLoginUserRolesContext(loginUser)).create() } if (userData.addBalance) { // create some GDD for the user - await factory(Balance)(createBalanceContext(userData, user)).create() - const transaction = await factory(Transaction)( - createTransactionContext(userData, 1, 'Herzlich Willkommen bei Gradido!'), - ).create() - await factory(TransactionCreation)( - createTransactionCreationContext(userData, user, transaction), - ).create() - await factory(UserTransaction)( - createUserTransactionContext(userData, user, transaction), - ).create() - await factory(TransactionSignature)( - createTransactionSignatureContext(userData, transaction), + await factory(Transaction)( + createTransactionContext(userData, user, 1, 'Herzlich Willkommen bei Gradido!'), ).create() } } const createUserContext = (context: UserInterface): UserContext => { return { - pubkey: context.pubKey, - email: context.email, - firstName: context.firstName, - lastName: context.lastName, - username: context.username, - disabled: context.disabled, - } -} - -const createLoginUserContext = (context: UserInterface): LoginUserContext => { - return { - email: context.email, - firstName: context.firstName, - lastName: context.lastName, - username: context.username, - description: context.description, - password: context.password, pubKey: context.pubKey, + email: context.email, + firstName: context.firstName, + lastName: context.lastName, + deletedAt: context.deletedAt, + password: context.password, privKey: context.privKey, emailHash: context.emailHash, createdAt: context.createdAt, emailChecked: context.emailChecked, - passphraseShown: context.passphraseShown, language: context.language, - disabled: context.disabled, - groupId: context.groupId, publisherId: context.publisherId, } } -const createLoginUserBackupContext = ( - context: UserInterface, - loginUser: LoginUser, -): LoginUserBackupContext => { - return { - passphrase: context.passphrase, - mnemonicType: context.mnemonicType, - userId: loginUser.id, - } -} - const createServerUserContext = (context: UserInterface): ServerUserContext => { return { role: context.role, - username: context.username, password: context.serverUserPassword, email: context.email, activated: context.activated, @@ -112,69 +51,19 @@ const createServerUserContext = (context: UserInterface): ServerUserContext => { } } -const createLoginUserRolesContext = (loginUser: LoginUser): LoginUserRolesContext => { - return { - userId: loginUser.id, - roleId: 1, - } -} - -const createBalanceContext = (context: UserInterface, user: User): BalanceContext => { - return { - modified: context.balanceModified, - recordDate: context.recordDate, - amount: context.amount, - user, - } -} - const createTransactionContext = ( context: UserInterface, + user: User, type: number, memo: string, ): TransactionContext => { return { - transactionTypeId: type, - txHash: context.creationTxHash, + typeId: type, + userId: user.id, + amount: context.amount || new Decimal(1000), + balance: context.amount || new Decimal(1000), + balanceDate: new Date(context.recordDate || Date.now()), memo, - received: context.recordDate, - } -} - -const createTransactionCreationContext = ( - context: UserInterface, - user: User, - transaction: Transaction, -): TransactionCreationContext => { - return { - userId: user.id, - amount: context.amount, - targetDate: context.targetDate, - transaction, - } -} - -const createUserTransactionContext = ( - context: UserInterface, - user: User, - transaction: Transaction, -): UserTransactionContext => { - return { - userId: user.id, - transactionId: transaction.id, - transactionTypeId: transaction.transactionTypeId, - balance: context.amount, - balanceDate: context.recordDate, - } -} - -const createTransactionSignatureContext = ( - context: UserInterface, - transaction: Transaction, -): TransactionSignatureContext => { - return { - signature: context.signature, - pubkey: context.signaturePubkey, - transaction, + creationDate: context.creationDate, } } diff --git a/database/src/seeds/users/bibi-bloxberg.ts b/database/src/seeds/users/bibi-bloxberg.ts index 30ad4eb4c..a055a283b 100644 --- a/database/src/seeds/users/bibi-bloxberg.ts +++ b/database/src/seeds/users/bibi-bloxberg.ts @@ -1,9 +1,11 @@ -export const bibiBloxberg = { +import Decimal from 'decimal.js-light' +import { UserInterface } from '../../interface/UserInterface' + +export const bibiBloxberg: UserInterface = { email: 'bibi@bloxberg.de', firstName: 'Bibi', lastName: 'Bloxberg', - username: 'bibi', - description: 'Hex Hex', + // description: 'Hex Hex', password: BigInt('12825419584724616625'), pubKey: Buffer.from('42de7e4754625b730018c3b4ea745a4d043d9d867af352d0f08871793dfa6743', 'hex'), privKey: Buffer.from( @@ -13,30 +15,12 @@ export const bibiBloxberg = { emailHash: Buffer.from('38a0d8c8658a5681cc1180c5d9e2b2a18e4f611db8ab3ca61de4aa91ae94219b', 'hex'), createdAt: new Date('2021-11-26T11:32:16'), emailChecked: true, - passphraseShown: false, language: 'de', - disabled: false, - groupId: 1, - publisherId: null, passphrase: 'knife normal level all hurdle crucial color avoid warrior stadium road bachelor affair topple hawk pottery right afford immune two ceiling budget glance hour ', - mnemonicType: 2, isAdmin: false, addBalance: true, - balanceModified: new Date('2021-11-30T10:37:11'), recordDate: new Date('2021-11-30T10:37:11'), - targetDate: new Date('2021-08-01 00:00:00'), - amount: 10000000, - creationTxHash: Buffer.from( - '51103dc0fc2ca5d5d75a9557a1e899304e5406cfdb1328d8df6414d527b0118100000000000000000000000000000000', - 'hex', - ), - signature: Buffer.from( - '2a2c71f3e41adc060bbc3086577e2d57d24eeeb0a7727339c3f85aad813808f601d7e1df56a26e0929d2e67fc054fca429ccfa283ed2782185c7f009fe008f0c', - 'hex', - ), - signaturePubkey: Buffer.from( - '7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', - 'hex', - ), + creationDate: new Date('2021-08-01 00:00:00'), + amount: new Decimal(1000), } diff --git a/database/src/seeds/users/bob-baumeister.ts b/database/src/seeds/users/bob-baumeister.ts index a6933d7c1..4a50a7e63 100644 --- a/database/src/seeds/users/bob-baumeister.ts +++ b/database/src/seeds/users/bob-baumeister.ts @@ -1,9 +1,11 @@ -export const bobBaumeister = { +import Decimal from 'decimal.js-light' +import { UserInterface } from '../../interface/UserInterface' + +export const bobBaumeister: UserInterface = { email: 'bob@baumeister.de', firstName: 'Bob', lastName: 'der Baumeister', - username: 'bob', - description: 'Können wir das schaffen? Ja, wir schaffen das!', + // description: 'Können wir das schaffen? Ja, wir schaffen das!', password: BigInt('3296644341468822636'), pubKey: Buffer.from('a509d9a146374fc975e3677db801ae8a4a83bff9dea96da64053ff6de6b2dd7e', 'hex'), privKey: Buffer.from( @@ -13,30 +15,12 @@ export const bobBaumeister = { emailHash: Buffer.from('4b8ce4e175587aaf33da19e272719da1a547daff557820191fab0c65c5a3b7f1', 'hex'), createdAt: new Date('2021-11-26T11:36:31'), emailChecked: true, - passphraseShown: false, language: 'de', - disabled: false, - groupId: 1, - publisherId: null, passphrase: 'detail master source effort unable waste tilt flush domain orchard art truck hint barrel response gate impose peanut secret merry three uncle wink resource ', - mnemonicType: 2, isAdmin: false, addBalance: true, - balanceModified: new Date('2021-11-30T10:37:14'), recordDate: new Date('2021-11-30T10:37:14'), - targetDate: new Date('2021-08-01 00:00:00'), - amount: 10000000, - creationTxHash: Buffer.from( - 'be095dc87acb94987e71168fee8ecbf50ecb43a180b1006e75d573b35725c69c00000000000000000000000000000000', - 'hex', - ), - signature: Buffer.from( - '1fbd6b9a3d359923b2501557f3bc79fa7e428127c8090fb16bc490b4d87870ab142b3817ddd902d22f0b26472a483233784a0e460c0622661752a13978903905', - 'hex', - ), - signaturePubkey: Buffer.from( - '7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', - 'hex', - ), + creationDate: new Date('2021-08-01 00:00:00'), + amount: new Decimal(1000), } diff --git a/database/src/seeds/users/garrick-ollivander.seed.ts b/database/src/seeds/users/garrick-ollivander.seed.ts new file mode 100644 index 000000000..54adc3475 --- /dev/null +++ b/database/src/seeds/users/garrick-ollivander.seed.ts @@ -0,0 +1,9 @@ +import { Factory, Seeder } from 'typeorm-seeding' +import { garrickOllivander } from './garrick-ollivander' +import { userSeeder } from '../helpers/user-helpers' + +export class CreateGarrickOllivanderSeed implements Seeder { + public async run(factory: Factory): Promise { + await userSeeder(factory, garrickOllivander) + } +} diff --git a/database/src/seeds/users/garrick-ollivander.ts b/database/src/seeds/users/garrick-ollivander.ts new file mode 100644 index 000000000..3f18a875c --- /dev/null +++ b/database/src/seeds/users/garrick-ollivander.ts @@ -0,0 +1,18 @@ +import { UserInterface } from '../../interface/UserInterface' + +export const garrickOllivander: UserInterface = { + email: 'garrick@ollivander.com', + firstName: 'Garrick', + lastName: 'Ollivander', + // description: `Curious ... curious ... + // Renowned wandmaker Mr Ollivander owns the wand shop Ollivanders: Makers of Fine Wands Since 382 BC in Diagon Alley. His shop is widely considered the best place to purchase a wand.`, + password: BigInt('0'), + emailHash: Buffer.from('91e358000e908146342789979d62a7255b2b88a71dad0c6a10e32af44be57886', 'hex'), + createdAt: new Date('2022-01-10T10:23:17'), + emailChecked: false, + language: 'en', + passphrase: + 'human glide theory clump wish history other duty door fringe neck industry ostrich equal plate diesel tornado neck people antenna door category moon hen ', + isAdmin: false, + addBalance: false, +} diff --git a/database/src/seeds/users/peter-lustig.ts b/database/src/seeds/users/peter-lustig.ts index 63caf55f6..5b4b98488 100644 --- a/database/src/seeds/users/peter-lustig.ts +++ b/database/src/seeds/users/peter-lustig.ts @@ -1,9 +1,10 @@ -export const peterLustig = { +import { UserInterface } from '../../interface/UserInterface' + +export const peterLustig: UserInterface = { email: 'peter@lustig.de', firstName: 'Peter', lastName: 'Lustig', - username: 'peter', - description: 'Latzhose und Nickelbrille', + // description: 'Latzhose und Nickelbrille', password: BigInt('3917921995996627700'), pubKey: Buffer.from('7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', 'hex'), privKey: Buffer.from( @@ -13,14 +14,9 @@ export const peterLustig = { emailHash: Buffer.from('9f700e6f6ec351a140b674c0edd4479509697b023bd8bee8826915ef6c2af036', 'hex'), createdAt: new Date('2020-11-25T10:48:43'), emailChecked: true, - passphraseShown: false, language: 'de', - disabled: false, - groupId: 1, - publisherId: null, passphrase: 'okay property choice naive calm present weird increase stuff royal vibrant frame attend wood one else tribe pull hedgehog woman kitchen hawk snack smart ', - mnemonicType: 2, role: 'admin', serverUserPassword: '$2y$10$TzIWLeZoKs251gwrhSQmHeKhKI/EQ4EV5ClfAT8Ufnb4lcUXPa5X.', activated: 1, diff --git a/database/src/seeds/users/raeuber-hotzenplotz.ts b/database/src/seeds/users/raeuber-hotzenplotz.ts index eb2118af5..879892f15 100644 --- a/database/src/seeds/users/raeuber-hotzenplotz.ts +++ b/database/src/seeds/users/raeuber-hotzenplotz.ts @@ -1,9 +1,11 @@ -export const raeuberHotzenplotz = { +import Decimal from 'decimal.js-light' +import { UserInterface } from '../../interface/UserInterface' + +export const raeuberHotzenplotz: UserInterface = { email: 'raeuber@hotzenplotz.de', firstName: 'Räuber', lastName: 'Hotzenplotz', - username: 'räuber', - description: 'Pfefferpistole', + // description: 'Pfefferpistole', password: BigInt('12123692783243004812'), pubKey: Buffer.from('d7c70f94234dff071d982aa8f41583876c356599773b5911b39080da2b8c2d2b', 'hex'), privKey: Buffer.from( @@ -13,30 +15,12 @@ export const raeuberHotzenplotz = { emailHash: Buffer.from('ec8d34112adb40ff2f6538b05660b03440372690f034cd7d6322d17020233c77', 'hex'), createdAt: new Date('2021-11-26T11:32:16'), emailChecked: true, - passphraseShown: false, language: 'de', - disabled: false, - groupId: 1, - publisherId: null, passphrase: 'gospel trip tenant mouse spider skill auto curious man video chief response same little over expire drum display fancy clinic keen throw urge basket ', - mnemonicType: 2, isAdmin: false, addBalance: true, - balanceModified: new Date('2021-11-30T10:37:13'), recordDate: new Date('2021-11-30T10:37:13'), - targetDate: new Date('2021-08-01 00:00:00'), - amount: 10000000, - creationTxHash: Buffer.from( - '23ba44fd84deb59b9f32969ad0cb18bfa4588be1bdb99c396888506474c16c1900000000000000000000000000000000', - 'hex', - ), - signature: Buffer.from( - '756d3da061687c575d1dbc5073908f646aa5f498b0927b217c83b48af471450e571dfe8421fb8e1f1ebd1104526b7e7c6fa78684e2da59c8f7f5a8dc3d9e5b0b', - 'hex', - ), - signaturePubkey: Buffer.from( - '7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', - 'hex', - ), + creationDate: new Date('2021-08-01 00:00:00'), + amount: new Decimal(1000), } diff --git a/database/src/seeds/users/stephen-hawking.seed.ts b/database/src/seeds/users/stephen-hawking.seed.ts new file mode 100644 index 000000000..07e129140 --- /dev/null +++ b/database/src/seeds/users/stephen-hawking.seed.ts @@ -0,0 +1,9 @@ +import { Factory, Seeder } from 'typeorm-seeding' +import { stephenHawking } from './stephen-hawking' +import { userSeeder } from '../helpers/user-helpers' + +export class CreateStephenHawkingSeed implements Seeder { + public async run(factory: Factory): Promise { + await userSeeder(factory, stephenHawking) + } +} diff --git a/database/src/seeds/users/stephen-hawking.ts b/database/src/seeds/users/stephen-hawking.ts new file mode 100644 index 000000000..9bfd83704 --- /dev/null +++ b/database/src/seeds/users/stephen-hawking.ts @@ -0,0 +1,23 @@ +import { UserInterface } from '../../interface/UserInterface' + +export const stephenHawking: UserInterface = { + email: 'stephen@hawking.uk', + firstName: 'Stephen', + lastName: 'Hawking', + // description: 'A Brief History of Time', + password: BigInt('18075098469449931746'), + pubKey: Buffer.from('19576a7aab8cd4ce683ed6735bba937d6bdbd08016568f730a385b6481241213', 'hex'), + privKey: Buffer.from( + '1d8ce9b5df086a713fee9eb562adc127073f3211a6214a54e53eb22c1249d49e1e94580ab00f25fd4b38808c1e31b41624ef627f277d21ef5d5717d4b81958f13dc2b257759caba07c6fdbc72f86ab0f', + 'hex', + ), + emailHash: Buffer.from('71d4ed7a25d2130d445d6451135eefbbdd96c3105dd297783590ced0bf3116fd', 'hex'), + createdAt: new Date('1942-01-08T09:17:52'), + deletedAt: new Date('2018-03-14T09:17:52'), + emailChecked: true, + language: 'en', + passphrase: + 'demise tree praise funny ignore despair vessel shop sorry try day peanut tongue toddler bone december inch chicken clump sheriff weasel rally check suggest ', + isAdmin: false, + addBalance: false, +} diff --git a/database/src/typeorm.ts b/database/src/typeorm.ts new file mode 100644 index 000000000..4b4f494f1 --- /dev/null +++ b/database/src/typeorm.ts @@ -0,0 +1 @@ +export * from 'typeorm' diff --git a/database/src/typeorm/DecimalTransformer.ts b/database/src/typeorm/DecimalTransformer.ts new file mode 100644 index 000000000..92efaf3bc --- /dev/null +++ b/database/src/typeorm/DecimalTransformer.ts @@ -0,0 +1,19 @@ +import Decimal from 'decimal.js-light' +import { ValueTransformer } from 'typeorm' + +Decimal.set({ + precision: 25, + rounding: Decimal.ROUND_HALF_UP, +}) + +export const DecimalTransformer: ValueTransformer = { + /** + * Used to marshal Decimal when writing to the database. + */ + to: (decimal: Decimal | null): string | null => (decimal ? decimal.toString() : null), + + /** + * Used to unmarshal Decimal when reading from the database. + */ + from: (decimal: string | null): Decimal | null => (decimal ? new Decimal(decimal) : null), +} diff --git a/database/yarn.lock b/database/yarn.lock index 55e2c7ff5..3bd75df27 100644 --- a/database/yarn.lock +++ b/database/yarn.lock @@ -560,6 +560,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js-light@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" diff --git a/deployment/bare_metal/.env.dist b/deployment/bare_metal/.env.dist new file mode 100644 index 000000000..ee0ac3cc3 --- /dev/null +++ b/deployment/bare_metal/.env.dist @@ -0,0 +1,66 @@ +GRADIDO_LOG_PATH=/home/gradido/gradido/deployment/bare_metal/log + +# start script +DEPLOY_SEED_DATA=false + +# nginx +NGINX_REWRITE_LEGACY_URLS=true +NGINX_SSL=true +NGINX_SERVER_NAME=stage1.gradido.net +NGINX_SSL_CERTIFICATE=/etc/letsencrypt/live/stage1.gradido.net/fullchain.pem +NGINX_SSL_CERTIFICATE_KEY=/etc/letsencrypt/live/stage1.gradido.net/privkey.pem +NGINX_SSL_DHPARAM=/etc/letsencrypt/ssl-dhparams.pem +NGINX_SSL_INCLUDE=/etc/letsencrypt/options-ssl-nginx.conf +NGINX_UPDATE_PAGE_ROOT=/home/gradido/gradido/deployment/bare_metal/nginx/update-page + +# webhook +WEBHOOK_GITHUB_SECRET=secret +WEBHOOK_GITHUB_BRANCH=master + +# backend +BACKEND_CONFIG_VERSION=v1.2022-03-18 + +EMAIL=true +EMAIL_USERNAME=peter@lustig.de +EMAIL_SENDER=peter@lustig.de +EMAIL_PASSWORD=1234 +EMAIL_SMTP_URL=smtp.lustig.de +EMAIL_LINK_VERIFICATION=https://stage1.gradido.net/checkEmail/{code} +EMAIL_LINK_SETPASSWORD=https://stage1.gradido.net/reset/{code} + +TYPEORM_LOGGING_RELATIVE_PATH=../deployment/bare_metal/log/typeorm.backend.log + +WEBHOOK_ELOPAGE_SECRET=secret + +GDT_API_URL=https://gdt.gradido.net + +COMMUNITY_NAME="Gradido Development Stage1" +COMMUNITY_URL=https://stage1.gradido.net/ +COMMUNITY_REGISTER_URL=https://stage1.gradido.net/register +COMMUNITY_DESCRIPTION="Gradido Development Stage1 Test Community" + +KLICKTIPP=false +KLICKTIPP_USER= +KLICKTIPP_PASSWORD= +KLICKTIPP_APIKEY_DE= +KLICKTIPP_APIKEY_EN= + +# database +DATABASE_CONFIG_VERSION=v1.2022-03-18 + +# frontend +GRAPHQL_URI=https://stage1.gradido.net/graphql +ADMIN_AUTH_URL=https://stage1.gradido.net/admin/authenticate?token={token} + +META_URL=http://localhost +META_TITLE_DE="Gradido – Dein Dankbarkeitskonto" +META_TITLE_EN="Gradido - Your gratitude account" +META_DESCRIPTION_DE="Dankbarkeit ist die Währung der neuen Zeit. Immer mehr Menschen entfalten ihr Potenzial und gestalten eine gute Zukunft für alle." +META_DESCRIPTION_EN="Gratitude is the currency of the new age. More and more people are unleashing their potential and shaping a good future for all." +META_KEYWORDS_DE="Grundeinkommen, Währung, Dankbarkeit, Schenk-Ökonomie, Natürliche Ökonomie des Lebens, Ökonomie, Ökologie, Potenzialentfaltung, Schenken und Danken, Kreislauf des Lebens, Geldsystem" +META_KEYWORDS_EN="Basic Income, Currency, Gratitude, Gift Economy, Natural Economy of Life, Economy, Ecology, Potential Development, Giving and Thanking, Cycle of Life, Monetary System" +META_AUTHOR="Bernd Hückstädt - Gradido-Akademie" + +# admin +WALLET_AUTH_URL=https://stage1.gradido.net/authenticate?token={token} +WALLET_URL=https://stage1.gradido.net/login \ No newline at end of file diff --git a/deployment/bare_metal/backup.sh b/deployment/bare_metal/backup.sh new file mode 100755 index 000000000..73a997646 --- /dev/null +++ b/deployment/bare_metal/backup.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# This script will shut down all services, backup the whole database and restart the services + +# Find current directory & configure paths +set -o allexport +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) +PROJECT_ROOT=$SCRIPT_DIR/../.. +set +o allexport + +# Load backend .env for DB_USERNAME, DB_PASSWORD & DB_DATABASE +# NOTE: all config values will be in process.env when starting +# the services and will therefore take precedence over the .env +if [ -f "$PROJECT_ROOT/backend/.env" ]; then + export $(cat $PROJECT_ROOT/backend/.env | sed 's/#.*//g' | xargs) +else + export $(cat $PROJECT_ROOT/backend/.env.dist | sed 's/#.*//g' | xargs) +fi + +# Stop Services +pm2 stop gradido-backend + +# Backup data +mysqldump --databases --single-transaction --quick --hex-blob --lock-tables=false > ${SCRIPT_DIR}/backup/mariadb-backup-$(date +%d-%m-%Y_%H-%M-%S).sql -u ${DB_USER} -p${DB_PASSWORD} ${DB_DATABASE} + +# Start Services +pm2 start gradido-backend \ No newline at end of file diff --git a/backend/src/graphql/model/CreatePendingCreation.ts b/deployment/bare_metal/backup/.gitkeep similarity index 100% rename from backend/src/graphql/model/CreatePendingCreation.ts rename to deployment/bare_metal/backup/.gitkeep diff --git a/deployment/bare_metal/build_and_start_login_server.sh b/deployment/bare_metal/build_and_start_login_server.sh deleted file mode 100755 index b97d1d4a9..000000000 --- a/deployment/bare_metal/build_and_start_login_server.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# stop login_server running in screen -screen -XS login quit - -# rebuild login-server -cd ../../login_server -if [ ! -d "./build" ] ; then - cd scripts - ./prepare_build.sh - cd .. -fi -cd build -cmake .. -make -j$(nproc) Gradido_LoginServer - -# rebuild locales -cd ../scripts -./compile_pot.sh -cd ../src/LOCALE -cp *.mo *.po /etc/grd_login/LOCALE/ - -cd ../../build/bin - -# start login-server -screen -dmS 'login_server' bash -c './Gradido_LoginServer' - - - diff --git a/deployment/bare_metal/import_old_production.sh b/deployment/bare_metal/import_old_production.sh new file mode 100755 index 000000000..546ab8ea5 --- /dev/null +++ b/deployment/bare_metal/import_old_production.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +set -o allexport +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) +PROJECT_ROOT=$SCRIPT_DIR/../.. +set +o allexport + +BACKUP_FILE_LOGIN=$1 #gradido_login_22-01-24.sql +BACKUP_FILE_COMMUNITY=$2 #gradido_node_22-01-24.sql + +# Load backend .env for DB_USERNAME, DB_PASSWORD & DB_DATABASE +# NOTE: all config values will be in process.env when starting +# the services and will therefore take precedence over the .env +if [ -f "$PROJECT_ROOT/backend/.env" ]; then + export $(cat $PROJECT_ROOT/backend/.env | sed 's/#.*//g' | xargs) +else + export $(cat $PROJECT_ROOT/backend/.env.dist | sed 's/#.*//g' | xargs) +fi + +# Delete whole database +sudo mysql -uroot -e "show databases" | grep -v Database | grep -v mysql| grep -v information_schema| gawk '{print "drop database `" $1 "`;select sleep(0.1);"}' | sudo mysql -uroot + +BACKUP_LOGIN=$SCRIPT_DIR/backup/$BACKUP_FILE_LOGIN +BACKUP_COMMUNITY=$SCRIPT_DIR/backup/$BACKUP_FILE_COMMUNITY + +# import backup login +mysql -u ${DB_USER} -p${DB_PASSWORD} < gradido ALL=(ALL) NOPASSWD: /etc/init.d/nginx start,/etc/init.d/nginx stop,/etc/init.d/nginx restart +sudo chmod a+rw /etc/nginx/sites-enabled + +# Install node 16.x +sudo apt-get install -y curl +curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - +sudo apt-get install -y nodejs +sudo apt-get install -y build-essential + +# Install yarn +sudo apt-get install -y gnupg +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +sudo apt-get update +sudo apt-get install -y yarn + +# Install pm2 +sudo yarn global add pm2 +pm2 startup +> execute command output in shell + +# Install certbot +sudo apt-get install -y certbot +sudo apt-get install -y python3-certbot-nginx +sudo certbot +> Enter email address (used for urgent renewal and security notices) > support@gradido.net +> Please read the Terms of Service at > Y +> Would you be willing, once your first certificate is successfully issued, to > N +> No names were found in your configuration files. Please enter in your domain > stage1.gradido.net +# Note: this will throw an error regarding not beeing able to identify the nginx corresponding +# config but produce the required certificate - thats perfectly fine this way + +# Install logrotate +sudo apt-get install -y logrotate +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $SCRIPT_DIR/logrotate/gradido.conf.template > $SCRIPT_DIR/logrotate/gradido.conf +sudo mv $SCRIPT_DIR/logrotate/gradido.conf /etc/logrotate.d/gradido.conf +sudo chown root:root /etc/logrotate.d/gradido.conf + +# Install mysql autobackup +sudo apt-get install -y automysqlbackup + +# Webhooks (optional) (for development) +sudo apt install -y webhook +# TODO generate +# put hook into github +# TODO adjust secret +# TODO adjust branch if needed +# https://stage1.gradido.net/hooks/github +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $SCRIPT_DIR/webhook/hooks.json.template > ~/hooks.json + +webhook -hooks ~/hooks.json & +# or for debugging +# webhook -hooks ~/hooks.json -verbose + +# create db user +export DB_USER=gradido +export DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo); +sudo mysql < $PROJECT_ROOT/database/.env + +# Configure backend +export JWT_SECRET=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo); +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/backend/.env.template > $PROJECT_ROOT/backend/.env + +# Configure frontend +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env.template > $PROJECT_ROOT/frontend/.env + +# Configure admin +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env + +# Start gradido +# Note: on first startup some errors will occur - nothing serious +./start.sh \ No newline at end of file diff --git a/community_server/plugins/empty b/deployment/bare_metal/log/.gitkeep similarity index 100% rename from community_server/plugins/empty rename to deployment/bare_metal/log/.gitkeep diff --git a/deployment/bare_metal/logrotate/gradido.conf.template b/deployment/bare_metal/logrotate/gradido.conf.template new file mode 100644 index 000000000..c543b54c2 --- /dev/null +++ b/deployment/bare_metal/logrotate/gradido.conf.template @@ -0,0 +1,7 @@ +$GRADIDO_LOG_PATH/*.log { + weekly + rotate 26 + size 10M + compress + delaycompress +} \ No newline at end of file diff --git a/deployment/bare_metal/maintenance.sh b/deployment/bare_metal/maintenance.sh new file mode 100755 index 000000000..4a268d270 --- /dev/null +++ b/deployment/bare_metal/maintenance.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# update system +sudo apt-get update +sudo apt-get upgrade + +# update pm2 +sudo yarn global add pm2 +pm2 update \ No newline at end of file diff --git a/deployment/bare_metal/nginx/common/protect.conf b/deployment/bare_metal/nginx/common/protect.conf new file mode 100644 index 000000000..6ad33bd8e --- /dev/null +++ b/deployment/bare_metal/nginx/common/protect.conf @@ -0,0 +1,54 @@ +# Deny access to readme.(txt|html) or license.(txt|html) or example.(txt|html) and other common git related files +location ~* "/(^$|readme|license|example|README|LEGALNOTICE|INSTALLATION|CHANGELOG)\.(txt|html|md)" { + deny all; +} +# Deny access to backup extensions & log files +location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" { + deny all; +} +# deny access to hidden files and directories +location ~ /\.(?!well-known\/) { + deny all; +} +# deny access to base64 encoded urls +location ~* "(base64_encode)(.*)(\()" { + deny all; +} +# deny access to url with the javascript eval() function +location ~* "(eval\()" { + deny all; +} +# deny access to url which include \"127.0.0.1\" +location ~* "(127\.0\.0\.1)" { + deny all; +} +location ~* "(GLOBALS|REQUEST)(=|\[|%)" { + deny all; +} +location ~* "(<|%3C).*script.*(>|%3)" { + deny all; +} +location ~ "(\\|\.\.\.|\.\./|~|`|<|>|\|)" { + deny all; +} +location ~* "(\'|\")(.*)(drop|insert|md5|select|union)" { + deny all; +} +location ~* "(https?|ftp|php):/" { + deny all; +} +location ~* "(=\\\'|=\\%27|/\\\'/?)\." { + deny all; +} +location ~ "(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")" { + deny all; +} +location ~ "(~|`|<|>|:|;|%|\\|\s|\{|\}|\[|\]|\|)" { + deny all; +} +location ~* "(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|boot\.ini|etc/passwd|eval\(|self/environ|(wp-)?config\.|cgi-|muieblack)" { + deny all; +} +location ~* "/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell|config|configuration)\.php" { + deny all; +} \ No newline at end of file diff --git a/deployment/bare_metal/nginx/common/protect_add_header.conf b/deployment/bare_metal/nginx/common/protect_add_header.conf new file mode 100644 index 000000000..998f10696 --- /dev/null +++ b/deployment/bare_metal/nginx/common/protect_add_header.conf @@ -0,0 +1,9 @@ +# Prevent browsers from incorrectly detecting non-scripts as scripts +# https://infosec.mozilla.org/guidelines/web_security#x-content-type-options +add_header X-Content-Type-Options "nosniff"; + +# prevent clickjacking: https://www.owasp.org/index.php/Clickjacking +# https://geekflare.com/add-x-frame-options-nginx/ +# https://infosec.mozilla.org/guidelines/web_security#x-frame-options +add_header Content-Security-Policy "frame-ancestors 'none'"; +add_header X-Frame-Options "DENY"; \ No newline at end of file diff --git a/deployment/bare_metal/nginx/conf.d/logging.conf b/deployment/bare_metal/nginx/conf.d/logging.conf new file mode 100644 index 000000000..a76e8fae7 --- /dev/null +++ b/deployment/bare_metal/nginx/conf.d/logging.conf @@ -0,0 +1,4 @@ +log_format gradido_log '$remote_addr - $remote_user [$time_local] ' + '"$request_method $status $request_uri"' + ' "$http_referer" "$http_user_agent"' + ' $server_protocol $body_bytes_sent $request_time'; \ No newline at end of file diff --git a/deployment/bare_metal/nginx/sites-available/gradido b/deployment/bare_metal/nginx/sites-available/gradido deleted file mode 100644 index c32d82483..000000000 --- a/deployment/bare_metal/nginx/sites-available/gradido +++ /dev/null @@ -1,73 +0,0 @@ -server { - server_name _; - listen 80; - listen [::]:80; - - include /etc/nginx/common/protect.conf; - include /etc/nginx/common/protect_add_header.conf; - - root /var/www/html/gradido/community_server/webroot; - index index.php; - - gzip_static on; - - - location ~ \.php$ { - include snippets/fastcgi-php.conf; - fastcgi_pass unix:/run/php/php7.4-fpm.sock; - } - - location ~ /\.ht { - deny all; - } - - location /vue { - alias /var/www/html/gradido/frontend/dist; - index index.html; - - location ~* \.(png)$ { - expires 39d; - } - try_files $uri $uri/ /index.html = 404; - } - - location /account { - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_cache_bypass $http_upgrade; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header Host $host; - rewrite /account/(.*) /$1 break; - - proxy_pass http://127.0.0.1:1200; - proxy_redirect off; - - - } - - location /login_api { - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_cache_bypass $http_upgrade; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header Host $host; - rewrite /login_api/(.*) /$1 break; - - proxy_pass http://127.0.0.1:1201; - proxy_redirect off; - - - } - - - location / { - try_files $uri $uri/ /index.php?$args; - } - - access_log /var/log/nginx/access.log main; - -} diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template new file mode 100644 index 000000000..aade0429b --- /dev/null +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.ssl.template @@ -0,0 +1,125 @@ +server { + if ($host = $NGINX_SERVER_NAME) { + return 301 https://$host$request_uri; + } + + server_name $NGINX_SERVER_NAME; + listen 80; + listen [::]:80; + return 404; +} + +server { + server_name $NGINX_SERVER_NAME; + + listen [::]:443 ssl ipv6only=on; + listen 443 ssl; + ssl_certificate $NGINX_SSL_CERTIFICATE; + ssl_certificate_key $NGINX_SSL_CERTIFICATE_KEY; + include $NGINX_SSL_INCLUDE; + ssl_dhparam $NGINX_SSL_DHPARAM; + + include /etc/nginx/common/protect.conf; + include /etc/nginx/common/protect_add_header.conf; + + #gzip_static on; + gzip on; + gzip_proxied any; + gzip_types + text/css + text/javascript + text/xml + text/plain + application/javascript + application/x-javascript + application/json; + + # Legacy URLS + set $REWRITE_LEGACY_URLS "$NGINX_REWRITE_LEGACY_URLS"; + if ($REWRITE_LEGACY_URLS = 'true') { + rewrite ^/vue/?(.*)$ /$1 permanent; + } + + # Frontend (default) + location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:3000; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.frontend.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.frontend.log warn; + } + + # Backend + location /graphql { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:4000; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.backend.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.backend.log warn; + } + + # Backend webhooks + location /hook { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:4000/hook; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.backend.hook.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.backend.hook.log warn; + } + + # Webhook reverse proxy + location /hooks/ { + proxy_pass http://127.0.0.1:9000/hooks/; + + access_log $GRADIDO_LOG_PATH/nginx-access.hooks.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.hooks.log warn; + } + + # Admin Frontend + location /admin { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:8080/; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.admin.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.admin.log warn; + } + + # TODO this could be a performance optimization + #location /vue { + # alias /var/www/html/gradido/frontend/dist; + # index index.html; + # + # location ~* \.(png)$ { + # expires 39d; + # } + # try_files $uri $uri/ /index.html = 404; + #} +} \ No newline at end of file diff --git a/deployment/bare_metal/nginx/sites-available/gradido.conf.template b/deployment/bare_metal/nginx/sites-available/gradido.conf.template new file mode 100644 index 000000000..b4c7b3463 --- /dev/null +++ b/deployment/bare_metal/nginx/sites-available/gradido.conf.template @@ -0,0 +1,111 @@ +server { + server_name $NGINX_SERVER_NAME; + + listen 80; + listen [::]:80; + + include /etc/nginx/common/protect.conf; + include /etc/nginx/common/protect_add_header.conf; + + #gzip_static on; + gzip on; + gzip_proxied any; + gzip_types + text/css + text/javascript + text/xml + text/plain + application/javascript + application/x-javascript + application/json; + + # Legacy URLS + set $REWRITE_LEGACY_URLS "$NGINX_REWRITE_LEGACY_URLS"; + if ($REWRITE_LEGACY_URLS = 'true') { + rewrite ^/vue/?(.*)$ /$1 permanent; + } + + # Frontend (default) + location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:3000; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.frontend.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.frontend.log warn; + } + + # Backend + location /graphql { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:4000; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.backend.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.backend.log warn; + } + + # Backend webhooks + location /hook { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + # no trailing slash to keep the hook/ prefix + proxy_pass http://127.0.0.1:4000/hook; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.backend.hook.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.backend.hook.log warn; + } + + # Webhook reverse proxy + location /hooks/ { + proxy_pass http://127.0.0.1:9000/hooks/; + + access_log $GRADIDO_LOG_PATH/nginx-access.hooks.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.hooks.log warn; + } + + # Admin Frontend + location /admin { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + + proxy_pass http://127.0.0.1:8080/; + proxy_redirect off; + + access_log $GRADIDO_LOG_PATH/nginx-access.admin.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.admin.log warn; + } + + # TODO this could be a performance optimization + #location /vue { + # alias /var/www/html/gradido/frontend/dist; + # index index.html; + # + # location ~* \.(png)$ { + # expires 39d; + # } + # try_files $uri $uri/ /index.html = 404; + #} +} \ No newline at end of file diff --git a/deployment/bare_metal/nginx/sites-available/gradido_updating b/deployment/bare_metal/nginx/sites-available/gradido_updating deleted file mode 100644 index df07e3715..000000000 --- a/deployment/bare_metal/nginx/sites-available/gradido_updating +++ /dev/null @@ -1,29 +0,0 @@ - -server { - server_name _; - listen 80; - listen [::]:80; - - include /etc/nginx/common/protect.conf; - include /etc/nginx/common/protect_add_header.conf; - - root /var/www/html/; - index updating.html; - - location /account { - alias /var/www/html/; - index updating.html; - } - location /vue { - alias /var/www/html/; - index updating.html; - } - - location ~ /\.ht { - deny all; - } - - access_log /var/log/nginx/access.log main; - -} - diff --git a/deployment/bare_metal/nginx/sites-available/update-page.conf.ssl.template b/deployment/bare_metal/nginx/sites-available/update-page.conf.ssl.template new file mode 100644 index 000000000..ddcb9ffc1 --- /dev/null +++ b/deployment/bare_metal/nginx/sites-available/update-page.conf.ssl.template @@ -0,0 +1,37 @@ + +server { + if ($host = $NGINX_SERVER_NAME) { + return 301 https://$host$request_uri; + } + + server_name $NGINX_SERVER_NAME; + listen 80; + listen [::]:80; + return 404; +} +server { + server_name $NGINX_SERVER_NAME; + + listen [::]:443 ssl ipv6only=on; + listen 443 ssl; + ssl_certificate $NGINX_SSL_CERTIFICATE; + ssl_certificate_key $NGINX_SSL_CERTIFICATE_KEY; + include $NGINX_SSL_INCLUDE; + ssl_dhparam $NGINX_SSL_DHPARAM; + + include /etc/nginx/common/protect.conf; + include /etc/nginx/common/protect_add_header.conf; + + gzip on; + + root $NGINX_UPDATE_PAGE_ROOT; + index updating.html; + + location / { + try_files /updating.html =404; + } + + access_log $GRADIDO_LOG_PATH/nginx-access.update-page.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.update-page.log warn; +} + diff --git a/deployment/bare_metal/nginx/sites-available/update-page.conf.template b/deployment/bare_metal/nginx/sites-available/update-page.conf.template new file mode 100644 index 000000000..c26a705ce --- /dev/null +++ b/deployment/bare_metal/nginx/sites-available/update-page.conf.template @@ -0,0 +1,22 @@ + +server { + server_name _; + listen 80; + listen [::]:80; + + include /etc/nginx/common/protect.conf; + include /etc/nginx/common/protect_add_header.conf; + + gzip on; + + root $NGINX_UPDATE_PAGE_ROOT; + index updating.html; + + location / { + try_files /updating.html =404; + } + + access_log $GRADIDO_LOG_PATH/nginx-access.update-page.log gradido_log; + error_log $GRADIDO_LOG_PATH/nginx-error.update-page.log warn; +} + diff --git a/deployment/bare_metal/nginx/update-page/updating.html.template b/deployment/bare_metal/nginx/update-page/updating.html.template new file mode 100644 index 000000000..cc6d7debb --- /dev/null +++ b/deployment/bare_metal/nginx/update-page/updating.html.template @@ -0,0 +1,4 @@ +
    +Gradido is currently updating...
    +please stand by and try again in some minutes
    +
    diff --git a/deployment/bare_metal/nginx/updating_original.html b/deployment/bare_metal/nginx/updating_original.html
    deleted file mode 100644
    index 8975e3970..000000000
    --- a/deployment/bare_metal/nginx/updating_original.html
    +++ /dev/null
    @@ -1 +0,0 @@
    -Gradido Servers are updating..., please stand by and try again in some minutes
    diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/old/build_frontend.sh
    similarity index 100%
    rename from deployment/bare_metal/build_frontend.sh
    rename to deployment/bare_metal/old/build_frontend.sh
    diff --git a/deployment/bare_metal/old/setup_server_online_ubuntu18.sh b/deployment/bare_metal/old/setup_server_online_ubuntu18.sh
    new file mode 100644
    index 000000000..7cc267e33
    --- /dev/null
    +++ b/deployment/bare_metal/old/setup_server_online_ubuntu18.sh
    @@ -0,0 +1,70 @@
    +# phpmyadmin
    +echo "install and secure phpmyadmin"
    +sudo apt install phpmyadmin
    +cd /etc/phpmyadmin/conf.d
    +sudo cat < pma_secure.php
    +
    +EOF
    +phpmyadminPwd = $(openssl passwd)
    +echo "Please give a username for phpmyadmin, but not root"
    +read phpmyadmin_user
    +# TODO: check if phpmyadmin_user isn't really root
    +sudo cat < /etc/nginx/pma_pass 
    +$phpmyadmin_user:$phpmyadminPwd
    +EOF
    +
    +serverIP = $(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')
    +
    +sudo cat < /etc/nginx/sites-available/phpmyadmin 
    +
    +server {
    +        listen 80 ;
    +
    +        listen [::]:80;
    +        server_name $serverIP;
    +
    +
    +        location ~* \.(png|jpg|ico)$ {
    +          expires 30d;
    +        }
    +
    +        location ~* \.(js|css) {
    +          expires 30d;
    +        }
    +		
    +		location /phpmyadmin {
    +			root /usr/share/phpmyadmin
    +			index index.php;
    +			
    +			location ~ \.php$ {
    +			  include snippets/fastcgi-php.conf;
    +			  fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    +			}
    +			
    +			location / {
    +                try_files $uri $uri/ /index.php?$args;
    +			}
    +		}
    +
    +        location ~ /\.ht {
    +          deny  all;
    +        }
    +
    +        access_log /var/log/nginx/access.log main;
    +}
    +
    +EOF
    +sudo ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled 
    \ No newline at end of file
    diff --git a/deployment/bare_metal/restore.sh b/deployment/bare_metal/restore.sh
    new file mode 100755
    index 000000000..2a1ccd0ac
    --- /dev/null
    +++ b/deployment/bare_metal/restore.sh
    @@ -0,0 +1,42 @@
    +#!/bin/bash
    +
    +# This script will shut down all services, replace the whole database with the selected backup and restart the services
    +
    +# Find current directory & configure paths
    +set -o allexport
    +SCRIPT_PATH=$(realpath $0)
    +SCRIPT_DIR=$(dirname $SCRIPT_PATH)
    +PROJECT_ROOT=$SCRIPT_DIR/../..
    +set +o allexport
    +
    +# Parameter is a proper file?
    +export BACKUP_FILE=${SCRIPT_DIR}/backup/$1 
    +if [ ! -f "$BACKUP_FILE" ]; then
    +    return "File '$BACKUP_FILE' does not exist" 2>/dev/null || exit 1
    +fi
    +
    +# Load backend .env for DB_USERNAME, DB_PASSWORD & DB_DATABASE
    +# NOTE: all config values will be in process.env when starting
    +# the services and will therefore take precedence over the .env
    +if [ -f "$PROJECT_ROOT/backend/.env" ]; then
    +    export $(cat $PROJECT_ROOT/backend/.env | sed 's/#.*//g' | xargs)
    +else
    +    export $(cat $PROJECT_ROOT/backend/.env.dist | sed 's/#.*//g' | xargs)
    +fi
    +
    +# Stop gradido-backend service
    +pm2 stop gradido-backend
    +
    +# Backup data
    +mysqldump --databases --single-transaction --quick --hex-blob --lock-tables=false > ${SCRIPT_DIR}/backup/mariadb-restore-backup-$(date +%d-%m-%Y_%H-%M-%S).sql -u ${DB_USER} -p${DB_PASSWORD} ${DB_DATABASE}
    +
    +# Restore Data
    +mysql -u ${DB_USER} -p${DB_PASSWORD} < ssh root@gddhost.tld
    +
    +# change root default shell
    +> chsh -s /bin/bash
    +# Create user `gradido`
    +> useradd -d /home/gradido -m gradido
    +> passwd gradido
    +>> enter new password twice
    +
    +# Gives the user priviledges - this might be omitted in order to harden security
    +# Care: This will require another administering user if you don't want root access.
    +#       Since this setup expects the user running the software be the same as the administering user,
    +#       you have to adjust the instructions according to that scenario.
    +#       You might lock yourself out, if done wrong.
    +> usermod -a -G sudo gradido
    +
    +# change gradido default shell
    +> chsh -s /bin/bash gradido
    +# Install sudo
    +> apt-get install sudo
    +# switch to the new user
    +> su gradido
    +
    +# Register first ssh key for user `gradido`
    +> mkdir ~/.ssh
    +> chmod 700 ~/.ssh
    +> nano ~/.ssh/authorized_keys
    +>> insert public key
    +>> ctrl + x
    +>> save
    +
    +# Test authentication via SSH
    +> ssh -i /path/to/privKey gradido@gddhost.tld
    +>> This should log you in and allow you to use sudo commands, which will require the user's password
    +
    +# Disable password authentication & root login
    +> cd /etc/ssh
    +> sudo cp sshd_config sshd_config.org
    +> sudo nano sshd_config
    +>> change `PermitRootLogin yes` to `PermitRootLogin no`
    +>> change `#PasswordAuthentication yes` to `PasswordAuthentication no`
    +>> change `UsePAM yes` to `UsePAM no`
    +>> ctrl + x
    +>> save
    +> sudo /etc/init.d/ssh restart
    +
    +# Test SSH Access only, no root ssh access
    +> ssh gradido@gddhost.tld
    +>> Will result in in either a password request for your key or the message `Permission denied (publickey)`
    +> ssh -i /path/to/privKey root@gddhost.tld
    +>> Will result in `Permission denied (publickey)`
    +> ssh -i /path/to/privKey gradido@gddhost.tld
    +>> Will succeed after entering the correct keys password (if any)
    +
    +# update system
    +> sudo apt-get update
    +> sudo apt-get upgrade
    +
    +# Install security tools
    +## ufw
    +> sudo apt-get install ufw
    +> sudo ufw allow http
    +> sudo ufw allow https
    +> sudo ufw allow ssh
    +> sudo ufw enable
    +
    +## fail2ban
    +> sudo apt-get install -y fail2ban
    +> sudo /etc/init.d/fail2ban restart
    +
    +# Install gradido
    +> sudo apt-get install -y git
    +> cd ~
    +> git clone https://github.com/gradido/gradido.git
    +
    +# Timezone
    +# Note: This is not needed - UTC(default) is REQUIRED for production data
    +# > sudo timedatectl set-timezone UTC
    +# > sudo timedatectl set-ntp on
    +# > sudo apt purge ntp
    +# > sudo systemctl start systemd-timesyncd
    +# >> timedatectl to verify
    +
    +# Adjust .env
    +# NOTE ';' can not be part of any value
    +> cd gradido/deployment/bare_metal
    +> cp .env.dist .env
    +> nano .env
    +>> Adjust values accordingly
    +# TODO the install.sh is not yet ready to run directly - consider to use it as pattern to do it manually
    +> ./install.sh
    \ No newline at end of file
    diff --git a/deployment/bare_metal/start.sh b/deployment/bare_metal/start.sh
    new file mode 100755
    index 000000000..250971419
    --- /dev/null
    +++ b/deployment/bare_metal/start.sh
    @@ -0,0 +1,163 @@
    +#!/bin/bash
    +
    +# Find current directory & configure paths
    +set -o allexport
    +SCRIPT_PATH=$(realpath $0)
    +SCRIPT_DIR=$(dirname $SCRIPT_PATH)
    +LOCK_FILE=$SCRIPT_DIR/update.lock
    +UPDATE_HTML=$SCRIPT_DIR/nginx/update-page/updating.html
    +PROJECT_ROOT=$SCRIPT_DIR/../..
    +NGINX_CONFIG_DIR=$SCRIPT_DIR/nginx/sites-available
    +set +o allexport
    +
    +# NOTE: all config values will be in process.env when starting
    +# the services and will therefore take precedence over the .env
    +
    +# We have to load the backend .env to get DB_USERNAME, DB_PASSWORD AND JWT_SECRET
    +export_var(){
    +  export $1=$(grep -v '^#' $PROJECT_ROOT/backend/.env | grep -e "$1" | sed -e 's/.*=//')
    +}
    +
    +if [ -f "$PROJECT_ROOT/backend/.env" ]; then
    +    export_var 'DB_USER'
    +    export_var 'DB_PASSWORD'
    +    export_var 'JWT_SECRET'
    +fi
    +
    +# Load .env or .env.dist if not present
    +if [ -f "$SCRIPT_DIR/.env" ]; then
    +    set -o allexport
    +    source $SCRIPT_DIR/.env
    +    set +o allexport
    +else
    +    set -o allexport
    +    source $SCRIPT_DIR/.env.dist
    +    set +o allexport
    +fi
    +
    +# lock start
    +if [ -f $LOCK_FILE ] ; then
    +  echo "Already building!"
    +  exit 1
    +fi
    +touch $LOCK_FILE
    +
    +# find today string
    +TODAY=$(date +"%Y-%m-%d")
    +
    +# Create a new updating.html from the template
    +\cp $SCRIPT_DIR/nginx/update-page/updating.html.template $UPDATE_HTML
    +
    +# redirect all output of the script to the UPDATE_HTML and also have things on console
    +# TODO: this might pose a security risk
    +exec > >(tee -a $UPDATE_HTML) 2>&1
    +
    +# configure nginx for the update-page
    +echo 'Configuring nginx to serve the update-page' >> $UPDATE_HTML
    +rm /etc/nginx/sites-enabled/gradido.conf
    +ln -s /etc/nginx/sites-available/update-page.conf /etc/nginx/sites-enabled/
    +sudo /etc/init.d/nginx restart
    +
    +# stop all services
    +echo 'Stopping all Gradido services' >> $UPDATE_HTML
    +pm2 stop all
    +
    +# git
    +BRANCH=${1:-master}
    +echo "Starting with git pull - branch:$BRANCH" >> $UPDATE_HTML
    +cd $PROJECT_ROOT
    +# TODO: this overfetches alot, but ensures we can use start.sh with tags
    +git fetch origin --all
    +git checkout $BRANCH
    +git pull
    +export BUILD_COMMIT="$(git rev-parse HEAD)"
    +
    +# Generate gradido.conf from template
    +echo 'Generate new gradido nginx config' >> $UPDATE_HTML
    +case "$NGINX_SSL" in
    + true) TEMPLATE_FILE="gradido.conf.ssl.template" ;;
    +    *) TEMPLATE_FILE="gradido.conf.template" ;;
    +esac
    +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $NGINX_CONFIG_DIR/$TEMPLATE_FILE > $NGINX_CONFIG_DIR/gradido.conf
    +
    +# Generate update-page.conf from template
    +echo 'Generate new update-page nginx config' >> $UPDATE_HTML
    +case "$NGINX_SSL" in
    + true) TEMPLATE_FILE="update-page.conf.ssl.template" ;;
    +    *) TEMPLATE_FILE="update-page.conf.template" ;;
    +esac
    +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $NGINX_CONFIG_DIR/$TEMPLATE_FILE > $NGINX_CONFIG_DIR/update-page.conf
    +
    +# Regenerate .env files
    +cp -f $PROJECT_ROOT/database/.env $PROJECT_ROOT/database/.env.bak
    +cp -f $PROJECT_ROOT/backend/.env $PROJECT_ROOT/backend/.env.bak
    +cp -f $PROJECT_ROOT/frontend/.env $PROJECT_ROOT/frontend/.env.bak
    +cp -f $PROJECT_ROOT/admin/.env $PROJECT_ROOT/admin/.env.bak
    +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/database/.env.template > $PROJECT_ROOT/database/.env
    +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/backend/.env.template > $PROJECT_ROOT/backend/.env
    +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env.template > $PROJECT_ROOT/frontend/.env
    +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env
    +
    +# Install & build database
    +echo 'Updating database' >> $UPDATE_HTML
    +cd $PROJECT_ROOT/database
    +yarn install
    +yarn build
    +if [ "$DEPLOY_SEED_DATA" = "true" ]; then
    +  yarn dev_up
    +  yarn dev_reset
    +  yarn seed 
    +else
    +  yarn up
    +fi
    +
    +# Install & build backend
    +echo 'Updating backend' >> $UPDATE_HTML
    +cd $PROJECT_ROOT/backend
    +# TODO maybe handle this differently?
    +unset NODE_ENV
    +yarn install
    +yarn build
    +# TODO maybe handle this differently?
    +export NODE_ENV=production
    +pm2 delete gradido-backend
    +pm2 start --name gradido-backend "yarn --cwd $PROJECT_ROOT/backend start" -l $GRADIDO_LOG_PATH/pm2.backend.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS'
    +pm2 save
    +
    +# Install & build frontend
    +echo 'Updating frontend' >> $UPDATE_HTML
    +cd $PROJECT_ROOT/frontend
    +# TODO maybe handle this differently?
    +unset NODE_ENV
    +yarn install
    +yarn build
    +# TODO maybe handle this differently?
    +export NODE_ENV=production
    +pm2 delete gradido-frontend
    +pm2 start --name gradido-frontend "yarn --cwd $PROJECT_ROOT/frontend start" -l $GRADIDO_LOG_PATH/pm2.frontend.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS'
    +pm2 save
    +
    +# Install & build admin
    +echo 'Updating admin' >> $UPDATE_HTML
    +cd $PROJECT_ROOT/admin
    +# TODO maybe handle this differently?
    +unset NODE_ENV
    +yarn install
    +yarn build
    +# TODO maybe handle this differently?
    +export NODE_ENV=production
    +pm2 delete gradido-admin
    +pm2 start --name gradido-admin "yarn --cwd $PROJECT_ROOT/admin start" -l $GRADIDO_LOG_PATH/pm2.admin.$TODAY.log --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS'
    +pm2 save
    +
    +# let nginx showing gradido
    +echo 'Configuring nginx to serve gradido again' >> $UPDATE_HTML
    +ln -s /etc/nginx/sites-available/gradido.conf /etc/nginx/sites-enabled/
    +rm /etc/nginx/sites-enabled/update-page.conf
    +sudo /etc/init.d/nginx restart
    +
    +# keep the update log
    +cat $UPDATE_HTML >> $GRADIDO_LOG_PATH/update.$TODAY.log
    +
    +# release lock
    +rm $LOCK_FILE
    \ No newline at end of file
    diff --git a/deployment/bare_metal/update_all.sh b/deployment/bare_metal/update_all.sh
    deleted file mode 100755
    index e045d3f39..000000000
    --- a/deployment/bare_metal/update_all.sh
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -#!/bin/bash
    -
    -EMPTY_UPDATE_HTML=/var/www/html/updating_original.html
    -UPDATE_HTML=/var/www/html/updating.html
    -LOCK_FILE=/root/relay.lock
    -PROJECT_PATH=/var/www/html/gradido
    -SITE_CONFIG=stage1
    -UPDATE_SITE_CONFIG=stage1_updating
    -
    -# this script can be called for example from webhookrelay.com relay 
    -# to auto-deploy automatic after a update to the master branch
    -
    -if [ -f $LOCK_FILE ] ; then
    -  retVal="Already building!"
    -  return "${retVal}" 2>/dev/null || exit "${retVal}"
    -fi
    -
    -touch $LOCK_FILE
    -
    -# start with nearly empty html
    -# needed a nearly empty html page in the folder
    -cp $EMPTY_UPDATE_HTML $UPDATE_HTML
    -
    -# let nginx showing a update page
    -# needed nginx site-configs in nginx folders
    -# gradido for running gradido servers
    -# gradido_updating for showing upddate.html idealy for all pathes
    -rm /etc/nginx/sites-enabled/$SITE_CONFIG
    -ln -s /etc/nginx/sites-available/$UPDATE_SITE_CONFIG /etc/nginx/sites-enabled/
    -service nginx restart
    -
    -# stop login server
    -screen -XS login quit
    -echo 'starting with git pull
    ' >> $UPDATE_HTML -cd $PROJECT_PATH -# git checkout -f master -git pull -cd deployment/bare_metal -echo 'starting with rebuilding login-server
    ' >> $UPDATE_HTML -./build_and_start_login_server.sh -echo 'starting with rebuilding frontend
    ' >> $UPDATE_HTML -./build_frontend.sh - - -# let nginx showing gradido -rm /etc/nginx/sites-enabled/$UPDATE_SITE_CONFIG -ln -s /etc/nginx/sites-available/$SITE_CONFIG /etc/nginx/sites-enabled/ -service nginx restart - -rm $LOCK_FILE - diff --git a/deployment/bare_metal/webhook/hooks.json.template b/deployment/bare_metal/webhook/hooks.json.template new file mode 100644 index 000000000..7f6a76fd5 --- /dev/null +++ b/deployment/bare_metal/webhook/hooks.json.template @@ -0,0 +1,37 @@ +[ + { + "id": "github", + "execute-command": "/home/gradido/gradido/deployment/bare_metal/start.sh", + "pass-arguments-to-command": [ + { + "source": "string", + "name": "$WEBHOOK_GITHUB_BRANCH" + } + ], + "command-working-directory": "/home/gradido/gradido/deployment/bare_metal", + "trigger-rule": { + "and": [ + { + "match": { + "type": "payload-hash-sha1", + "secret": "$WEBHOOK_GITHUB_SECRET", + "parameter": { + "source": "header", + "name": "X-Hub-Signature" + } + } + }, + { + "match": { + "type": "value", + "value": "refs/heads/$WEBHOOK_GITHUB_BRANCH", + "parameter": { + "source": "payload", + "name": "ref" + } + } + } + ] + } + } + ] \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml index cdaf46a7a..3d63da9e3 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -78,45 +78,6 @@ services: # bind the local folder to the docker to allow live reload - ./database:/app - ######################################################### - ## LOGIN SERVER ######################################### - ######################################################### - login-server: - build: - dockerfile: Dockerfiles/ubuntu/Dockerfile.debug - networks: - - external-net - - internal-net - security_opt: - - seccomp:unconfined - cap_add: - - SYS_PTRACE - volumes: - - ./logs:/var/log/grd_login - - ./login_server/src:/code/src - - ./login_server/dependencies:/code/dependencies - - ./login_server/scripts:/code/scripts - - ./configs/login_server:/etc/grd_login - - login_build_ubuntu_3.1:/code/build - - - ######################################################### - ## COMMUNITY SERVER (cakephp with php-fpm) ############## - ######################################################### - community-server: - build: - context: . - target: community_server - dockerfile: ./community_server/Dockerfile - depends_on: - - mariadb - networks: - - internal-net - - external-net - volumes: - - ./community_server/config/php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini - - ./community_server/src:/var/www/cakephp/src - ######################################################### ## MARIADB ############################################## ######################################################### @@ -129,10 +90,6 @@ services: ## NGINX ################################################ ######################################################### nginx: - depends_on: - - frontend - - community-server - - login-server volumes: - ./logs/nginx:/var/log/nginx @@ -160,4 +117,3 @@ volumes: backend_database_build: database_node_modules: database_build: - login_build_ubuntu_3.1: \ No newline at end of file diff --git a/docker-compose.test.yml b/docker-compose.test.yml index e7b0e9849..221ecba20 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -20,67 +20,21 @@ services: # DATABASE ############################################# ######################################################## database: - restart: always # this is very dangerous, but worth a test for the delayed mariadb startup at first run + build: + context: ./database + target: test_up + # restart: always # this is very dangerous, but worth a test for the delayed mariadb startup at first run ######################################################### ## MARIADB ############################################## ######################################################### mariadb: - build: - context: . - dockerfile: ./mariadb/Dockerfile - target: mariadb_server - environment: - - MARIADB_ALLOW_EMPTY_PASSWORD=1 - - MARIADB_USER=root networks: - internal-net - external-net - ports: - - 3306:3306 volumes: - db_test_vol:/var/lib/mysql - ######################################################### - ## LOGIN SERVER ######################################### - ######################################################### - login-server: - build: - context: ./login_server/ - dockerfile: Dockerfiles/ubuntu/Dockerfile.test - security_opt: - - seccomp:unconfined - cap_add: - - SYS_PTRACE - depends_on: - - mariadb - networks: - - internal-net - volumes: - - ./logs:/var/log/grd_login - - ./login_server/src:/code/src - - ./configs/login_server:/etc/grd_login - - login_build_cov:/code/build_cov - - ./coverage/login:/code/build_cov/coverage_html - - ######################################################### - ## COMMUNITY SERVER (cakephp with php-fpm) ############## - ######################################################### - community-server: - build: - context: . - target: test - dockerfile: ./community_server/Dockerfile - depends_on: - - mariadb - networks: - - internal-net - volumes: - - ./community_server/config/php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini - - ./community_server/src:/var/www/cakephp/src - - ./coverage/community:/var/www/cakephp/webroot/coverage - - ######################################################### ## PHPMYADMIN ########################################### ######################################################### @@ -104,4 +58,3 @@ networks: volumes: db_test_vol: - login_build_cov: \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index ae72f3137..213b200cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,7 +108,7 @@ services: # DATABASE ############################################# ######################################################## database: - image: gradido/database:production_up + #image: gradido/database:production_up build: context: ./database target: production_up @@ -129,59 +129,22 @@ services: #env_file: # - ./frontend/.env - ######################################################### - ## LOGIN SERVER ######################################### - ######################################################### - login-server: - build: - context: ./login_server/ - depends_on: - - mariadb - networks: - - internal-net - ports: - - 1200:1200 - - 1201:1201 - volumes: - - ./configs/login_server:/etc/grd_login - ######################################################### ## NGINX ################################################ ######################################################### - ## nginx, connect login-server and community-server together (and php-fpm to community-server) nginx: build: - context: . - dockerfile: ./nginx/Dockerfile + context: ./nginx/ networks: - external-net - internal-net depends_on: - - community-server - - login-server - - frontend + - frontend + - backend + - admin ports: - 80:80 - ######################################################### - ## COMMUNITY SERVER (cakephp with php-fpm) ############## - ######################################################### - community-server: - build: - context: . - target: community_server - dockerfile: ./community_server/Dockerfile - environment: - - DB_PASSWORD='' - - DB_USER='root' - - DB_DATABASE='gradido_community' - depends_on: - - mariadb - networks: - - internal-net - volumes: - - ./community_server/config/php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini - networks: external-net: internal-net: diff --git a/docu/Concepts/BusinessRequirements/BenutzerVerwaltung.md b/docu/Concepts/BusinessRequirements/BenutzerVerwaltung.md index 9bb495742..036cb5c65 100644 --- a/docu/Concepts/BusinessRequirements/BenutzerVerwaltung.md +++ b/docu/Concepts/BusinessRequirements/BenutzerVerwaltung.md @@ -13,28 +13,50 @@ Benutzer * Emailadresse * Konto * Trustlevel (Zukunft) +* Nutzerprofil mit Bild und persönlichen Angeboten -## Gradido-ID +## Gradido-ID {Gradido-Id} -Die GradidoID oder auch Username dient zur eindeutigen Identifizierung eines Nutzers. Sie soll einerseits *human readable* , aber auch die maschinelle Weiterverarbeitung bzw. Nutzung ermöglichen. Daher werden folgende Regeln festgelegt: +Die GradidoID dient zur eindeutigen Identifizierung eines Nutzers. Sie soll einerseits *human readable* , aber auch die maschinelle Weiterverarbeitung bzw. Nutzung ermöglichen. Um dies zu ermöglichen wird es für einen Nutzer mehrere Schlüssel-Attribute zur eindeutigen Identifikation geben: -Pattern: ``/`` +* technischer Key als UUID +* Email-Adresse(n) +* User-Alias + +Der Aufbau einer Gradido-ID aus den Anteilen `` und `` kann für den `` folgende Ausprägungen annehmen: + +* mit technischem Key: ``/`` +* mit Email-Adresse: ``/`` +* mit User-Alias: ``/`` + +Für die Anteile der Gradido-ID werden folgende Regeln festgelegt: * `` + - Zeichen, die in einer URL erlaubt sind: * A-Z, a-z, 0-9 * '-', '.', '_', '~' +* `` + + * basierend auf (Pseudo)zufällig generierte UUID (Version 4) + * Konfliktfreiheit bei ![2^{{122}}\approx 5{,}3169\cdot 10^{{36}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1924927d783e2d3969734633e134f643b6f9a8cd) + * ist eine Zahl aus 16 Byte + * ist hexadezimal notiert + * in fünf Gruppen durch Bindestriche nach dem Muster `550e8400-e29b-11d4-a716-446655440000` unterteilt +* `` + + * alle Zeichen, die in einer gültigen E-Mail-Adresse erlaubt sind + * allgemein gültiges Email-Format * ``: + - mindestens 5 Zeichen * alphanumerisch * keine Umlaute - * - und \_ sind nur zwischen sonst gültigen Zeichen erlaubt (RegEx: [a-zA-Z0-9]-|_[a-zA-Z0-9]) + * nach folgender Regel erlaubt (RegEx: [a-zA-Z0-9]-|_[a-zA-Z0-9]) - Blacklist für Schlüsselworte, die frei definiert werden können - vordefinierte/reservierte System relevante Namen dürfen maximal aus 4 Zeichen bestehen -Nutzerprofil mit Bild und persönlichen Angeboten - ## Anwendungsfälle ### neuen Benutzer anlegen diff --git a/docu/Concepts/BusinessRequirements/UC_Send_Users_Gradido.md b/docu/Concepts/BusinessRequirements/UC_Send_Users_Gradido.md new file mode 100644 index 000000000..cc7c47900 --- /dev/null +++ b/docu/Concepts/BusinessRequirements/UC_Send_Users_Gradido.md @@ -0,0 +1,365 @@ +# UseCase: Send Users Gradido + +In diesem Dokument sollen die Anforderungen für den Usecase "Send Users Gradido" zusammengetragen und weiter konzipiert werden. + +## Motivation + +Die Motivation für diesen Usecase ist die Möglichkeit für den Gradido-User zu schaffen jedem Menschen weltweit Gradido zu senden. Dies soll per E-Mail, als persönliche Nachricht, per Gutschein oder bei persönlichen Treffen als direkter Austausch funktionieren. + +Damit kann Gradido mit weitreichendem Potential weiterempfohlen werden, sorgt dadurch für eine expotentielle Verbreitung und löst gar eine "Welle der Dankbarkeit" aus. + +Für einen "neuen User" besteht damit die einfache Möglichkeit sich direkt zu registrieren und sofort Gradidos zu empfangen. + +Für bereits "existierende User" wird eine neue Variante des Logins mit direkter Gradido Gutschrift geschaffen. + +## Perspektive des Senders + +In diesem Kapitel werden alle Aspekte aus Sicht des Senders beschrieben. Es werden dabei die Oberflächen- und Bedienungs-Anforderungen, die logischen und finanzkalkulatorischen Schritte des Geldabgangs, sowie die Aufbereitung und Zusammensetzung des zu generierenden Ausgabe-Produktes und schließlich die möglichen Varianten, wie das *Senden von Gradidos* an den Empfänger übermittelt werden kann. + +### Starten des Gradido Sende-Prozess + +Der User öffnet in seinem Gradido-Konto die Anzeige zum Senden von Gradidos: + +![./image/UC_Send_Users_Gradido_SendDialog.png](./image/UC_Send_Users_Gradido_SendDialog.png) + +Vorausgesetzt der User hat auf seinem GDD-Konto ein Guhaben, dann kann er (bisher) einem ihm bzw. dem System bekannten anderen User einen beliebigen Betrag innerhalb seines Verfügungsrahmens direkt *synchron* senden. + +Mit diesem Usecase soll es zukünftig möglich sein neben dem direkten *synchronen Senden* von Gradidos auch einen neuen Weg zum *asynchronen Senden* zu eröffnen. + +#### Übertragungswege + +**Bisher** + +* **synchrones Senden** : direkt im Dialog erfolgt über den "Jetzt senden"-Button innerhalb des Systems die direkte Übertragung des Geldbetrages an den zuvor definierten und bekannten Empfänger, der ebenfalls schon ein Gradido-Konto haben muss. + +**Neu** + +* **asynchrones Senden online**: Es wird im ersten Schritt "nur" ein asynchrones Senden mit Internet-Verbindung (online) unterstützt. Dadurch ist es möglich die zusendenden Daten auf einen einfachen Identifier zu reduzieren. Der Empfänger der Daten muss zur Überprüfung der erhaltenen Daten online sein, da mit dem einfachen Identifier dann erst die eigentlichen fachlichen Daten der Transaktion ausgelesen und angezeigt werden. +* **asynchrones Senden offline**: Beim asynchronen Senden ohne Internet-Verbindung (offline) müssen die notwendigen fachlichen Daten der Transaktion (Sender, Betrag und ggf. Verwendungszweck) in das Ausgabe-Medium kodiert werden, das dann asynchron vom User über ein anderes Transportmedium ausserhalb der Gradido-Anwendung an den Empfänger übertragen wird. Somit kann der Empfänger auch offline den Inhalt des erhaltenen Mediums mit entsprechenden Tools (noch zu konzipieren) überprüfen. Der Empfänger wird nicht schon wie üblich beim Erfassen der Transaktionsdaten bestimmt, sondern dies erfolgt in einem nachgelagerten Schritt des Übertragungsprozesses zum Beispiel in einem Messenger o.ä. in Eigenverantwortung des Users. + * **Ausgabe-Medium als Link** : die Kodierung der Transaktionsdaten in einen Link eröffnen dem User eine Vielzahl an möglichen Übertragungswege. Der Link kann in Emails, Messages und für ihn sonstige verfügbare Medien kopiert werden, wo er dann in Eigenverantwortung aus seinen persönlichen Kontakten den Empfänger bestimmt. + * **Ausgabe-Medium als QR-Code** : die Kodierung der Transaktionsdaten in einen QR-Code ist lediglich die Formatierung in Bildformat statt wie der Link in Text-Format. Der User kann auch den QR-Code in Emails, Messages und für ihn sonstige verfügbare Medien kopieren und übertragen. Letztendlich muss der Empfänger ein optischen QR-Scan mit einem ihm verfügbarem Medium wie beispielsweise Handy-, Tablet- oder PC-Kamera durchführen, um den Inhalt des Codes lesen zu können und um daraus wieder den eigentlichen Prozess der Weiterverarbeitung zu starten. + +#### Auswahl des Übertragungsweges + +Es stellt sich nun die Frage der User-Experience, ob schon bei der Navigation über den Senden-Menüeintrag z.B. per Untermenü-Punkte die Auswahl der verschiedenen Übertragungswege stattfinden oder ob der bisherige Senden-Dialog entsprechend geändert bzw. erweitert werden soll? + +**Menü-Auswahl** + +Wenn die Auswahl des Übertragungsweges ob synchron, asynchron per Link oder asynchron per QR-Code schon über das Menü stattfinden soll, dann hat das aber auch die Konsequenz, dass für die asynchrone Übertragung ein eigener neuer Erfassungsdialog erstellt werden muss. + +**Dialogänderung** + +Wenn die Auswahl des Übertragungsweges im existierenden Senden-Dialog stattfinden soll, dann muss der existierende Senden-Dialog entsprechend angepasst und in der Logik überarbeitet werden. Die nachfolgende Skizze zeigt einen möglichen Entwurf: + +![UC_Send_Users_Gradido_SendDialogPerLink](./image/UC_Send_Users_Gradido_SendDialogPerLink.png) + +Die Idee zeigt die Auswahl der Übertragungart als Radio-Buttons für "sofort online" - entspricht der bisherigen Art - "per Link" und "per QR-Code". Sobald eine der beiden neuen Arten ausgewählt ist, wird das Empfänger-Feld ausgeblendet, das Feld "Anzahl akzeptierter Valutierungen" und der Text des Sende-Buttons von "Jetzt senden" auf "Jetzt generieren" geändert. + +Das neue Feld "Anzahl akzeptierter Valutierungen" unterstützt die Idee eine einmal eingegebene *vorgebuchte* Transaktion x-fach an beliebige Empfänger zu versenden. Diese Anzahl wird mit den Daten der *vorgebuchten* Transaktion gespeichert und muss im späteren Valutierungsprozess entsprechend verarbeitet werden. Details dazu siehe weiter unten im Kapitel "*Perspektive des Empfängers*". + +Während bzw. nach der Eingabe des Betrages und bei Veränderung der "Anzahl aktzeptierter Valutierungen" für eine asynchrone Transaktion muss eine Validierung gegenüber dem Kontostand oder genauer gesagt gegenüber dem noch verfügbaren Betrag durchgeführt werden. Denn eine *asynchrone* Transaktion unterliegt finanzkalkulatorisch einem anderen Regelwerk als eine *synchrone* Transaktion. Die Details des Regelwerks sind im nachfolgenden Kapitel beschrieben. Wenn die Validierung des Betrages für eine *asynchrone* Transaktion fehlschlägt, muss der "Jetzt generieren"-Button deaktiviert und eine aussagekräftige Fehlermeldung dem User angezeigt werden. Hier eine mögliche Formulierung als Vorschlag: + +``` +"Der Betrag X für die n-malige Überweisung als Link, inklusive einer einkalkulierten Vergänglichkeitsreserve von Y, wird durch den aktuellen Verfügungsrahmen Z bei Kontostand N nicht gedeckt! " +``` + +Sobald der eingegebene Betrag für eine *asynchrone* Transaktion valide ist, wird der "Jetzt generieren"-Button wieder aktiviert. + +Mit drücken des "Jetzt generieren"-Buttons erfolgt die Generierung des Links bzw des QR-Codes aus den erfassten Transaktionsdaten. Der fertig erzeugte Link bzw. QR-Code wird in einem Popup-Fenster zur Anzeige gebracht. Für eine Transaktion als Link kann ein vorkonfigurierter bzw. für den User administrierbarer Meldungstext zusammen mit dem Link angezeigt werden. Der Inhalt des Popup-Fensters - Meldungstext inkl. Link oder QR-Code - kann der User entweder manuell herauskopieren und für den Versand in ein anderes Übertragungsmedium wie Email, Messenger, etc. einfügen oder für einen QR-Code-Scan vom Empfänger abfotographieren lassen. + +### Finanzkalkulatorische Logik + +Für die verschiedenen Übertragungswege gibt es unterschiedliche finanzkalkulatorische Regeln und Logiken zu beachten. + +#### sofort online + +Bei der bisherigen Übertragungsart gibt es nur die Regel, dass der eingegebene Betrag kleiner gleich dem aktuellen Kontostand sein muss. Da die Übertragung im Prinzip sofort stattfindet, muss hier keine zusätzliche Berücksichtigung der Vergänglichkeit in den Transaktionsbetrag eingerechnet werden. + +#### per Link / per QR-Code + +Bei der neuen Übertragungsart kommt es aber zu einem ggf. längeren Zeitfenster von max 14 Tagen - per Konfiguration fest voreingestellt - bis die Transaktion bei dem Empfänger gebucht und somit beim Sender valutiert wird. + +Es wird in den nun folgenden Erklärungen angenommen, dass die Anzahl an akzeptierten Valutierungen auf dem Standard-Wert 1 steht und damit der Link/QR-Code einmalig an einen Empfänger übertragen und somit auch nur einmal valutiert werden wird. + +Das bedeutet mit der Generierung des Links/QR-Codes wird aus dem zu sendenden Betrag die Vergänglichkeit für die konfigurierte maximale Gültigkeitsdauer des Links/QR-Codes berechnet. Dieser Vergänglichkeitsbetrag wird zusammen mit dem zusendenden Betrag als Summe auf dem Konto des Senders als "vorgebucht" markiert. Damit bleibt der Kontostand des Senders erst einmal unverändert, aber sein Verfügungsrahmen, der ihm noch für andere Transaktionen zur Verfügung steht, muss um den "vorgebuchten" Betrag reduziert und als Verfügbarkeits-Betrag zusätzlich unterhalb des Kontostandes korrigiert angezeigt werden. Damit wird sichergestellt, dass wenn der Empfänger die Transaktion wirklich erst nach 14 Tagen verbucht, dass nach dieser Zeit auch noch genügend Gradidos auf dem Senderkonto zur Verfügung stehen. Das nachfolgende Bild verdeutlicht diesen Sachverhalt: + +![VorgebuchterTransaktionsbetrag](./image/VorgebuchterTransaktionsbetrag.png) + +Diese Berücksichtigung der Vergänglichkeit muss also auch schon bei der Erfassung einer *asynchronen* Transaktion im Sende-Dialog mit einfließen und sollte bei der Eingabe des Betrages, aber spätestens vor dem Aktivieren des "Jetzt generieren"-Buttons durch eine Validierung sichergestellt werden. + +#### Regelwerk + +Folgendes Regelwerk gilt es bei der Validierung auszuführen und zu überprüfen: + +* Bg = *Betrag-gesamt* aus dem eingegebenen Transaktionsbetrag X mal der Anzahl akzeptierter Valutierungen +* Dg = *Decay-gesamt* aus dem Gesamtbetrag Bg für den konfigurierten MaxAsyncExpiration t (default = 14 Tage) +* Vo = *Verfügungsrahmen-offen* aus Kontostand K minus Summe aller schon existierenden *offenen vorgebuchten* Transaktionen +* Prüfung auf: Vo > Bg + Dg + +Die *Anzahl der akzeptierten Valutierungen* wird somit immer - auch bei dem Default-Wert = 1 - mit einbezogen und verändert bzw. verkompliziert die finanzkalkulatorischen Regeln bei der Eingabe und Generierung der asynchronen Transaktion so gut wie gar nicht. + +#### Kontoverwaltung + +Auch auf die Kontoverwaltung hat die Einführung einer *asynchronen* Transaktion gewisse Auswirkungen. So muss für die Anzeige der Tranaktionsübersicht eine Möglichkeit für den User geschaffen werden seine *gebuchten* sowie seine *vorgebuchten* Transaktionen, aber auch die evtl. *abgelaufenen vorgebuchten* Transaktionen auflisten zu können. Der existierende Dialog der Transaktionsübersicht + +![./image/UC_Send_Users_Gradido_TxÜbersichtDialog.png](./image/UC_Send_Users_Gradido_TxÜbersichtDialog.png) + +zeigt für das Gradido-Konto des Users die Liste der getätigten Transaktionen für GDD im linken Reiter und für GDT im rechten Reiter. + +##### Dialog Transaktionen + +Wie oben beschrieben wird mit Einführung von *asynchronen* Transaktionen es notwendig, eine evtl. mögliche Liste von offenen, sprich *vorgebuchten* Transaktionen für den User übersichtlich anzuzeigen. Zudem kommt hinzu, dass der User die Information über seinen noch zur Verfügung stehenden Verfügungsrahmen aus dem aktuellen Kontostand abzüglich aller *vorgebuchten* Beträge benötigt. Dazu wird unterhalb des Listeneintrag der Vergänglichkeit ein neuer andersfarbiger Listeneintrag mit Link-Symbol sichtbar, der die Summe aller noch offenen *vorgebuchten* Transaktionen anzeigt. Das folgende Bild zeigt einen Entwurf für den Transaktionsübersicht-Dialog: + +![UC_Send_Users_Gradido_TxClosedDetaildFunds.png](./image/UC_Send_Users_Gradido_TxClosedDetaildFunds.png) + +Der aktuelle Kontostand wird dabei weiterhin ganz oben und direkt darunter der freie Verfügungsrahmen zusätzlich angezeigt. Dieser kann, wie in den vorherigen Kapiteln beschrieben, durch vorhandene *offene vorgebuchte* Transaktionen geringer sein als der eigentliche Kontostand. Unterhalb dem Listeneintrag der Vergänglichkeit ist der neue Listeneintrag mit Link-Symbol sichtbar, der die Summe aller noch *offenen vorgebuchten *Transaktionen anzeigt. Falls, wie in diesem Beispiel an der Summe 0,00 GDD sichtbar, keine noch *offenen vorgebuchten *Transaktionen vorhanden sind, so kann dieser Eintrag dennoch notwendig sein, um vorhandene aber *abgelaufene vorgebuchte* Transaktionen anzeigen zu können. Mehr dazu weiter unten. + +Wie im obigen Bild zu erkennen, ist in der Liste der *geschlossenen* Transaktionen ein Eintrag sichtbar, der durch eine Valutierung einer *vorgebuchten* Transaktion entstanden ist. Dies ist an dem Link-Symbol links und an den Details wie Generierungs- und Valutierungs-Datum erkennbar. Zusätzlich ist in dem Bild genau dieser Eintrag über den Info-Button aufgeklappt, um die weiteren Details dieser Transaktion einsehen zu können. + +Wenn, wie in dem folgenden Bild dargestellt, nun *offene vorgebuchte *Transaktionen vorliegen, dann zeigen der Kontostand und der verfügbare Betrag unterschiedliche Werte an. Die Differenz ergibt sich aus dem Kontostand minus dem Betrag aus dem neuen Listen-Eintrag für *vorgebuchte* Transaktionen mit einer Summe von -249,78 GDD. + +##### ToDo: + +Müsste der verfügbare Betrag sich nicht folgendermaßen berechenen? + +`(verfügbarer Betrag) = (Kontostand) - (Vergänglichkeit seit der letzte Tx) - (Summe der vorgebuchten Transaktionen`) + +![UC_Send_Users_Gradido_TxClosedFunds.png.png](./image/UC_Send_Users_Gradido_TxClosedFunds.png) + +##### Dialog vorgebuchte Transaktionen + +Wird mit dem Info-Icon der Listen-Eintrag für vorgebuchte Transaktionen aufgeklappt, so erscheinen pro *vorgebuchter* Transaktion jeweils ein eigener Listeneintrag: + +![UC_Send_Users_Gradido_TxReservedFunds.png](./image/UC_Send_Users_Gradido_TxReservedFunds.png) + +Die Listen-Einträge der *vorgebuchten* Transaktionen sind nach ihrem Generierungszeitpunkt absteigend sortiert. Das Icon links deutet an, ob die *vorgebuchte* Transaktion als *Link* oder als *QR-Code* generiert wurde. Dann erscheint der Betrag, die Transaktionsnachricht, der Generierungs- und der Ablaufzeitpunkt sowie die *vorgebuchte* Vergänglichkeit, die bis zum maximalen Ablaufzeitpunkt anfallen würde. Über alle *vorgebuchten* Transaktionen ergibt die jeweilige Summe von Betrag plus Vergänglichkeitsbetrag die Gesamtsumme, die vom Kontostand abgezogen zu dem als verfügbaren Betrag führt. Mit dem Info-Button kann zu jedem Eintrag noch weitere Details dieser Transaktion eingeblendet werden. + +Wurde bei der Erfassung einer *vorgebuchten* Transaktion die *Anzahl der akzeptierten Valutierungen* größer als 1 eingegeben - wie in dem obigen Bild im letzten der *vorgebuchten* Transaktions-Einträge zu sehen, dann wird in dieser Liste quasi eine Art Sammel-Eintrag für alle x aktzeptierten Valutierungen angezeigt. Der angezeigte Betrag und die angezeigte Vergänglichkeit dieses "Sammel-Eintrages" entspricht der Summe der noch *offenen Valutierungen* zu dieser *vorgebuchten* Transaktion. Das heißt wenn von den zum Beispiel ursprünglich 20 aktzeptierten Valutierungen schon 4 Valutierungen abgeschlossen und damit noch 16 weitere Valutierungen zu dieser Transaktion offen sind, dann sind der Betrag, die Vergänglichkeit und die Anzahl des Sammel-Eintrages entsprechend reduziert. Die schon 4 valutierten Transaktionen werden in der Liste der *geschlossenen* Transaktionen mit jeweils 4 Einzel-Einträgen mit den fachlichen Daten der *vorgebuchten* Transaktion und dem Empfänger angezeigt. Bleiben von den möglichen 20 Valutierungen bis zum Ablaufzeitpunkt noch mögliche Valutierungen offen, dann wird der Sammel-Eintrag aus der Lister der *offenen* in die Liste der *abgelaufenen vorgebuchten* Transaktionen verschoben und die Beträge vom Verfügbarkeitsrahmen und der Gesamtsumme aller *offenen vorgebuchten* Transaktionen korrigiert. + +##### Dialog abgelaufene Transaktionen + +Für den Fall, dass evtl. ein gesendeter Link bzw. QR-Code nicht rechtzeitig eingelöst und valuliert wurde, erscheinen auch mit dem Öffnen der *vorgebuchten* Transaktionen darunter die schon *abgelaufenen* *vorgebuchten* Transaktionen in einer anderen Farbe: + +![UC_Send_Users_Gradido_TxClosedReservedInvalidFunds.png](./image/UC_Send_Users_Gradido_TxClosedReservedInvalidFunds.png) + +Die Einträge der *abgelaufenen* *vorgebuchten* Transaktionen sind absteigend nach dem Zeitpunkt der Generierung sortiert. Die Beträge und Vergänglichkeiten dieser *abgelaufenen* *vorgebuchten* Transaktionen haben keine Auswirkungen auf den Verfügbarkeitsrahmen noch auf den Kontostand und die Summe des übergeordneten Listen-Eintrags für *vorgebuchte* Transaktionen. Die betraglichen Reservierungen auf dem Konto wurden mit Überschreiten des Ablaufzeitpunktes durch ein Backendprozess korrigiert. Der User hat für eine *abgelaufene vorgebuchte* Transkation die Möglichkeit über das rechts angezeigte Doppel-Pfeil-Icon das erneute Generieren des Links bzw QR-Codes dieser Transaktion mit aktualisierten Gültigkeits- bzw Ablaufdatum zu starten. Dadurch wandert diese *abgelaufene vorgebuchte* Transkation wieder hoch in die Liste der *offenen vorgebuchten* Transaktionen und wird dort gemäß dem Generierungsdatum einsortiert angezeigt. + +Handelt es sich um ein Sammel-Eintrag einer *abgelaufenen vorgebuchten* Transaktion mit noch *offenen Valutierungen*, dann kann auch für diese Transaktion eine erneute Generierung über das Doppel-Pfeil-Icon gestartet werden. Bei der Eingabe der Daten für die erneute Generierung kann die Anzahl aktzeptierter Valutierungen wieder frei gesetzt werden. + +Damit im Laufe der Zeit die Menge der anzuzeigenden *abgelaufenen vorgebuchten* Transaktionen nicht zu unübersichtlich wird, erfolgt eine Begrenzung über eine konfigurierbare Dauer. Sind beispielsweise 3 Monate für die Anzeige von *abgelaufenen vorgebuchten* Transaktionen konfiguriert, dann werden die *abgelaufenen vorgebuchten* Transaktionen aus der Datenbank mit einerm Generierungsdatum älter als 3 Monate nicht mehr in dieser Liste angezeigt. Der User selbst hat auf diese herausgefilterten *abgelaufenen vorgebuchten* Transaktionen keinerlei Zugriff mehr, aber in der Datenbank bleiben diser vorerst einmal abgespeichert. + +#### ToDo: + +Die weiteren technischen Anforderungen, die sich aus der beschriebenen Anzeige und Verarbeitung von *gebuchten,* *vorgebuchten* und *abgelaufenen* Transaktionen für das Backend und die Persistenz ergeben, werden im noch zu erstellenden *Technischen Konzept* zu diesem UseCase beschrieben. + +### Generierung des Links/QR-Codes + +Wie anfangs schon erwähnt erfolgt die Umsetzung für diesen UseCase in zwei Schritten: + +1. einfacher Link nur online verifizierbar +2. erweiterter Link auch offline verifizierbar. + +#### online verifizierbarer Link + +Für die Generierung des Links bzw. QR-Codes werden keine fachlichen Daten der *vorgebuchten* Transkation benötigt. Diese werden vor der Generierung in der Datenbank gespeichert und mit einer UUID als PrimaryKey zur Identifikation versehen. Für die Generierung des Links bzw. des QR-Codes wird somit lediglich benötigt: + +* der Community-Name auf der der Sender angemeldet ist: `` +* der PrimaryKey als UUID der zuvor gespeicherten *vorgebuchten* Transaktion z.B.: `74738ff5-5367-5958-9aee-98fffdcd1876` + +Daraus wird dann der eigentliche Link zusammengestellt nach dem Muster: + +https://``/send/`` + +Beispiel: + +https://``/send/`74738ff5-5367-5958-9aee-98fffdcd1876` + +Die Details für die Verarbeitung beim Empfangen des Links werden weiter unten im Kapitel *Perspektive des Empfängers* beschrieben. + +Für die Übertragung per QR-Code wird der zuvor erzeugte Link in ein QR-Code konvertiert. Dabei sind ggf. weitere Konfigurationsdaten wie QR-Code Größe, Korrektur-Level für das QR-Code Scannen und Encoding o.ä. notwendig. Die Details werden im noch zu erstellenden *Technischen Konzept* zu diesem UseCase beschrieben. + +#### offline verifizierbarer Link + +Für die Generierung des offline verifzierbaren Links bzw. QR-Codes werden folgende Daten benötigt: + +* Gradido-Id des Senders: diese definiert sich gemäß dem Pattern: ``/`` und ist im Detail Dokument [Benutzerverwaltung.md - Kapitel: Gradido-Id](.\Benutzerverwaltung.md#Gradido-Id) beschrieben. +* Betrag : die Summe, die der Sender dem Empfänger übertragen möchte +* Secret : ein Key, der zur Ausführung der asynchronen Transaktion die *ungebuchten* Transaktionsdaten beim Sender identifiziert und kryptographisch sicherstellt, dass die ursprünglich gesendeten Daten nicht verfälscht sind. +* Verwendungszweck : Nachricht, die den Zweck der Transaktion beschreibt +* Ablaufzeitpunkt : der Zeitpunkt an dem der Link bzw. QR-Code ungültig wird + +Aus diesen Daten wird ein Link nach folgendem Pattern erzeugt: + +https://``/send/`` + +Beispiel: + +https://``/send/`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c` + +Das Token wird so generiert, dass es alle fachlich notwendigen Daten beinhaltet, um beim Empfänger evtl. Überprüfungen auf fachliche Korrektheit von Betrag, Nachricht oder Gültigkeitsablaufdatum durchführen zu können. Zusätzlich muss das Token die technischen und fachlichen Daten enthalten, dass die bei der Ausführung der Transaktion ablaufenden Prozesse korrekt initiiert und gesteuert werden können. Die Details für die Anforderungen beim Empfang des Tokens werden weiter unten im Kapitel *Perspektive des Empfängers* beschrieben. + +Für die Übertragung per QR-Code wird der zuvor erzeugte Link in ein QR-Code konvertiert. Dabei sind ggf. weitere Konfigurationsdaten wie QR-Code Größe, Korrektur-Level für das QR-Code Scannen und Encoding o.ä. notwendig. + +Die technischen Details zum Linkformat bzw. QR-Code werden im noch zu erstellenden *Technischen Konzept* näher beschrieben. + +### Ausgabe des Links/QR-Codes + +Nachdem der Link bzw. QR-Code generiert ist, muss eine Ausgabe für den User erfolgen. Damit der User den Link bzw. den QR-Code über ein beliebiges Medium wie Email, Messenger, etc. an einen Empfänger verschicken kann, wird dieser in einem Popup-Fenster zur Anzeige gebracht. Von dort aus kann er den Inhalt manuell kopieren oder abfotographieren lassen. + +Da im ersten Schritt keine fachlichen Daten im Link bzw. QR-Code enthalten sind werden in der Anzeige neben dem Link bzw. QR-Code zusätzlich die wichtigen fachlichen Attribute der vorgebuchten Transaktion ausgegeben. Somit kann der Sender diese Daten in der EMail, der Nachricht, etc. dem Empfänger mit senden, damit dieser die Transaktion schon vor der eigentlichen Valutierung oflfline verifzieren kann. Die folgenden Bilder zeigen wie eine Ausgabe des Übertragungslinks + +![UC_Send_Users_Gradido_TxPopupLink.png](./image/UC_Send_Users_Gradido_TxPopupLink.png) + +bzw. des QR-Codes aussehen könnte. + +![UC_Send_Users_Gradido_TxPopupQRCode.png](./image/UC_Send_Users_Gradido_TxPopupQRCode.png) + +Für die Anzeige des QR-Codes soll auch die Möglichkeit der Vergrösserung auf Fenster bzw. Bildschirmgrösse geschaffen werden - z.B. durch ein DoppelKlick auf den Code - um ein direktes Abfotographieren ohne sichtbare andere Details zu ermöglichen. + +Der Button "Alles kopieren" übernimmt den vollständig angezeigten Inhalt des Fensters (Link bzw QR-Code und die fachlichen Attribute) in die Zwischenablage, sodass dieser einfach in ein anderes Medium wie Email oder Messenger-Nachricht übertragen werden kann. + +Der Button "nur Link/QR-Code kopieren" übernimmt nur den Link bzw QR-Code ohne die fachlichen Attribute in die Zwischenablage, sodass dieser einfach in ein anderes Medium wie Email oder Messenger-Nachricht übertragen werden kann. + +## Perspektive des Empfängers + +In diesem Kapitel werden alle Aspekte aus Sicht des Empfängers beschrieben. Es werden dabei die Empfangs- und Aktivierungsmöglichkeiten sowie die Interpretation der erhaltenen Daten, die unterschiedlichen Szenarien, die der User durch eine Aktivierung durchlaufen kann und die logischen und finanzkalkulatorischen Schritte des Geldeingangs beschrieben. + +### Aktivierung und Validierung des Links + +Sobald der Empfänger den QR-Code erhalten, gescannt und zu dem Übertragungslink zurück konvertiert bzw. den Übertragungslink erhalten hat, startet mit der Aktivierung des Übertragungslink der eigentliche Valutierungsprozess des gesendeten Gradido-Betrages. + +Der Link führt den User mit einem Request direkt an den Community-Server des Senders. Dieser startet die Dekodierung des im Link enthaltenen Tokens. Als erstes wird geprüft, ob das im Token enthaltene Ablaufdatum noch nicht überschritten ist. Falls dies der Fall sein sollte, dann wird dem User eine Fehlermeldung mit Detailinformationen angezeigt, wie zum Beispiel: + +``` +Leider ist die Gültigkeit des am erzeugten Links am abgelaufen. Zur Klärung von Details und weiteren Fragen wenden sie sich bitte an den Absender, von dem sie diesen Link erhalten haben. +``` + +Es wird mit Absicht keine Detailinformationen des Absenders in der Fehlermeldung preisgegeben, da nicht bekannt bzw. sichergestellt ist, ob der User, der den Link aktiviert auch der ist, der den Link ursprünglich vom Sender erhalten hat. + +Im Falle eines noch gültigen Tokens wird im zweiten Schritt der im Token enthaltene Key verwendet, um die zu diesem Key gespeicherte *vorgebuchte* Transaktion zu lesen. Falls diese nicht mehr als offene Transaktion existiert, sprich evtl. schon vorher durch eine Aktivierung valutiert wurde, wird dem User eine Fehlermeldung angezeigt mit detaillierten Informationen wie: + +``` +Die zu diesem Link gehörende Transaktion ist nicht mehr gültig oder wurde am schon eingelöst. Zur Klärung weiterer Fragen wenden sie sich bitte an den Absender, von dem sie diesen Übertrangsungslinks bzw. QR-Codes erhalten haben. +``` + +Konnten die Daten der *vorgebuchten* Transaktion zu diesem Key gelesen werden, erfolgt vor dem Starten des eigentlichen Valutierungsprozesses eine inhaltliche Prüfung, ob die Link-Daten zu den gelesenen Daten auch passen, um sicherzugehen, dass keine Manipulationen im Link stattgefunden haben. + +#### ToDo: + +Wie diese Überprüfung technisch umgesetzt wird, bleibt hier im Detail offen und wird im *Technischen Konzept* näher beschrieben. + +Ein mögliche Variante wäre, dass beim Generieren des Links eine Checksumme über den fachlichen Inhalt erzeugt wird, die zusammen mit dem Key in der Datenbank gespeichert ist. Die Checksumme muss zu den fachlichen Daten im Link und in den gelesenen Daten passen, ansonsten gibt es eine Fehlermeldung. + +### Start der Valutierung + +Mit erfolgreicher *Validierung des Links* wird der User jetzt auf eine Seite geleitet, auf der er zwischen einem Login oder einer Registrierung auswählen kann. Sobald zukünftig Communities unterstützt werden, muss auf dieser Login- bzw. Registrierungsseite auch die Auswahl einer Community möglich sein. Der Login- bzw. Registrierungsprozess unterscheidet sich im Zusammenhang einer Valutierung von den Standard-Login- bzw. -Registrierungsprozessen dahin gehend, dass sie im Anschluss nach der erfolgreichen Anmeldung des Users direkt mit dem Valutierungsprozess weiter fortfahren. Dies muss auch gewährleistet sein, wenn sich der Empfänger bei einer anderen Community als der Sender-Community angemeldet hat. Dies zieht zusätzliche Kommunikationsschritte zwischen den beiden Community-Servern nach sich, da erst mit dem Login bzw. der Registrierung die eigentliche *Empfänger-ID* (Gradido-ID des Empfängers) bekannt und für den *Valutierungsprozess* als Eingabeparameter notwendig ist. Für die Absicherung der Kommunikation zwischen den beiden Communities muss die lokale Community dem Aufruf der Login-Validierungs- bzw. Register-Validierungs-Seite auf der entfernten Community ein *Security-Key* mit übergeben werden, der von der entfernten Community in dem darauf folgenden *disburse*-Request wieder zurückgeliefert und zur Authenifizierung und Zuordnung zu dem ursprünglichen *send*-Request verwendet wird. + +Um diese einzelnen Schritte nocheinmal zu verdeutlichen stellt das nachfolgende Bild dies schemenhaft dar: + +![UC_Send_Users_Gradido_StartValutierung.png](./image/UC_Send_Users_Gradido_StartValutierung.png) + +### Valutierungsprozess + +Der eigentliche Valutierungsprozess wird entweder direkt nach dem Login bzw. der Registrierung des Empfängers auf der gleichen Community des Senders oder durch den eingehenden *disburse*-Request von der entfernten Community, an der sich der Empfänger angemeldet bzw. registriert hat, aufgerufen. Bei beiden Varianten ist die *Empfänger-ID* der massgebliche Eingabeparameter neben den sonstigen Daten die aus dem anfänglichen *send*-Request inkl. Token herrühren. + +#### Eingabeparameter + +Als Eingabeparemeter für den Valutierungsprozess sind folgende Werte vorgesehen: + +* Sender-ID : die Gradido-ID des Senders +* Empfänger-ID : die Gradido-ID des Empfängers +* die zuvor geprüften Daten aus dem *send*-Request: + * Betrag : der Betrag, der mit der vorgebuchten Transaktion ausgezahlt werden soll + * Nachricht : der Verwendungszweck der Transaktion + * Ablaufzeitpunkt : der Zeitpunkt bis wann die vorgebuchte Transaktion spätestens valutiert werden kann + * Key : der Primärschlüssel der vorgebuchten Transaktion für einen Direktzugriff auf die schon gespeicherten Daten + +#### Ablauflogik + +Mit Start des Valutierungsprozesses werden im ersten Schritt die Eingangsparameter überprüft, ob alle notwendigen Daten übergeben wurden und bei fehlenden Daten wird der Prozess mit einer Fehlermeldung abgebrochen. Mit der Sender-ID und dem Key aus den Transaktionsdaten wird die vorgebuchte Transaktion erneut aus der Datenbank gelesen. Es erfolgt zur Sicherheit eine erneute Überbrüfung, ob die vorgebuchte Transaktion noch existiert und auch noch nicht abgelaufen ist. Dies basiert auf der Möglichkeit, dass der Login- bzw. der Registrierungsprozess, vor allem in einer fernen Community eine gewisse Zeit in Anspruch nehmen kann und dadurch evtl. die Gültigkeit doch noch überschritten werden könnte. Würde dies nicht geschehen, könnte im WorstCase der in der vorgebuchten Transaktion einkalkulierte Vergänglichkeitsbetrag nicht ausreichen und würde dann bei entsprechend niedrigem Kontostand bei einer Valutierung der *vorgebuchten* Transaktion zu einem negativen Kontostand führen. Dies ist finanzkalkulatorisch für ein Gradido-Konto nicht erlaubt und muss generell vermieden werden. + +Sind diese Prüfungen erfolgreich absolviert, erfolgt die Valutierung der *vorgebuchten* Transaktion. Dabei wird aus den Daten der *vorgebuchten* Transaktion ein Datenobjekt *Abbuchungstransaktion* erzeugt. Es wird die Vergänglichkeit seit der letzten Transaktion auf dem aktuellen Kontostand ermittelt, dann der Betrag der *vorgebuchten* Transaktion und die ermittelte Vergänglichkeit vom Kontostand abgezogen. Alle weiteren Detaildaten, insbesonderen für die spätere Transaktionsdetailanzeige - Details siehe weiter unten, werden in das *Abbuchungstransaktion*-Objekt geschrieben und dieses dann in den schon existierenden Abbuchungsprozess gegeben. Der existierende Abbuchungsprozess vollzieht dann die Übertragung der Daten an das Empfängerkonto - auch Community übergreifend - und löst dort eine Eingangsbuchung aus. Da in einer *vorgebuchten* Transaktion neben dem eigentlichen zu transferierenden Betrag eine ausreichend große Summe für Vergänglichkeit auf dem Konto geblockt wurde, kann die Ablauflogik für eine ganz normale Abbuchung durchlaufen werden. + +Es kommt aber zusätzlich zur normalen Abbuchung noch die *Valutiert-Markierung* der *vorgebuchten* Transaktion und ggf. die *Abgelaufen-Markierung* von schon abgelaufenen *vorgebuchten* Transaktionen im Nachgang hinzu. Das bedeutet, dass mit erfolgreicher Valutierung einer *vorgebuchten* Transaktion diese als *valutiert* markiert wird, so dass diese nicht mehr in der Liste der *vorgebuchten* Transaktionen im Dialog erscheint. Der User kann über die Detailanzeige der valutierenden Abbuchungstransaktion die Details der *vorgebuchten* Transaktion im nachhinein noch einsehen, um die Ursprünge der Transaktion buchhalterisch vollständig nachzuvollziehen. + +Das nachfolgende Bild zeigt den logische Ablauf des Valutierungsprozesses: + +![US-Send_Users_Gradido_Valutierungsprozess.png](./image/US-Send_Users_Gradido_Valutierungsprozess.png) + +#### Dialog Transaktions-Details + +Nachdem über den Valutierungsprozess die vorgebuchte Transaktion valutiert und damit abgeschlossen ist, kann der User diese Transaktion in seiner Liste der *gebuchten* Transaktionen sich anzeigen lassen. Dabei wird bei einer Transaktion, die aus einer *vorgebuchten* Transaktion resultiert, das Icon für ein Link oder ein QR-Code angezeigt, je nach dem welche Generierung dabei eingesetzt wurde. Über den "i"-Button können auch hier die Details der Transaktion aufgeblendet werden. Unterhalb der Transaktions-Nachricht sind bei dieser Transaktionsart der Generieungszeitpunkt und der Valutierungszeitpunkt angezeigt. Alle anderen Details bleiben unverändert. + +![UC_Send_Users_Gradido_TxClosedDetaildFunds.png](./image/UC_Send_Users_Gradido_TxClosedDetaildFunds.png) + +## Brainstorming + +Kopie aus dem Original-Dokument von Bernd: + +[https://docs.google.com/document/d/1XrcsHVyZuAm2bBWtG6uzXSPvdxV7XPM7pGcF-O8j0Hs/edit?usp=sharing](https://docs.google.com/document/d/1XrcsHVyZuAm2bBWtG6uzXSPvdxV7XPM7pGcF-O8j0Hs/edit?usp=sharing "https://docs.google.com/document/d/1XrcsHVyZuAm2bBWtG6uzXSPvdxV7XPM7pGcF-O8j0Hs/edit?usp=sharing") + +Transaktions-Link und QR-Code + +Gradido senden an jeden (zunächst mit einer Community) + +#### Anwendungen + +* Weiterempfehlen, exponentielle Verbreitung +* “Welle der Dankbarkeit” +* jedem Menschen weltweit Gradido senden +* per E-Mail, persönliche Nachricht, Gutschein, physisches Treffen +* Gradido-Id des Empfängers muss nicht bekannt sein +* Wer noch kein Konto hat, kann sich einfach registrieren und sofort GDD empfangen +* Wer bereits ein Konto hat, loggt sich ein um die GDD gutzuschreiben + +#### Link-Format + +[https://community.com/send/1234567890](https://community.com/send/1234567890) + +oder für offline-Übertragung per QR-Code: + +[https://community.com/send/1234567890/user/betrag](https://community.com/send/1234567890/user/betrag) + +Offline können z.B. Markt-Händler die QR-Codes einscannen und in einer Tabelle speichern, die später online automatisch abgearbeitet wird. + +Vorschlag: Gültigkeit 14 Tage fest eingestellt.Die Gültigkeitsdauer würde ich in einer Variablen ablegen, falls wir sie später doch noch einstellbar machen wollen. + +#### Gradido senden / Betrag blockieren + +* Der zu sendende Betrag wird blockiert, d.h. vom verfügbaren Betrag abgezogen. +* Einstellung des Betrag-Limits im User-Bereich mit Verzug der Gültigkeit von zB. 1Tag bei Umstellung +* Zusätzlich wird ein “Vergänglichkeitspuffer” von 3% (ungefähre Vergänglichkeit für 14 Tage, genau 2,63*) des zu sendenden Betrags blockiert, der sicherstellt, dass immer genug auf dem Konto ist, um den Betrag zu transferieren. +* Der Kontostand bleibt dabei erhalten. Da sich die Vergänglichkeit auf den Kontostand bezieht, braucht sie bei den blockierten Beträgen nicht berücksichtigt zu werden. +* Die entsprechenden Links / QR-Codes werden erstellt und in der Software zur Verfügung gestellt + +*Vergänglichkeit für 14 Tage = 2,63%, siehe Zeile 87-112 in folgender Kalkulation: + +[https://docs.google.com/spreadsheets/d/1y5tw9QJWOg_D-AykWpXMPAwc2WGjmrivnIP2aJ_m14k/edit#gid=0](https://docs.google.com/spreadsheets/d/1y5tw9QJWOg_D-AykWpXMPAwc2WGjmrivnIP2aJ_m14k/edit#gid=0) + +#### Gradido empfangen + +* Empfänger klickt auf den Link / fotografiert QR-Code +* Wenn Empfänger noch kein Gradido-Konto hat, kann er sich jetzt möglichst einfach registrieren. +* Wenn der Empfänger bereits ein Konto hat, loggt er sich ein und erhält den Betrag gutgeschrieben +* Händler empfängt/scanned QR-Code, dieser wird ohne login kurz entschlüsselt, um den Betrag zu prüfen und die Daten werden temporär lokal gespeichert um dann später nach Login verarbeitet zu werden + +### Detail-Beschreibungen + +E-Mails aus der Software heraus an unbekannte Empfänger zu verschicken ist problematisch. Was ist, wenn die Adresse nicht stimmt oder die Mail aus anderen Gründen nicht ankommt? Um Antwort-Mails auszuwerten bräuchten wir einen Mail-Server.Wir sollten den Versand des Links in die Verantwortung des Users geben. + +#### Textvorschlag auf der Seite “Gradido senden” + +Empfänger: Gradido-Id oder Name (wenn es noch keine Gradido-Id gibt: E-Mail oder Name) + +Wenn keine Id bzw. valide E-Mail eingegeben wurden bzw. nicht eindeutig zugeordnet werden konnte: + +Meldung: +Möchtest du die Transaktion per Link oder QR-Code ausführen? + +Buttons: Abbrechen, Link, QR-Code + +Bei Klick auf Link: + +Ein Transaktionslink mit Begleittext wurde in die Zwischenablage kopiert. Du kannst ihn nun in eine E-Mail oder persönliche Nachricht einfügen. + +Bei Klick auf QR-Code wird ein QR-Code erzeugt, der den Link erhält und von einem anderen Gerät abgescannt werden kann. diff --git a/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr b/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr index 0dabf16b8..d392ef12b 100644 Binary files a/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr and b/docu/Concepts/BusinessRequirements/graphics/GradidoÜbersichtMaske.bmpr differ diff --git a/docu/Concepts/BusinessRequirements/graphics/RegistrationProcess.drawio b/docu/Concepts/BusinessRequirements/graphics/RegistrationProcess.drawio index a0f47c920..f5e1f3bfb 100644 --- a/docu/Concepts/BusinessRequirements/graphics/RegistrationProcess.drawio +++ b/docu/Concepts/BusinessRequirements/graphics/RegistrationProcess.drawio @@ -4,7 +4,7 @@ - + @@ -60,14 +60,14 @@ - - + + - + @@ -101,7 +101,7 @@ - + @@ -112,15 +112,14 @@ - + - + - - - + + @@ -131,27 +130,13 @@ - - - - - - - - - - - - - - - + - - + + @@ -169,7 +154,7 @@ - + @@ -221,26 +206,13 @@ - + - - - - - - - - - - - - - - + @@ -248,14 +220,14 @@ - + - + @@ -283,8 +255,10 @@ - - + + + + @@ -298,14 +272,26 @@ + + + + + + + + + + + + - + - + @@ -324,18 +310,68 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/docu/Concepts/BusinessRequirements/graphics/UC_Send_Users_Gradido_StartValutierung.drawio b/docu/Concepts/BusinessRequirements/graphics/UC_Send_Users_Gradido_StartValutierung.drawio new file mode 100644 index 000000000..1c05d6392 --- /dev/null +++ b/docu/Concepts/BusinessRequirements/graphics/UC_Send_Users_Gradido_StartValutierung.drawio @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docu/Concepts/BusinessRequirements/graphics/US-Send_Users_Gradido_Valutierungsprozess.drawio b/docu/Concepts/BusinessRequirements/graphics/US-Send_Users_Gradido_Valutierungsprozess.drawio new file mode 100644 index 000000000..7a1ad006d --- /dev/null +++ b/docu/Concepts/BusinessRequirements/graphics/US-Send_Users_Gradido_Valutierungsprozess.drawio @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docu/Concepts/BusinessRequirements/graphics/VorgebuchterTransaktionsbetrag.drawio b/docu/Concepts/BusinessRequirements/graphics/VorgebuchterTransaktionsbetrag.drawio new file mode 100644 index 000000000..cf91342cb --- /dev/null +++ b/docu/Concepts/BusinessRequirements/graphics/VorgebuchterTransaktionsbetrag.drawio @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docu/Concepts/BusinessRequirements/image/RegistrationProcess.png b/docu/Concepts/BusinessRequirements/image/RegistrationProcess.png index 597675b31..3b44ac71d 100644 Binary files a/docu/Concepts/BusinessRequirements/image/RegistrationProcess.png and b/docu/Concepts/BusinessRequirements/image/RegistrationProcess.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_SendDialog.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_SendDialog.png new file mode 100644 index 000000000..1eec3ebdb Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_SendDialog.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_SendDialogPerLink.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_SendDialogPerLink.png new file mode 100644 index 000000000..eeacfcc14 Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_SendDialogPerLink.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_StartValutierung.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_StartValutierung.png new file mode 100644 index 000000000..df3deed23 Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_StartValutierung.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedDetaildFunds.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedDetaildFunds.png new file mode 100644 index 000000000..f5a43eed1 Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedDetaildFunds.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedFunds.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedFunds.png new file mode 100644 index 000000000..1a259fc1e Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedFunds.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedReservedInvalidFunds.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedReservedInvalidFunds.png new file mode 100644 index 000000000..e9603eba5 Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxClosedReservedInvalidFunds.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPlusInvalidFunds.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPlusInvalidFunds.png new file mode 100644 index 000000000..1737a4337 Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPlusInvalidFunds.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPlusReservedFunds.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPlusReservedFunds.png new file mode 100644 index 000000000..5f32fd96e Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPlusReservedFunds.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPopupLink.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPopupLink.png new file mode 100644 index 000000000..637ce2edc Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPopupLink.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPopupQRCode.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPopupQRCode.png new file mode 100644 index 000000000..6e5fac60e Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxPopupQRCode.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxReservedFunds.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxReservedFunds.png new file mode 100644 index 000000000..c30d574be Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxReservedFunds.png differ diff --git a/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxÜbersichtDialog.png b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxÜbersichtDialog.png new file mode 100644 index 000000000..9bb77a6d4 Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/UC_Send_Users_Gradido_TxÜbersichtDialog.png differ diff --git a/docu/Concepts/BusinessRequirements/image/US-Send_Users_Gradido_Valutierungsprozess.png b/docu/Concepts/BusinessRequirements/image/US-Send_Users_Gradido_Valutierungsprozess.png new file mode 100644 index 000000000..62deda81f Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/US-Send_Users_Gradido_Valutierungsprozess.png differ diff --git a/docu/Concepts/BusinessRequirements/image/VorgebuchterTransaktionsbetrag.png b/docu/Concepts/BusinessRequirements/image/VorgebuchterTransaktionsbetrag.png new file mode 100644 index 000000000..e488f73dd Binary files /dev/null and b/docu/Concepts/BusinessRequirements/image/VorgebuchterTransaktionsbetrag.png differ diff --git a/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-01-LoginMaske.md b/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-01-LoginMaske.md index eae90354f..d1a788a6b 100644 --- a/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-01-LoginMaske.md +++ b/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-01-LoginMaske.md @@ -28,8 +28,8 @@ Es wird die Anzeige der Login-Maske geprüft auf: Es wird die URL -* Testumgebung: https://stage1.gradido.net/vue/login -* Produktionsumgebung: https://gradido.net/vue/login +* Testumgebung: https://stage1.gradido.net/login +* Produktionsumgebung: https://gdd1.gradido.net/login aufgerufen und die Login-Maske wird angezeigt. diff --git a/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-02-LoginMaske.md b/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-02-LoginMaske.md index db14a3d1c..1d0a26c3e 100644 --- a/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-02-LoginMaske.md +++ b/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-02-LoginMaske.md @@ -31,8 +31,8 @@ Prüfung auf korrekten Funktionsweise des Buttons "Anmeldung": 2. Mit Betätigen des Buttons "Anmeldung" wird der Login-Prozess gestartet 1. *Gibt es noch weitere Prüfschritte (LOG-Ausgaben auf Login-, Community-Server o.ä.) die hier überprüft werden sollten?* 3. Bei erfolgreichem Login wird die URL angezeigt - * Testumgebung: "https://stage1.gradido.net/vue/overview" - * Produktionsumgebung: "https://gradido.net/vue/overview" + * Testumgebung: "https://stage1.gradido.net/overview" + * Produktionsumgebung: "https://gdd1.gradido.net/overview" 4. Bei fehlerhaftem Login wird eine entsprechend aussagekräftige Fehlermeldung angezeigt und die Anzeige verbleibt auf der Login-Maske. ## Ende-Bedingungen: diff --git a/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-03-LoginMaske.md b/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-03-LoginMaske.md index 3d9a373b2..5623aebdf 100644 --- a/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-03-LoginMaske.md +++ b/docu/Concepts/Testfallkatalog/T02-Benutzerverwaltung/T02-C001-03-LoginMaske.md @@ -21,8 +21,8 @@ Es wird in der Login-Maske die Funktion des Links "Passwort vergessen?"geprüft: Es wird die URL -* Testumgebung: https://stage1.gradido.net/vue/login -* Produktionsumgebung: https://gradido.net/vue/login +* Testumgebung: https://stage1.gradido.net/login +* Produktionsumgebung: https://gdd1.gradido.net/login aufgerufen und die Login-Maske wird angezeigt. @@ -33,8 +33,8 @@ aufgerufen und die Login-Maske wird angezeigt. * Prüfung auf korrekte Funktionsweise des Links "Passwort vergessen?" * keine sonstigen Eingaben bzw. Vorraussetzungen notwendig * Mit Betätigen des Links "Passwort vergessen?" wird der Passwort-Zurücksetzen-Prozess gestartet und unter - * der Testumgebung: https://stage1.gradido.net/vue/password - * der Produktionsumgebung: https://gradido.net/vue/password + * der Testumgebung: https://stage1.gradido.net/password + * der Produktionsumgebung: https://gdd1.gradido.net/password * folgende Maske angezeigt: ![1te Passwort zurücksetzen Maske](../image/T02-C001-03-LoginMaske1.png) @@ -70,8 +70,8 @@ aufgerufen und die Login-Maske wird angezeigt. 3. Wiederholung von Schritt 2.4.1 und 2.4.2 bis alle verfügbaren Sprachen geprüft sind 5. Link "Zurück" ist aktiv und landet auf URL - 1. Testumgebung: https://stage1.gradido.net/vue/Login - 2. Produktionsumgebung: https://gradido.net/vue/Login + 1. Testumgebung: https://stage1.gradido.net/login + 2. Produktionsumgebung: https://gdd1.gradido.net/login 6. Footer-Links: 1. "Gradido-Akademie" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de" @@ -91,8 +91,8 @@ aufgerufen und die Login-Maske wird angezeigt. ![Email-Versandmakse](../image/T02-C001-03-LoginMaske2.png) 5. **In dem angegebenen Email-Postfach wird eine Email empfangen, die ein Zurücksetzen-Link enthält:** - 1. Testumgebung: https://stage1.gradido.net/vue/reset/'erzeugter rest-code' - 2. Produktionsumgebung: https://gradido.net/vue/reset/'erzeugter reset-code' + 1. Testumgebung: https://stage1.gradido.net/reset/'erzeugter rest-code' + 2. Produktionsumgebung: https://ggd1.gradido.net/reset/'erzeugter reset-code' 6. **Mit Betätigen des Reset-Links bzw. Aufruf des Rest-Links im Browser wird folgende Maske angezeigt:** ![2te Passwort zurücksetzen Maske](../image/T02-C001-03-LoginMaske3.png) @@ -137,8 +137,8 @@ aufgerufen und die Login-Maske wird angezeigt. 3. Wiederholung von Schritt 8.3.1 und 8.3.2 bis alle verfügbaren Sprachen geprüft sind 12. Link "Zurück" ist aktiv und landet auf URL - 1. Testumgebung: https://stage1.gradido.net/vue/Login - 2. Produktionsumgebung: https://gradido.net/vue/Login + 1. Testumgebung: https://stage1.gradido.net/Login + 2. Produktionsumgebung: https://gdd1.gradido.net/Login 13. Footer-Links: 1. "Gradido-Akademie" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de" diff --git a/docu/ReleasePlaning/2022-01-27_V-1.6.0_Releaseplan.md b/docu/ReleasePlaning/2022-01-27_V-1.6.0_Releaseplan.md new file mode 100644 index 000000000..3f555e464 --- /dev/null +++ b/docu/ReleasePlaning/2022-01-27_V-1.6.0_Releaseplan.md @@ -0,0 +1,25 @@ +# Releaseplan V1.6.0 + +Die folgenden Schritte dienen zur Vorbereitung und Durchführung der Inbetriebnahme von Release V-1.6.0. + + +| LfdNr. | Aktion | verantwortlich | Status
    (Ok / Err / Ongoing) | Startzeit | Dauer in min | Endezeit | +| ------ | ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------- | --------- | ------------ | -------- | +| 1 | Finish all PRs & Finally merge everything | **@Hannes** **@ogerly** **@moriz** **@ulfgebh** | | | | | +| 2 | Make a new version 1.6.0 | **@Developer** | | | | | +| 2a | Deploy V1.6.0 on Stage 2 and make Tests to confirm a working release build | **@Developer @Bernd von Gradido** | | | | | +| 3 | Setup Klicktip settings from old production on new production (?)Make a new version 1.6.0 | ****@ulfgebhardt** **@einhornimmon**** | | | | | +| 4 | Deploy 1.6.0 on gdd.gradido.net and make sure things work as expected(rudimentary) | **@ulfgebhardt** | | | | | +| 5a | Disable Klicktipp Hook to current production gdd1.gradido.com | **@einhornimmond** | | | | | +| 5b | Disable Elopage Hook to current production gdd1.gradido.com | **@einhornimmond** | | | | | +| 6 | Deploy Maintenance page to current production & enable it | **@einhornimmond** | | | | | +| 7 | Shut down current production servers except mariadb & nginx serving the maintenance page | **@einhornimmond** | | | | | +| 8 | Create backup from production (correct format & correct data) | **@einhornimmond** | | | | | +| 9 | Shut down mariadb server | **@einhornimmond** | | | | | +| 10 | Transmit backup to new production | **@ulfgebhardt** | | | | | +| 11 | Import production data on new production | **@ulfgebhardt** | | | | | +| 12a | Enable new Klicktipp hook to new production | **@einhornimmond** **@ulfgebhard** | | | | | +| 12b | Enable new Elopage hooks to new production | **@einhornimmond** **@ulfgebhard** | | | | | +| 13 | Do extended tests on the new production | **@Team** | | | | | +| 14 | Have a permanent redirect from all old urls to the new production server:
    Which one?
    - URL1
    - URL2
    - etc. | **@einhornimmond** | | | | | +| 15 | Update links on Wordpress to the new production server | **@Bernd von Gradido** | | | | | diff --git a/docu/Templates/Templat-Overview-16-12-2021/Template-Overview-2021.pdf b/docu/Templates/Templat-Overview-16-12-2021/Template-Overview-2021.pdf new file mode 100644 index 000000000..a2e8c10af Binary files /dev/null and b/docu/Templates/Templat-Overview-16-12-2021/Template-Overview-2021.pdf differ diff --git a/docu/create-coins-as-admin.md b/docu/create-coins-as-admin.md index 6a95df119..442864cff 100644 --- a/docu/create-coins-as-admin.md +++ b/docu/create-coins-as-admin.md @@ -1,5 +1,5 @@ ### User creation -A user needs to be created on the login_server we do this when we create a User in the client https://$community_domain/vue/register. +A user needs to be created on the login_server we do this when we create a User in the client https://$community_domain/register. ### Admin user To set a User admin we need the following SQL query on the gradido_login database: @@ -9,19 +9,7 @@ INSERT INTO user_roles (id, user_id, role_id) VALUES (NULL, '1', '1'); user_id has to be found in users Now when we login in on https://$community_domain/account/ we can create coins but we will be restricted cause we can't sign the creations. -### Signation account -At first we need to enable the server user account creation with uncommenting line: 19 in -community_server/src/Controller/ServerUsersController.php -```php -$this->Auth->allow(['add', 'edit']); -``` -This enable us to use this action without being logged in. -To add a signation account we need to go on the following url: http://$community_domain/server-users/add - ### Coin creation process -The coin creation for work is done in the following url: http://$community_domain/transaction-creations/create-multi -Where we can create coins for a number of as many users as we want excepted for our self. -Furthermore we must sign the transactions we created. Normally after clicking on the left button (Transaktion abschließen) we should be automatically forwarded to http://$community_domain/account/checkTransactions where we can do this. -If not this page can also be reached by clicking on the shield-icon with the hook in it on the Dashboard, which is only shown if at least one transaction is waiting for signing. - -For debug purposes you can check the `pending_tasks` table, which is used to store the transactions which are not signed yet or had errors. \ No newline at end of file +Admin (User needs a certain role) can go through the wallet into the Admin Interface. +Their he has multiple pages, the user search page allows to find user and to create coins for them if their email was verified. He can in the multiple creation page select multiple users for which he want to create a same amount of coins. +After an Admin has proposed a creation every admin has the possibility to validate this creation except for a own creation! Every Admin can also update the proposed creation. \ No newline at end of file diff --git a/docu/graphics/roadmap.drawio b/docu/graphics/roadmap.drawio index ce6fb92b8..d16444c2f 100644 --- a/docu/graphics/roadmap.drawio +++ b/docu/graphics/roadmap.drawio @@ -1,6 +1,6 @@ - + diff --git a/docu/graphics/roadmap_V2.drawio b/docu/graphics/roadmap_V2.drawio new file mode 100644 index 000000000..4dec9ebaf --- /dev/null +++ b/docu/graphics/roadmap_V2.drawio @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docu/graphics/roadmap_V2.png b/docu/graphics/roadmap_V2.png new file mode 100644 index 000000000..42e3b89e8 Binary files /dev/null and b/docu/graphics/roadmap_V2.png differ diff --git a/docu/graphics/roadmap_publicity.drawio b/docu/graphics/roadmap_publicity.drawio index fb61449cd..8fb4fa612 100644 --- a/docu/graphics/roadmap_publicity.drawio +++ b/docu/graphics/roadmap_publicity.drawio @@ -1,108 +1,105 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + diff --git a/docu/onboarding_process.md b/docu/onboarding_process.md new file mode 100644 index 000000000..8b748a33f --- /dev/null +++ b/docu/onboarding_process.md @@ -0,0 +1,25 @@ +# Onboarding process +## Meeting with Bernd (zoom) +## Meeting with Claus-Peter and perhaps concerning team member (zoom) +## Presentation to all team members (discord) +## Grant access to +- Nextcloud server +- Add to github repository (create github account if not available) +## Start working +- install docker desktop +- install git: https://git-scm.com/book/de/v2/Erste-Schritte-Git-installieren +- add new ssh key: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account +- download gradido repository: git clone git@github.com:gradido/gradido.git --recursive +- install visual studio code +- docker-compose build +- docker-compose up +http://localhost/vue should be same as https://gdd1.gradido.com/vue + +## git basics to update this document +- git status +- git branch onboarding_process +- git checkout onboarding_process +- git add onboarding_process.md +- git commit +- git push +- git push --set-upstream origin onboarding_process diff --git a/frontend/.dockerignore b/frontend/.dockerignore index 88249539f..1ddda051a 100644 --- a/frontend/.dockerignore +++ b/frontend/.dockerignore @@ -1,3 +1,4 @@ node_modules .git -.gitignore \ No newline at end of file +.gitignore +!.eslintignore \ No newline at end of file diff --git a/frontend/.env.dist b/frontend/.env.dist index 80dafb7f9..df3c7cd7e 100644 --- a/frontend/.env.dist +++ b/frontend/.env.dist @@ -1,4 +1,13 @@ -GRAPHQL_URI=http://localhost:4000/graphql +CONFIG_VERSION=v1.2022-03-18 + +META_URL=http://localhost +META_TITLE_DE="Gradido – Dein Dankbarkeitskonto" +META_TITLE_EN="Gradido - Your gratitude account" +META_DESCRIPTION_DE="Dankbarkeit ist die Währung der neuen Zeit. Immer mehr Menschen entfalten ihr Potenzial und gestalten eine gute Zukunft für alle." +META_DESCRIPTION_EN="Gratitude is the currency of the new age. More and more people are unleashing their potential and shaping a good future for all." +META_KEYWORDS_DE="Grundeinkommen, Währung, Dankbarkeit, Schenk-Ökonomie, Natürliche Ökonomie des Lebens, Ökonomie, Ökologie, Potenzialentfaltung, Schenken und Danken, Kreislauf des Lebens, Geldsystem" +META_KEYWORDS_EN="Basic Income, Currency, Gratitude, Gift Economy, Natural Economy of Life, Economy, Ecology, Potential Development, Giving and Thanking, Cycle of Life, Monetary System" +META_AUTHOR="Bernd Hückstädt - Gradido-Akademie" +GRAPHQL_URI=http://localhost/graphql DEFAULT_PUBLISHER_ID=2896 -#BUILD_COMMIT=0000000 -ADMIN_AUTH_URL=http://localhost/admin/authenticate?token=$1 \ No newline at end of file +ADMIN_AUTH_URL=http://localhost/admin/authenticate?token={token} \ No newline at end of file diff --git a/frontend/.env.template b/frontend/.env.template new file mode 100644 index 000000000..4e4a86d08 --- /dev/null +++ b/frontend/.env.template @@ -0,0 +1,13 @@ +CONFIG_VERSION=$FRONTEND_CONFIG_VERSION + +META_URL=$META_URL +META_TITLE_DE=$META_TITLE_DE +META_TITLE_EN=$META_TITLE_EN +META_DESCRIPTION_DE=$META_DESCRIPTION_DE +META_DESCRIPTION_EN=$META_DESCRIPTION_EN +META_KEYWORDS_DE=$META_KEYWORDS_DE +META_KEYWORDS_EN=$META_KEYWORDS_EN +META_AUTHOR=$META_AUTHOR +GRAPHQL_URI=$GRAPHQL_URI +DEFAULT_PUBLISHER_ID=2896 +ADMIN_AUTH_URL=$ADMIN_AUTH_URL \ No newline at end of file diff --git a/frontend/.eslintignore b/frontend/.eslintignore index e973d3709..94934f9e7 100644 --- a/frontend/.eslintignore +++ b/frontend/.eslintignore @@ -1,3 +1,3 @@ -node_modules -**/*.min.js -dist \ No newline at end of file +node_modules/ +dist/ +coverage/ \ No newline at end of file diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 8c410feba..4e45ede62 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -8,14 +8,58 @@ module.exports = { parserOptions: { parser: 'babel-eslint', }, - extends: ['standard', 'plugin:vue/essential', 'plugin:prettier/recommended'], + extends: [ + 'standard', + 'plugin:vue/essential', + 'plugin:prettier/recommended', + 'plugin:@intlify/vue-i18n/recommended', + ], // required to lint *.vue files plugins: ['vue', 'prettier', 'jest'], + overrides: [ + { + files: ['*.json'], + extends: ['plugin:@intlify/vue-i18n/recommended'], + rules: { + // TODO: enable + '@intlify/vue-i18n/no-html-messages': 'off', + }, + }, + ], // add your custom rules here rules: { 'no-console': ['error'], 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'vue/component-name-in-template-casing': ['error', 'kebab-case'], + 'vue/no-static-inline-styles': [ + 'error', + { + allowBinding: false, + }, + ], + '@intlify/vue-i18n/no-dynamic-keys': 'error', + '@intlify/vue-i18n/no-unused-keys': [ + 'error', + { + src: './src', + extensions: ['.js', '.vue'], + // TODO: remove ignores + ignores: [ + '/site.thx./', + '/form./', + '/time./', + '/decay.types./', + 'settings.password.resend_subtitle', + 'settings.password.reset-password.text', + 'settings.password.set', + 'settings.password.set-password.text', + 'settings.password.subtitle', + 'site.login.signin', + ], + enableFix: false, + }, + ], + '@intlify/vue-i18n/no-missing-keys-in-other-locales': 'error', 'prettier/prettier': [ 'error', { @@ -23,4 +67,12 @@ module.exports = { }, ], }, + settings: { + 'vue-i18n': { + localeDir: './src/locales/*.json', + // Specify the version of `vue-i18n` you are using. + // If not specified, the message will be parsed twice. + messageSyntaxVersion: '^8.22.4', + }, + }, } diff --git a/frontend/.gitignore b/frontend/.gitignore index 74ffc56c3..b19667d17 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -5,10 +5,10 @@ dist/ npm-debug.log* yarn-debug.log* yarn-error.log* -test/unit/coverage package-lock.json -.env +/.env +/.env.bak .env.development.local .env.production.local diff --git a/frontend/.stylelintrc.js b/frontend/.stylelintrc.js new file mode 100644 index 000000000..061b87a79 --- /dev/null +++ b/frontend/.stylelintrc.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = { + extends: ["stylelint-config-standard-scss", "stylelint-config-recommended-vue"], + overrides: [ + { + files: "**/*.{scss}", + customSyntax: "postcss-scss", + extends: ["stylelint-config-standard-scss"], + }, + { + files: "**/*.vue", + customSyntax: "postcss-html", + extends: ["stylelint-config-recommended-vue"], + } + ] + +}; \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 879fdf4e0..a9d7572f2 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,7 +1,7 @@ ################################################################################## # BASE ########################################################################### ################################################################################## -FROM node:12.19.0-alpine3.10 as base +FROM node:16-alpine3.14 as base # ENVs (available in production aswell, can be overwritten by commandline or env file) ## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame @@ -31,8 +31,8 @@ LABEL org.label-schema.schema-version="1.0" LABEL maintainer="support@ogradido.net" # Install Additional Software -## install: git -#RUN apk --no-cache add git +## install: node-gyp dependencies +RUN apk --no-cache add g++ make python3 # Settings ## Expose Container Port diff --git a/frontend/jest.config.js b/frontend/jest.config.js index 5caae815c..2a52ec707 100644 --- a/frontend/jest.config.js +++ b/frontend/jest.config.js @@ -12,6 +12,7 @@ module.exports = { '\\.(css|less)$': 'identity-obj-proxy', '\\.(scss)$': '/src/assets/mocks/styleMock.js', '^@/(.*)$': '/src/$1', + '^@test/(.*)$': '/test/$1', }, transform: { '^.+\\.vue$': 'vue-jest', diff --git a/frontend/package.json b/frontend/package.json index cfa7be87c..6ccf37d09 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,17 +1,17 @@ { "name": "bootstrap-vue-gradido-wallet", - "version": "1.5.1", + "version": "1.6.6", "private": true, "scripts": { "start": "node run/server.js", "serve": "vue-cli-service serve --open", "build": "vue-cli-service build", - "analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json", - "lint": "eslint --ext .js,.vue .", "dev": "yarn run serve", - "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'", - "test": "jest --coverage", - "locales": "scripts/missing-keys.sh && scripts/sort.sh" + "analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json", + "lint": "eslint --max-warnings=0 --ext .js,.vue,.json .", + "stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'", + "test": "TZ=UTC jest --coverage", + "locales": "scripts/sort.sh" }, "dependencies": { "@babel/core": "^7.13.13", @@ -20,16 +20,11 @@ "@vue/cli-plugin-unit-jest": "^4.5.12", "@vue/test-utils": "^1.1.3", "apollo-boost": "^0.4.9", - "axios": "^0.21.1", "babel-core": "^7.0.0-bridge.0", "babel-jest": "^27.3.1", "babel-preset-vue": "^2.0.2", - "bootstrap": "4.3.1", - "bootstrap-vue": "^2.5.0", - "d3": "^5.7.0", - "datamaps": "^0.5.9", - "date-fns": "^1.30.1", - "dropzone": "^5.5.1", + "bootstrap": "^4.5.3", + "bootstrap-vue": "^2.21.2", "es6-promise": "^4.1.1", "eslint": "^7.25.0", "eslint-config-prettier": "^8.1.0", @@ -44,31 +39,21 @@ "express": "^4.17.1", "flatpickr": "^4.5.7", "flush-promises": "^1.0.2", - "fuse.js": "^3.2.0", - "google-maps": "^3.2.1", "graphql": "^15.5.1", "identity-obj-proxy": "^3.0.0", "jest": "^26.6.3", "jest-canvas-mock": "^2.3.1", "jest-environment-jsdom-sixteen": "^2.0.0", - "nouislider": "^12.1.0", "particles-bg-vue": "1.2.3", - "perfect-scrollbar": "^1.3.0", + "portal-vue": "^2.1.7", "prettier": "^2.2.1", "qrcode": "^1.4.4", - "quill": "^1.3.6", "regenerator-runtime": "^0.13.7", - "sweetalert2": "^9.5.4", "vee-validate": "^3.4.5", - "vue": "^2.6.11", + "vue": "2.6.12", "vue-apollo": "^3.0.7", - "vue-bootstrap-typeahead": "^0.2.6", - "vue-cli-plugin-i18n": "^1.0.1", - "vue-clickaway": "^2.2.2", - "vue-clipboard2": "^0.3.0", "vue-flatpickr-component": "^8.1.2", "vue-focus": "^2.1.0", - "vue-good-table": "^2.21.3", "vue-i18n": "^8.22.4", "vue-jest": "^3.0.7", "vue-loading-overlay": "^3.4.2", @@ -76,12 +61,12 @@ "vue-qrcode": "^0.3.5", "vue-qrcode-reader": "^2.3.16", "vue-router": "^3.0.6", - "vue-toasted": "^1.1.28", "vue2-transitions": "^0.2.3", "vuex": "^3.6.0", "vuex-persistedstate": "^4.0.0-beta.3" }, "devDependencies": { + "@intlify/eslint-plugin-vue-i18n": "^1.4.0", "@vue/cli-plugin-babel": "^3.7.0", "@vue/cli-plugin-eslint": "^3.7.0", "@vue/cli-service": "^3.7.0", @@ -90,9 +75,17 @@ "babel-plugin-component": "^1.1.0", "babel-plugin-transform-require-context": "^0.1.1", "dotenv-webpack": "^7.0.3", - "node-sass": "^6.0.1", + "postcss": "^8.4.8", + "postcss-html": "^1.3.0", + "postcss-scss": "^4.0.3", + "sass": "1.32.13", "sass-loader": "^10", "stats-webpack-plugin": "^0.7.0", + "stylelint": "^14.5.3", + "stylelint-config-recommended-vue": "^1.3.0", + "stylelint-config-standard-scss": "^3.0.0", + "vue-cli-plugin-i18n": "^1.0.1", + "vue-html-webpack-plugin": "^3.2.2", "vue-template-compiler": "^2.6.11", "webpack-bundle-analyzer": "^4.5.0" }, diff --git a/frontend/public/img/gradido-wallet-650-400.jpg b/frontend/public/img/gradido-wallet-650-400.jpg new file mode 100644 index 000000000..b851460a2 Binary files /dev/null and b/frontend/public/img/gradido-wallet-650-400.jpg differ diff --git a/frontend/public/index.html b/frontend/public/index.html index 4aad83f03..b9abe3876 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + -
    - -
    - diff --git a/frontend/public/json-example/admin_card_statistic.json b/frontend/public/json-example/admin_card_statistic.json deleted file mode 100644 index bacdccb5a..000000000 --- a/frontend/public/json-example/admin_card_statistic.json +++ /dev/null @@ -1,36 +0,0 @@ -{"state":"success", "statisticdata": - [ - { - "i_creation_sum": 29288278.4653, - "i_creation_mon": 68278.4653, - "i_creation_365d": 19288278.4653, - "i_creation_30d": 288278.4653, - "i_creation_14d": 88278.4653, - "i_creation_7d": 3278.4653 - }, - { - "i_transience_sum": 8278.4653, - "i_transience_mon": 8278.4653, - "i_transience_365d": 8278.4653, - "i_transience_30d": 178.4653, - "i_transience_14d": 78.4653, - "i_transience_7d": 8.4653 - }, - { - "i_exchange_sum": 23345.2324, - "i_exchange_mon": 2, - "i_exchange_365d": 2, - "i_exchange_30d": 2, - "i_exchange_14d": 2, - "i_exchange_7d": 2 - }, - { - "i_members_sum": 5398, - "i_members_mon": 234, - "i_members_365d": 2356, - "i_members_30d": 123, - "i_members_14d": 23, - "i_members_7d": 24 - } - ] -} \ No newline at end of file diff --git a/frontend/public/json-example/admin_charts_statistic.json b/frontend/public/json-example/admin_charts_statistic.json deleted file mode 100644 index 8c7e6667b..000000000 --- a/frontend/public/json-example/admin_charts_statistic.json +++ /dev/null @@ -1,64 +0,0 @@ -{"state":"success", "statisticdata": - [ - { - "charts_creation_0_mon": 5635, - "charts_creation_1_mon": 5635, - "charts_creation_2_mon": 5635, - "charts_creation_3_mon": 5635, - "charts_creation_4_mon": 5635, - "charts_creation_5_mon": 5635, - "charts_creation_6_mon": 5635, - "charts_creation_7_mon": 5635, - "charts_creation_8_mon": 5635, - "charts_creation_9_mon": 5635, - "charts_creation_10_mon": 5635, - "charts_creation_11_mon": 5635, - "charts_creation_12_mon": 5635 - }, - { - "charts_transience_0_mon": 5635, - "charts_transience_1_mon": 5635, - "charts_transience_2_mon": 5635, - "charts_transience_3_mon": 5635, - "charts_transience_4_mon": 5635, - "charts_transience_5_mon": 5635, - "charts_transience_6_mon": 5635, - "charts_transience_7_mon": 5635, - "charts_transience_8_mon": 5635, - "charts_transience_9_mon": 5635, - "charts_transience_10_mon": 5635, - "charts_transience_11_mon": 5635, - "charts_transience_12_mon": 5635 - }, - { - "charts_exchange_0_mon": 5635, - "charts_exchange_1_mon": 5635, - "charts_exchange_2_mon": 5635, - "charts_exchange_3_mon": 5635, - "charts_exchange_4_mon": 5635, - "charts_exchange_5_mon": 5635, - "charts_exchange_6_mon": 5635, - "charts_exchange_7_mon": 5635, - "charts_exchange_8_mon": 5635, - "charts_exchange_9_mon": 5635, - "charts_exchange_10_mon": 5635, - "charts_exchange_11_mon": 5635, - "charts_exchange_12_mon": 5635 - }, - { - "charts_members_0_mon": 5635, - "charts_members_1_mon": 5635, - "charts_members_2_mon": 5635, - "charts_members_3_mon": 5635, - "charts_members_4_mon": 5635, - "charts_members_5_mon": 5635, - "charts_members_6_mon": 5635, - "charts_members_7_mon": 5635, - "charts_members_8_mon": 5635, - "charts_members_9_mon": 5635, - "charts_members_10_mon": 5635, - "charts_members_11_mon": 5635, - "charts_members_12_mon": 5635 - } - ] -} \ No newline at end of file diff --git a/frontend/public/json-example/admin_community_statistic.json b/frontend/public/json-example/admin_community_statistic.json deleted file mode 100644 index f083991aa..000000000 --- a/frontend/public/json-example/admin_community_statistic.json +++ /dev/null @@ -1,19 +0,0 @@ -{"state":"success", "statisticdata": - [ - { - "community_entries1_mon": 5635, - "community_entries2_mon": 5635, - "community_entries3_mon": 5635, - "community_entries4_mon": 5635, - "community_entries5_mon": 5635, - "community_entries6_mon": 5635, - "community_entries7_mon": 5635, - "community_entries8_mon": 5635, - "community_entries9_mon": 5635, - "community_entries0_mon": 5635, - "community_entries10_mon": 5635, - "community_entries11_mon": 5635, - "community_entries12_mon": 5635 - } - ] -} \ No newline at end of file diff --git a/frontend/public/json-example/admin_transaction_list.json b/frontend/public/json-example/admin_transaction_list.json deleted file mode 100644 index a1af47db8..000000000 --- a/frontend/public/json-example/admin_transaction_list.json +++ /dev/null @@ -1,61 +0,0 @@ -{"state":"success", "transactions": - [ - { - "name": "Jon Tester", - "email": "jon@example.de", - "type": "send", - "transaction_id": 12, - "date": "29-11-2020", - "balance": 7000, - "memo": "Reperatur Waschbecken", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Gradido Community", - "email": "gradido@example.de", - "type": "creation", - "transaction_id": 11, - "date": "1-11-2020", - "balance": 10000, - "memo": "Müll gesammelt im Wald", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Maria Tester", - "email": "maria@example.de", - "type": "receive", - "transaction_id": 7, - "date": "23-10-2020", - "balance": 5000, - "memo": "Spende an Alice ", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Alice Tester", - "email": "alice@example.de", - "type": "receive", - "transaction_id": 5, - "date": "2-8-2020", - "balance": 1000, - "memo": "Bob hat meinen Müll getrennt", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Gradido Community", - "email": "gradido@example.de", - "type": "creation", - "transaction_id": 1, - "date": "11-7-2020", - "balance": 10000, - "memo": "Bob hat meinen Müll getrennt", - "pubkey": "abcdefghi123456789" - - } - ], - "transactionExecutingCount": 8750, - "count": 5 -} \ No newline at end of file diff --git a/frontend/public/json-example/admin_transience_list.json b/frontend/public/json-example/admin_transience_list.json deleted file mode 100644 index 0cbacfbd8..000000000 --- a/frontend/public/json-example/admin_transience_list.json +++ /dev/null @@ -1,49 +0,0 @@ -{"state":"success", "participation": - [ - { - "name": "", - "type": "submitted", - "participation_id": 412, - "date_submitted": "9-12-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "8-12-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - }, - { - "name": "", - "type": "in progress", - "participation_id": 312, - "date_submitted": "2-11-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "2-11-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - }, - { - "name": "", - "type": "confirmed", - "participation_id": 212, - "date_submitted": "20-10-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "20-10-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - }, - { - "name": "", - "type": "rejected", - "participation_id": 142, - "date_submitted": "17-9-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "17-9-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - } - ], - "count": 4 -} \ No newline at end of file diff --git a/frontend/public/json-example/admin_userlist.json b/frontend/public/json-example/admin_userlist.json deleted file mode 100644 index a8550716f..000000000 --- a/frontend/public/json-example/admin_userlist.json +++ /dev/null @@ -1,52 +0,0 @@ -{"state":"success", "admin0userlist": - [ - { - "created": 1578688666, - "disabled": false, - "email": "dervommond@gmail.com", - "email_checked": true, - "first_name": "Max", - "group_alias": "gdd1", - "ident_hash": 2928827813, - "last_name": "Miau", - "public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b", - "role": "admin", - "username": "", - "balance_gdd": 174500, - "balance_gdt": 4500, - "errorCount": 0 - }, - { - "created": 1578685678, - "disabled": false, - "email": "ttwer@gmail.com", - "email_checked": true, - "first_name": "John", - "group_alias": "gdd1", - "ident_hash": 2928827813, - "last_name": "Doe", - "public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71x", - "role": "user", - "username": "", - "balance_gdd": 144500, - "balance_gdt": 0, - "errorCount": 0 - }, - { - "created": 1578635671, - "disabled": false, - "email": "test@gmail.com", - "email_checked": true, - "first_name": "Alice", - "group_alias": "gdd1", - "ident_hash": 4928827813, - "last_name": "Seer", - "public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71a", - "role": "user", - "username": "", - "balance_gdd": 444500, - "balance_gdt": 4500, - "errorCount": 0 - } - ] -} \ No newline at end of file diff --git a/frontend/public/json-example/example.json b/frontend/public/json-example/example.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/public/json-example/userdata.json b/frontend/public/json-example/userdata.json deleted file mode 100644 index 69f5a8041..000000000 --- a/frontend/public/json-example/userdata.json +++ /dev/null @@ -1,19 +0,0 @@ -{"state":"success", "userdata": - [ - { - "created": 1578688666, - "disabled": false, - "email": "dervommond@gmail.com", - "email_checked": true, - "first_name": "Max", - "group_alias": "gdd1", - "ident_hash": 2928827813, - "last_name": "Miau", - "public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b", - "role": "admin", - "username": "", - "balance": 174500, - "errorCount": 0 - } - ] -} \ No newline at end of file diff --git a/frontend/public/json-example/userparticipation.json b/frontend/public/json-example/userparticipation.json deleted file mode 100644 index 4e29f117b..000000000 --- a/frontend/public/json-example/userparticipation.json +++ /dev/null @@ -1,45 +0,0 @@ -{"state":"success", "participation": - [ - { - "type": "submitted", - "participation_id": 412, - "date_submitted": "9-12-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "8-12-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - }, - { - "type": "in progress", - "participation_id": 312, - "date_submitted": "2-11-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "2-11-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - }, - { - "type": "confirmed", - "participation_id": 212, - "date_submitted": "20-10-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "20-10-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - }, - { - "type": "rejected", - "participation_id": 142, - "date_submitted": "17-9-2020", - "titel": "Lorem Ipsum panta lore es Tastina sero was. ", - "text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ", - "date_participation": "17-9-2020", - "plz_participation": "01099", - "pubkey": "abcdefghi123456789" - } - ], - "count": 4 -} \ No newline at end of file diff --git a/frontend/public/json-example/usertransactions.json b/frontend/public/json-example/usertransactions.json deleted file mode 100644 index a1af47db8..000000000 --- a/frontend/public/json-example/usertransactions.json +++ /dev/null @@ -1,61 +0,0 @@ -{"state":"success", "transactions": - [ - { - "name": "Jon Tester", - "email": "jon@example.de", - "type": "send", - "transaction_id": 12, - "date": "29-11-2020", - "balance": 7000, - "memo": "Reperatur Waschbecken", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Gradido Community", - "email": "gradido@example.de", - "type": "creation", - "transaction_id": 11, - "date": "1-11-2020", - "balance": 10000, - "memo": "Müll gesammelt im Wald", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Maria Tester", - "email": "maria@example.de", - "type": "receive", - "transaction_id": 7, - "date": "23-10-2020", - "balance": 5000, - "memo": "Spende an Alice ", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Alice Tester", - "email": "alice@example.de", - "type": "receive", - "transaction_id": 5, - "date": "2-8-2020", - "balance": 1000, - "memo": "Bob hat meinen Müll getrennt", - "pubkey": "abcdefghi123456789" - - }, - { - "name": "Gradido Community", - "email": "gradido@example.de", - "type": "creation", - "transaction_id": 1, - "date": "11-7-2020", - "balance": 10000, - "memo": "Bob hat meinen Müll getrennt", - "pubkey": "abcdefghi123456789" - - } - ], - "transactionExecutingCount": 8750, - "count": 5 -} \ No newline at end of file diff --git a/frontend/run/server.js b/frontend/run/server.js index 8a3f54557..7d75acba8 100644 --- a/frontend/run/server.js +++ b/frontend/run/server.js @@ -1,15 +1,21 @@ // Imports const express = require('express') -const serveStatic = require('serve-static') +const path = require('path') -// Port +// Host & Port +const hostname = '127.0.0.1' const port = process.env.PORT || 3000 // Express Server const app = express() -// eslint-disable-next-line node/no-path-concat -app.use(serveStatic(__dirname + '/../dist')) -app.listen(port) +// Serve files +app.use(express.static(path.join(__dirname, '../dist'))) +// Default to index.html +app.get('*', (req, res) => { + res.sendFile(path.join(__dirname, '../dist/index.html')) +}) -// eslint-disable-next-line no-console -console.log(`http://frontend:${port} server started.`) +app.listen(port, hostname, () => { + // eslint-disable-next-line no-console + console.log('Listening at http://%s:%s/', hostname, port) +}) diff --git a/frontend/scripts/missing-keys.sh b/frontend/scripts/missing-keys.sh deleted file mode 100755 index 6dbaee897..000000000 --- a/frontend/scripts/missing-keys.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -ROOT_DIR=$(dirname "$0")/.. - -sorting="jq -f $ROOT_DIR/scripts/sort_filter.jq" -english="$sorting $ROOT_DIR/src/locales/en.json" -german="$sorting $ROOT_DIR/src/locales/de.json" -listPaths="jq -c 'path(..)|[.[]|tostring]|join(\".\")'" -diffString="<( $english | $listPaths ) <( $german | $listPaths )" -if eval "diff -q $diffString"; -then - : # all good -else - eval "diff -y $diffString | grep '[|<>]'"; - printf "\nEnglish and German translation keys do not match, see diff above.\n" - exit 1 -fi diff --git a/admin/scripts/missing-keys.sh b/frontend/scripts/missing-keys.sh.old similarity index 100% rename from admin/scripts/missing-keys.sh rename to frontend/scripts/missing-keys.sh.old diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 25b0eadc5..d7945ec69 100755 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -10,8 +10,8 @@ diff --git a/frontend/src/assets/scss/argon.scss b/frontend/src/assets/scss/argon.scss deleted file mode 100644 index 1fa663a5f..000000000 --- a/frontend/src/assets/scss/argon.scss +++ /dev/null @@ -1,126 +0,0 @@ -/*! - -========================================================= -* Bootstrap Vue Gradido Wallet- v0.0.1 -========================================================= - -* Product Page: https://www.gradido.net -* Copyright 2020 Bernd Hückstädt - Gradido (https://www.gradido.net) - -* Coded by www.gradido.net - -========================================================= - -* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -*/ - -// Core - -@import "custom/functions"; -@import "custom/variables"; -@import "custom/mixins"; - -// Bootstrap (4.1.3) components - -@import "~bootstrap/scss/alert"; -@import "~bootstrap/scss/badge"; -@import "~bootstrap/scss/breadcrumb"; -@import "~bootstrap/scss/button-group"; -@import "~bootstrap/scss/buttons"; -@import "~bootstrap/scss/card"; -@import "~bootstrap/scss/carousel"; -@import "~bootstrap/scss/close"; -@import "~bootstrap/scss/code"; -@import "~bootstrap/scss/custom-forms"; -@import "~bootstrap/scss/dropdown"; -@import "~bootstrap/scss/forms"; -@import "~bootstrap/scss/grid"; -@import "~bootstrap/scss/images"; -@import "~bootstrap/scss/input-group"; -@import "~bootstrap/scss/jumbotron"; -@import "~bootstrap/scss/list-group"; -@import "~bootstrap/scss/media"; -@import "~bootstrap/scss/modal"; -@import "~bootstrap/scss/nav"; -@import "~bootstrap/scss/navbar"; -@import "~bootstrap/scss/pagination"; -@import "~bootstrap/scss/popover"; -@import "~bootstrap/scss/print"; -@import "~bootstrap/scss/progress"; -@import "~bootstrap/scss/reboot"; -@import "~bootstrap/scss/root"; -@import "~bootstrap/scss/tables"; -@import "~bootstrap/scss/toasts"; -@import "~bootstrap/scss/tooltip"; -@import "~bootstrap/scss/transitions"; -@import "~bootstrap/scss/type"; -@import "~bootstrap/scss/utilities"; -@import "~bootstrap/scss/variables"; - -// Utilities - -@import "~bootstrap/scss/utilities/align"; -@import "~bootstrap/scss/utilities/background"; -@import "~bootstrap/scss/utilities/borders"; -@import "~bootstrap/scss/utilities/clearfix"; -@import "~bootstrap/scss/utilities/display"; -@import "~bootstrap/scss/utilities/embed"; -@import "~bootstrap/scss/utilities/flex"; -@import "~bootstrap/scss/utilities/float"; -@import "~bootstrap/scss/utilities/overflow"; -@import "~bootstrap/scss/utilities/position"; -@import "~bootstrap/scss/utilities/screenreaders"; -@import "~bootstrap/scss/utilities/shadows"; -@import "~bootstrap/scss/utilities/sizing"; -@import "~bootstrap/scss/utilities/spacing"; -@import "~bootstrap/scss/utilities/stretched-link"; -@import "~bootstrap/scss/utilities/text"; -@import "~bootstrap/scss/utilities/visibility"; - - -// Mixins - -@import "~bootstrap/scss/mixins/alert"; -@import "~bootstrap/scss/mixins/badge"; -@import "~bootstrap/scss/mixins/border-radius"; -@import "~bootstrap/scss/mixins/box-shadow"; -@import "~bootstrap/scss/mixins/breakpoints"; -@import "~bootstrap/scss/mixins/buttons"; -@import "~bootstrap/scss/mixins/caret"; -@import "~bootstrap/scss/mixins/clearfix"; -@import "~bootstrap/scss/mixins/deprecate"; -@import "~bootstrap/scss/mixins/float"; -@import "~bootstrap/scss/mixins/forms"; -@import "~bootstrap/scss/mixins/gradients"; -@import "~bootstrap/scss/mixins/grid-framework"; -@import "~bootstrap/scss/mixins/grid"; -@import "~bootstrap/scss/mixins/hover"; -@import "~bootstrap/scss/mixins/image"; -@import "~bootstrap/scss/mixins/list-group"; -@import "~bootstrap/scss/mixins/lists"; -@import "~bootstrap/scss/mixins/nav-divider"; -@import "~bootstrap/scss/mixins/pagination"; -@import "~bootstrap/scss/mixins/reset-text"; -@import "~bootstrap/scss/mixins/resize"; -@import "~bootstrap/scss/mixins/screen-reader"; -@import "~bootstrap/scss/mixins/size"; -@import "~bootstrap/scss/mixins/table-row"; -@import "~bootstrap/scss/mixins/text-emphasis"; -@import "~bootstrap/scss/mixins/text-hide"; -@import "~bootstrap/scss/mixins/text-truncate"; -@import "~bootstrap/scss/mixins/transition"; -@import "~bootstrap/scss/mixins/visibility"; - - -// Argon utilities and components - -@import "custom/reboot"; -@import "custom/utilities"; -@import "custom/components"; - -// Vendor (Plugins) - -@import "custom/vendors"; - - diff --git a/frontend/src/assets/scss/core/alerts/_alert-dismissible.scss b/frontend/src/assets/scss/core/alerts/_alert-dismissible.scss deleted file mode 100644 index aa15ad1db..000000000 --- a/frontend/src/assets/scss/core/alerts/_alert-dismissible.scss +++ /dev/null @@ -1,39 +0,0 @@ -// -// Dismissible alert -// - -.alert-dismissible { - .close { - top: 50%; - right: $alert-padding-x; - padding: 0; - transform: translateY(-50%); - color: rgba($white, .6); - opacity: 1; - - &:hover, - &:focus { - color: rgba($white, .9); - opacity: 1 !important; - } - - @include media-breakpoint-down(xs) { - top: 1rem; - right: .5rem; - } - - &>span:not(.sr-only) { - font-size: 1.5rem; - background-color: transparent; - color: rgba($white, .6); - } - - &:hover, - &:focus { - &>span:not(.sr-only) { - background-color: transparent; - color: rgba($white, .9); - } - } - } -} diff --git a/frontend/src/assets/scss/core/alerts/_alert.scss b/frontend/src/assets/scss/core/alerts/_alert.scss deleted file mode 100644 index a9bc230a4..000000000 --- a/frontend/src/assets/scss/core/alerts/_alert.scss +++ /dev/null @@ -1,46 +0,0 @@ -// -// Alert -// - -.alert { - font-size: $font-size-sm; -} - -// Alert heading - -.alert-heading { - font-weight: $font-weight-bold; - font-size: $h4-font-size; - margin-top: .15rem; -} - - -// Alert icon -.alert-icon { - font-size: 1.25rem; - margin-right: 1.25rem; - display: inline-block; - vertical-align: middle; - - i.ni { - position: relative; - top: 1px; - } -} - - -// Alert text next to an alert icon -.alert-text { - display: inline-block; - vertical-align: middle; -} - - -// Alert links - -[class*="alert-"] { - .alert-link { - color: $white; - border-bottom: 1px dotted rgba($white, .5); - } -} diff --git a/frontend/src/assets/scss/core/avatars/_avatar-group.scss b/frontend/src/assets/scss/core/avatars/_avatar-group.scss deleted file mode 100644 index 0fcf4cf21..000000000 --- a/frontend/src/assets/scss/core/avatars/_avatar-group.scss +++ /dev/null @@ -1,22 +0,0 @@ -// -// Avatar group -// - -// General styles - -.avatar-group { - .avatar { - position: relative; - z-index: 2; - border: 2px solid $card-bg; - - &:hover { - z-index: 3; - } - } - - .avatar + .avatar { - margin-left: -1rem; - - } -} diff --git a/frontend/src/assets/scss/core/avatars/_avatar.scss b/frontend/src/assets/scss/core/avatars/_avatar.scss deleted file mode 100644 index 480fa8d8e..000000000 --- a/frontend/src/assets/scss/core/avatars/_avatar.scss +++ /dev/null @@ -1,42 +0,0 @@ -// -// Avatar -// - -// General styles - -.avatar { - color: $white; - background-color: $gray-500; - display: inline-flex; - align-items: center; - justify-content: center; - font-size: 1rem; - border-radius: 50%; - height: 48px; - width: 48px; - - img { - width: 100%; - border-radius: 50%; - } - - + .avatar-content { - display: inline-block; - margin-left: .75rem; - } -} - - -// Avatar size variations - -.avatar-lg { - width: 58px; - height: 58px; - font-size: $font-size-sm; -} - -.avatar-sm { - width: 36px; - height: 36px; - font-size: $font-size-sm; -} diff --git a/frontend/src/assets/scss/core/buttons/_button-brand.scss b/frontend/src/assets/scss/core/buttons/_button-brand.scss deleted file mode 100644 index 82a3dd7bb..000000000 --- a/frontend/src/assets/scss/core/buttons/_button-brand.scss +++ /dev/null @@ -1,12 +0,0 @@ -// -// Brand buttons -// - - -// Color variations - -@each $color, $value in $brand-colors { - .btn-#{$color} { - @include button-variant($value, $value); - } -} diff --git a/frontend/src/assets/scss/core/buttons/_button-icon.scss b/frontend/src/assets/scss/core/buttons/_button-icon.scss deleted file mode 100644 index 1aceddbf3..000000000 --- a/frontend/src/assets/scss/core/buttons/_button-icon.scss +++ /dev/null @@ -1,92 +0,0 @@ -// -// Icon buttons -// - -.btn-icon { - .btn-inner--icon { - img { - width: 20px; - } - } - - .btn-inner--text:not(:first-child) { - margin-left: 0.75em; - } - - .btn-inner--text:not(:last-child) { - margin-right: 0.75em; - } -} - - -// Button only with icon and NO text - -.btn-icon-only { - width: 2.375rem; - height: 2.375rem; - padding: 0; -} - -a.btn-icon-only { - line-height: 2.5; -} - -.btn-icon-only.btn-sm { - width: 2rem; - height: 2rem; -} - - -// -// Clipboard button -// dedicated element for copying icons -// - -.btn-icon-clipboard { - margin: 0; - padding: 1.5rem; - font-size: $font-size-base; - font-weight: $font-weight-normal; - line-height: 1.25; - color: $gray-800; - background-color: $gray-100; - border-radius: $border-radius; - border: 0; - text-align: left; - font-family: inherit; - display: inline-block; - vertical-align: middle; - text-decoration: none; - -moz-appearance: none; - cursor: pointer; - width: 100%; - margin: .5rem 0; - - &:hover { - background-color: $white; - box-shadow: rgba(0, 0, 0, .1) 0 0 0 1px, rgba(0, 0, 0, .1) 0 4px 16px; - } - - > div { - align-items: center; - display: flex; - } - - i { - box-sizing: content-box; - color: theme-color("primary"); - vertical-align: middle; - font-size: 1.5rem; - } - - span { - display: inline-block; - font-size: 0.875rem; - line-height: 1.5; - margin-left: 16px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - vertical-align: middle; - } -} diff --git a/frontend/src/assets/scss/core/buttons/_button.scss b/frontend/src/assets/scss/core/buttons/_button.scss deleted file mode 100644 index 9c19674b8..000000000 --- a/frontend/src/assets/scss/core/buttons/_button.scss +++ /dev/null @@ -1,91 +0,0 @@ -// -// Icon buttons -// - -// General styles - -.btn { - position: relative; - text-transform: $btn-text-transform; - transition: $transition-base; - letter-spacing: $btn-letter-spacing; - font-size: $input-btn-font-size; - will-change: transform; - - &:hover { - @include box-shadow($btn-hover-box-shadow); - transform: translateY($btn-hover-translate-y); - } - - &:not(:last-child) { - margin-right: .5rem; - } - - - // Icons - - i:not(:first-child), - svg:not(:first-child) { - margin-left: .5rem; - } - - i:not(:last-child), - svg:not(:last-child) { - margin-right: .5rem; - } -} - - -// Remove translateY and margin animation when btn is included in a btn-group or input-group - -.btn-group, -.input-group { - .btn { - margin-right: 0; - transform: translateY(0); - } -} - - -// Size variations - -.btn-sm { - font-size: $input-btn-font-size-sm; -} - -.btn-lg { - font-size: $input-btn-font-size-lg; -} - - -// Some quick fixes (to revise) - -// Fixes -[class*="btn-outline-"] { - border-width: 1px; -} - -.btn-outline-secondary { - color: darken(theme-color("secondary"), 50%); -} - -.btn-inner--icon { - i:not(.fa) { - position: relative; - top: 2px; - } -} - -.btn-link { - font-weight: $btn-font-weight; - box-shadow: none; - - &:hover { - box-shadow: none; - transform: none; - } -} - -.btn-neutral { - color: theme-color("primary"); -} diff --git a/frontend/src/assets/scss/core/cards/_card-animations.scss b/frontend/src/assets/scss/core/cards/_card-animations.scss deleted file mode 100644 index 4da8b7877..000000000 --- a/frontend/src/assets/scss/core/cards/_card-animations.scss +++ /dev/null @@ -1,10 +0,0 @@ -// -// Card with hover animations -// - -.card-lift--hover { - &:hover { - transform: translateY(-20px); - @include transition($transition-base); - } -} diff --git a/frontend/src/assets/scss/core/cards/_card-blockquote.scss b/frontend/src/assets/scss/core/cards/_card-blockquote.scss deleted file mode 100644 index 066bae597..000000000 --- a/frontend/src/assets/scss/core/cards/_card-blockquote.scss +++ /dev/null @@ -1,17 +0,0 @@ -// -// Card with blockquote -// - -.card-blockquote { - padding: 2rem; - position: relative; - - .svg-bg { - display: block; - width: 100%; - height: 95px; - position: absolute; - top: -94px; - left: 0; - } -} diff --git a/frontend/src/assets/scss/core/cards/_card-profile.scss b/frontend/src/assets/scss/core/cards/_card-profile.scss deleted file mode 100644 index 920f41155..000000000 --- a/frontend/src/assets/scss/core/cards/_card-profile.scss +++ /dev/null @@ -1,49 +0,0 @@ -// -// Profile card -// - -.card-profile-image { - position: relative; - - img { - max-width: 180px; - border-radius: $border-radius; - @extend .shadow; - transform: translate(-50%,-30%); - position: absolute; - left: 50%; - transition: $transition-base; - - &:hover { - transform: translate(-50%, -33%); - } - } -} - -.card-profile-stats { - padding: 1rem 0; - - > div { - text-align: center; - margin-right: 1rem; - padding: .875rem; - - &:last-child { - margin-right: 0; - } - - .heading { - font-size: 1.1rem; - font-weight: bold; - display: block; - } - .description { - font-size: .875rem; - color: $gray-500; - } - } -} - -.card-profile-actions { - padding: .875rem; -} diff --git a/frontend/src/assets/scss/core/cards/_card-stats.scss b/frontend/src/assets/scss/core/cards/_card-stats.scss deleted file mode 100644 index 1459304b7..000000000 --- a/frontend/src/assets/scss/core/cards/_card-stats.scss +++ /dev/null @@ -1,16 +0,0 @@ -// -// Card stats -// - -.card-stats { - .card-body { - padding: 1rem 1.5rem; - } - - .card-status-bullet { - position: absolute; - top: 0; - right: 0; - transform: translate(50%, -50%); - } -} diff --git a/frontend/src/assets/scss/core/cards/_card.scss b/frontend/src/assets/scss/core/cards/_card.scss deleted file mode 100644 index a593e4c3c..000000000 --- a/frontend/src/assets/scss/core/cards/_card.scss +++ /dev/null @@ -1,8 +0,0 @@ -// -// Card -// - - -.card-translucent { - background-color: rgba(18, 91, 152, 0.08); -} diff --git a/frontend/src/assets/scss/core/charts/_chart.scss b/frontend/src/assets/scss/core/charts/_chart.scss deleted file mode 100644 index 9ea3ecead..000000000 --- a/frontend/src/assets/scss/core/charts/_chart.scss +++ /dev/null @@ -1,69 +0,0 @@ -// -// Chart -// - -.chart { - position: relative; - height: $chart-height; -} - - -// Size variations - -.chart-sm { - height: $chart-height-sm; -} - - -// Legend - -.chart-legend { - display: flex; - justify-content: center; - margin-top: $chart-legend-margin-top; - font-size: $chart-legend-font-size; - text-align: center; - color: $chart-legend-color; -} - -.chart-legend-item { - display: inline-flex; - align-items: center; - - + .chart-legend-item { - margin-left: 1rem; - } -} - -.chart-legend-indicator { - display: inline-block; - width: 0.5rem; - height: 0.5rem; - margin-right: 0.375rem; - border-radius: 50%; -} - - -// Tooltip - -#chart-tooltip { - z-index: 0; - - .arrow { - top: 100%; - left: 50%; - transform: translateX(-50%) translateX(-.5rem); - } -} - - -// Chart info overlay - -.chart-info-overlay { - position: absolute; - top: 0; - left: 5%; - max-width: 350px; - padding: 20px; - z-index: 1; -} diff --git a/frontend/src/assets/scss/core/close/_close.scss b/frontend/src/assets/scss/core/close/_close.scss deleted file mode 100644 index 2c0672ae1..000000000 --- a/frontend/src/assets/scss/core/close/_close.scss +++ /dev/null @@ -1,34 +0,0 @@ -// -// Close -// - -.close { - @if $enable-transitions { - transition: $transition-base; - } - - &>span:not(.sr-only) { - background-color: $close-bg; - color: $close-color; - line-height: 17px; - height: 1.25rem; - width: 1.25rem; - border-radius: 50%; - font-size: 1.25rem; - display: block; - @if $enable-transitions { - transition: $transition-base; - } - } - - &:hover, - &:focus { - background-color: $close-hover-bg; - color: $close-hover-color; - outline: none; - - span:not(.sr-only) { - background-color: $close-hover-bg; - } - } -} diff --git a/frontend/src/assets/scss/core/custom-forms/_custom-checkbox.scss b/frontend/src/assets/scss/core/custom-forms/_custom-checkbox.scss deleted file mode 100644 index e808b5bb9..000000000 --- a/frontend/src/assets/scss/core/custom-forms/_custom-checkbox.scss +++ /dev/null @@ -1,37 +0,0 @@ -// -// Custom checkbox -// - -.custom-checkbox { - .custom-control-input ~ .custom-control-label { - cursor: pointer; - font-size: $font-size-sm; - } - - .custom-control-input { - &:checked { - ~ .custom-control-label { - &::before { - border-color: $custom-control-indicator-checked-border-color; - } - &::after { - background-image: $custom-checkbox-indicator-icon-checked; - } - } - } - - &:disabled { - ~ .custom-control-label { - &::before { - border-color: $custom-control-indicator-disabled-bg; - } - } - - &:checked { - &::before { - border-color: $custom-control-indicator-checked-disabled-bg; - } - } - } - } -} diff --git a/frontend/src/assets/scss/core/custom-forms/_custom-control.scss b/frontend/src/assets/scss/core/custom-forms/_custom-control.scss deleted file mode 100644 index 28610029d..000000000 --- a/frontend/src/assets/scss/core/custom-forms/_custom-control.scss +++ /dev/null @@ -1,51 +0,0 @@ -// -// Custom control -// additional styles for custom checkboxes, radios and other -// - -.custom-control-label { - // Background-color and (when enabled) gradient - &::before { - border: $custom-control-indicator-border-width solid $custom-control-indicator-border-color; - @if $enable-transitions { - transition: $input-transition; - } - } - - span { - position: relative; - top: 2px; - } -} - -.custom-control-label { - margin-bottom: 0; -} - - -// Alternative style - -.custom-control-alternative { - .custom-control-label { - // Background-color and (when enabled) gradient - &::before { - border: 0; - box-shadow: $input-alternative-box-shadow; - } - } - - .custom-control-input { - &:checked { - ~ .custom-control-label { - &::before { - box-shadow: $input-focus-alternative-box-shadow; - } - } - } - - &:active~.custom-control-label::before, - &:focus~.custom-control-label::before { - box-shadow: $input-alternative-box-shadow; - } - } -} diff --git a/frontend/src/assets/scss/core/custom-forms/_custom-form.scss b/frontend/src/assets/scss/core/custom-forms/_custom-form.scss deleted file mode 100644 index e808b5bb9..000000000 --- a/frontend/src/assets/scss/core/custom-forms/_custom-form.scss +++ /dev/null @@ -1,37 +0,0 @@ -// -// Custom checkbox -// - -.custom-checkbox { - .custom-control-input ~ .custom-control-label { - cursor: pointer; - font-size: $font-size-sm; - } - - .custom-control-input { - &:checked { - ~ .custom-control-label { - &::before { - border-color: $custom-control-indicator-checked-border-color; - } - &::after { - background-image: $custom-checkbox-indicator-icon-checked; - } - } - } - - &:disabled { - ~ .custom-control-label { - &::before { - border-color: $custom-control-indicator-disabled-bg; - } - } - - &:checked { - &::before { - border-color: $custom-control-indicator-checked-disabled-bg; - } - } - } - } -} diff --git a/frontend/src/assets/scss/core/custom-forms/_custom-radio.scss b/frontend/src/assets/scss/core/custom-forms/_custom-radio.scss deleted file mode 100644 index 3ce26f81a..000000000 --- a/frontend/src/assets/scss/core/custom-forms/_custom-radio.scss +++ /dev/null @@ -1,37 +0,0 @@ -// -// Custom radio -// - -.custom-radio { - .custom-control-input ~ .custom-control-label { - cursor: pointer; - font-size: $font-size-sm; - } - - .custom-control-input { - &:checked { - ~ .custom-control-label { - &::before { - border-color: $custom-control-indicator-checked-border-color; - } - &::after { - background-image: $custom-radio-indicator-icon-checked; - } - } - } - - &:disabled { - ~ .custom-control-label { - &::before { - border-color: $custom-control-indicator-disabled-bg; - } - } - - &:checked { - &::before { - border-color: $custom-control-indicator-checked-disabled-bg; - } - } - } - } -} diff --git a/frontend/src/assets/scss/core/custom-forms/_custom-toggle.scss b/frontend/src/assets/scss/core/custom-forms/_custom-toggle.scss deleted file mode 100644 index 88da14583..000000000 --- a/frontend/src/assets/scss/core/custom-forms/_custom-toggle.scss +++ /dev/null @@ -1,66 +0,0 @@ -// -// Custom toggle -// - -.custom-toggle { - position: relative; - display: inline-block; - width: $custom-toggle-width; - height: 1.5rem; - - input { - display: none; - - &:checked { - + .custom-toggle-slider { - border: $custom-control-indicator-border-width solid $custom-control-indicator-checked-border-color; - - &:before { - background: $custom-toggle-checked-bg; - transform: translateX(1.625rem); - } - } - } - - &:disabled { - + .custom-toggle-slider { - border: $custom-control-indicator-border-width solid $custom-control-indicator-disabled-bg; - } - - &:checked { - + .custom-toggle-slider { - border: $custom-control-indicator-border-width solid $custom-control-indicator-disabled-bg; - - &:before { - background-color: lighten($custom-control-indicator-checked-bg, 10%); - } - } - } - } - } -} - -.custom-toggle-slider { - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: $custom-control-indicator-border-width solid $input-border-color; - border-radius: 34px !important; - background-color: transparent; - - - &:before { - position: absolute; - content: ""; - height: 18px; - width: 18px; - left: 2px; - bottom: 2px; - border-radius: 50% !important; - background-color: $custom-toggle-slider-bg; - transition: $input-transition; - } -} diff --git a/frontend/src/assets/scss/core/dropdowns/_dropdown.scss b/frontend/src/assets/scss/core/dropdowns/_dropdown.scss deleted file mode 100644 index 6d3106e9f..000000000 --- a/frontend/src/assets/scss/core/dropdowns/_dropdown.scss +++ /dev/null @@ -1,79 +0,0 @@ -// -// Dropdown -// - -// General styles - -.dropdown, -.dropup, -.dropright, -.dropleft { - display: inline-block; -} - -.dropdown-menu { - min-width: 12rem; - - .dropdown-item { - padding: .5rem 1rem; - font-size: $font-size-sm; - > i, - > svg { - margin-right: 1rem; - font-size: 1rem; - vertical-align: -17%; - } - } -} - -.dropdown-header { - padding-left: 1rem; - padding-right: 1rem; - color: $gray-100; - font-size: .625rem; - text-transform: uppercase; - font-weight: 700; -} - - -// Media components inside dropdown link - -.dropdown-menu { - a.media { - - > div { - &:first-child { - line-height: 1; - } - } - - p { - color: $gray-600; - } - - &:hover { - .heading, - p { - color: theme-color("default") !important; - } - } - } -} - - -// Size variations - -.dropdown-menu-sm { - min-width: 100px; - border: $border-radius-lg; -} - -.dropdown-menu-lg { - min-width: 260px; - border-radius: $border-radius-lg; -} - -.dropdown-menu-xl { - min-width: 450px; - border-radius: $border-radius-lg; -} diff --git a/frontend/src/assets/scss/core/footers/_footer.scss b/frontend/src/assets/scss/core/footers/_footer.scss deleted file mode 100644 index a34180e9b..000000000 --- a/frontend/src/assets/scss/core/footers/_footer.scss +++ /dev/null @@ -1,98 +0,0 @@ -// -// Footer -// - - -// General styles - -.footer { - background: $footer-bg; - padding: $footer-padding-y $footer-padding-x; - - .col-footer { - .heading { - color: $footer-heading-color; - letter-spacing: 0; - font-size: $footer-heading-font-size; - text-transform: uppercase; - font-weight: $font-weight-bold; - margin-bottom: 1rem; - } - } - - .nav .nav-item .nav-link, - .footer-link { - color: $footer-link-color !important; - - &:hover { - color: $footer-link-hover-color !important; - } - } - - .list-unstyled li a { - display: inline-block; - padding: .125rem 0; - color: $footer-link-color; - font-size: $footer-link-font-size; - - &:hover { - color: $footer-link-hover-color; - } - } - - .copyright { - font-size: $font-size-sm; - } -} - - -// Dark footer - -.footer-dark { - .col-footer .heading { - color: $white; - } -} - - -// Footer nav used for copyright and some links, but not limited to this - -.nav-footer { - .nav-link { - font-size: $font-size-sm; - } - - .nav-item:last-child { - .nav-link { - padding-right: 0; - } - } -} - - -// Footer with cards over - -.footer.has-cards { - overflow: hidden; - padding-top: 500px; - margin-top: -420px; - position: relative; - background: transparent; - pointer-events: none; - - &:before { - content: ""; - position: absolute; - left: 0; - right: 0; - top: 600px; - height: 2000px; - background: theme-color("secondary"); - transform: skew(0,-8deg); - } - - .container { - pointer-events: auto; - position: relative; - } -} diff --git a/frontend/src/assets/scss/core/forms/_form-validation.scss b/frontend/src/assets/scss/core/forms/_form-validation.scss deleted file mode 100644 index bb97e39fa..000000000 --- a/frontend/src/assets/scss/core/forms/_form-validation.scss +++ /dev/null @@ -1,71 +0,0 @@ -// -// Form validation -// - -// Validation - -.has-success, -.has-danger { - position: relative; - - &:after, { - width: 19px; - height: 19px; - line-height: 19px; - text-align: center; - font-family: 'NucleoIcons'; - display: inline-block; - position: absolute; - right: 15px; - top: 2px; - transform: translateY(50%); - border-radius: 50%; - font-size: 9px; - opacity: 1; - } -} - -.has-success { - &:after { - content: "\ea26"; - color: daken($form-feedback-valid-color, 18%); - background-color: $form-feedback-valid-bg; - } - - .form-control { - background-color: $input-focus-bg; - - &:focus { - border-color: $input-focus-border-color; - } - - - // Placeholder - - &::placeholder { - color: $form-feedback-valid-color; - } - } -} - -.has-danger { - &:after { - content: "\ea53"; - color: daken($form-feedback-invalid-color, 18%); - background-color: $form-feedback-invalid-bg; - } - - .form-control { - background-color: $input-focus-bg; - - &:focus { - border-color: $input-focus-border-color; - } - - // Placeholder - - &::placeholder { - color: $form-feedback-invalid-color; - } - } -} diff --git a/frontend/src/assets/scss/core/forms/_form.scss b/frontend/src/assets/scss/core/forms/_form.scss deleted file mode 100644 index 8afeb8787..000000000 --- a/frontend/src/assets/scss/core/forms/_form.scss +++ /dev/null @@ -1,78 +0,0 @@ -// -// Forms -// - - -// Labels - -.form-control-label { - color: $gray-700; - font-size: $font-size-sm; - font-weight: $font-weight-bold; -} - - -// Text inputs - -.form-control { - font-size: $input-btn-font-size; - - &:focus { - &::placeholder { - color: $input-focus-placeholder-color; - } - } -} - - -// Textarea - -textarea[resize="none"] { - resize: none!important; -} - -textarea[resize="both"] { - resize: both!important; -} - -textarea[resize="vertical"] { - resize: vertical!important; -} - -textarea[resize="horizontal"] { - resize: horizontal!important; -} - - -// Form input variations - -// Muted input - -.form-control-muted { - background-color: $input-muted-bg; - border-color: $input-muted-bg; - box-shadow: none; - - &:focus { - background-color: $input-focus-muted-bg; - } -} - - -// Alternative input - -.form-control-alternative { - box-shadow: $input-alternative-box-shadow; - border: 0; - transition: box-shadow .15s ease; - - &:focus { - box-shadow: $input-focus-alternative-box-shadow; - } -} - -// Size variations: Fixes to the bootstrap defaults - -.form-control-lg { - font-size: $font-size-base; -} diff --git a/frontend/src/assets/scss/core/forms/_input-group.scss b/frontend/src/assets/scss/core/forms/_input-group.scss deleted file mode 100644 index 1ab48cffe..000000000 --- a/frontend/src/assets/scss/core/forms/_input-group.scss +++ /dev/null @@ -1,70 +0,0 @@ -// -// Input group -// - -.input-group { - box-shadow: $input-box-shadow; - border-radius: $input-border-radius; - transition: $transition-base; - - .form-control { - box-shadow: none; - - &:not(:first-child) { - border-left: 0; - padding-left: 0; - } - &:not(:last-child) { - border-right: 0; - padding-right: 0; - } - &:focus { - box-shadow: none; - } - } -} - -.input-group-text { - transition: $input-transition; -} - - -// Alternative input groups related to .form-control-alternative - - -.input-group-alternative { - box-shadow: $input-alternative-box-shadow; - border: 0; - transition: box-shadow .15s ease; - - .form-control, - .input-group-text { - border: 0; - box-shadow: none; - } -} - -.focused { - .input-group-alternative { - box-shadow: $input-focus-alternative-box-shadow !important; - } -} - - -// .focus class is applied dinamycally from theme.js - -.focused { - .input-group { - box-shadow: $input-focus-box-shadow; - } - - .input-group-text { - color: $input-group-addon-focus-color; - background-color: $input-group-addon-focus-bg; - border-color: $input-group-addon-focus-border-color; - } - - .form-control { - border-color: $input-group-addon-focus-border-color; - } -} diff --git a/frontend/src/assets/scss/core/headers/_header.scss b/frontend/src/assets/scss/core/headers/_header.scss deleted file mode 100644 index 3b0e9d2f5..000000000 --- a/frontend/src/assets/scss/core/headers/_header.scss +++ /dev/null @@ -1,7 +0,0 @@ -// -// Header -// - -.header { - position: relative; -} diff --git a/frontend/src/assets/scss/core/icons/_icon-shape.scss b/frontend/src/assets/scss/core/icons/_icon-shape.scss deleted file mode 100644 index 1747871ff..000000000 --- a/frontend/src/assets/scss/core/icons/_icon-shape.scss +++ /dev/null @@ -1,42 +0,0 @@ -// -// Icon shape -// - - -.icon-shape { - padding: 12px; - text-align: center; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 50%; - - - i, svg { - font-size: 1.25rem; - } - - &.icon-lg { - i, svg { - font-size: 1.625rem; - } - } - - &.icon-sm { - i, svg { - font-size: .875rem; - } - } - - svg { - width: 30px; - height: 30px; - } - -} - -@each $color, $value in $theme-colors { - .icon-shape-#{$color} { - @include icon-shape-variant(theme-color($color)); - } -} diff --git a/frontend/src/assets/scss/core/icons/_icon.scss b/frontend/src/assets/scss/core/icons/_icon.scss deleted file mode 100644 index f7ed0de3c..000000000 --- a/frontend/src/assets/scss/core/icons/_icon.scss +++ /dev/null @@ -1,65 +0,0 @@ -// -// Icon -// - -.icon { - width: $icon-size; - height: $icon-size; - - i, svg { - font-size: $icon-size - .75; - } - - + .icon-text { - padding-left: 1rem; - width: calc(100% - #{$icon-size} - 1); - } -} - - -// Extra large icons - -.icon-xl { - width: $icon-size-xl; - height: $icon-size-xl; - - i, svg { - font-size: $icon-size-xl - .75; - } - - + .icon-text { - width: calc(100% - #{$icon-size-xl} - 1); - } -} - - -// Large icons - -.icon-lg { - width: $icon-size-lg; - height: $icon-size-lg; - - i, svg { - font-size: $icon-size-lg - .75; - } - - + .icon-text { - width: calc(100% - #{$icon-size-lg} - 1); - } -} - - -// Small icon - -.icon-sm { - width: $icon-size-sm; - height: $icon-size-sm; - - i, svg { - font-size: $icon-size-sm - .75; - } - - + .icon-text { - width: calc(100% - #{$icon-size-sm} - 1); - } -} diff --git a/frontend/src/assets/scss/core/list-groups/_list-group.scss b/frontend/src/assets/scss/core/list-groups/_list-group.scss deleted file mode 100644 index 0aa5cde63..000000000 --- a/frontend/src/assets/scss/core/list-groups/_list-group.scss +++ /dev/null @@ -1,46 +0,0 @@ -// -// List group -// - - -// Space list items - -.list-group-space { - .list-group-item { - margin-bottom: 1.5rem; - @include border-radius($list-group-border-radius); - } -} - - -// Extended list group components - -.list-group-img { - width: 3rem; - height: 3rem; - border-radius: 50%; - vertical-align: top; - margin: -.1rem 1.2rem 0 -.2rem; -} - -.list-group-content { - flex: 1; - min-width: 0; - - > p { - color: $gray-500; - line-height: 1.5; - margin: .2rem 0 0; - } -} - -.list-group-heading { - font-size: $font-size-base; - color: $gray-800; - - > small { - float: right; - color: $gray-500; - font-weight: 500; - } -} diff --git a/frontend/src/assets/scss/core/maps/_map.scss b/frontend/src/assets/scss/core/maps/_map.scss deleted file mode 100644 index 6c9cda7af..000000000 --- a/frontend/src/assets/scss/core/maps/_map.scss +++ /dev/null @@ -1,10 +0,0 @@ -// -// Map -// - -.map-canvas { - position: relative; - width: 100%; - height: $map-height; - border-radius: $border-radius; -} diff --git a/frontend/src/assets/scss/core/masks/_mask.scss b/frontend/src/assets/scss/core/masks/_mask.scss deleted file mode 100644 index 9df8ba0a4..000000000 --- a/frontend/src/assets/scss/core/masks/_mask.scss +++ /dev/null @@ -1,12 +0,0 @@ -// -// Mask -// - -.mask { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - @include transition($transition-base); -} diff --git a/frontend/src/assets/scss/core/mixins/_alert.scss b/frontend/src/assets/scss/core/mixins/_alert.scss deleted file mode 100644 index 1dbe85b61..000000000 --- a/frontend/src/assets/scss/core/mixins/_alert.scss +++ /dev/null @@ -1,13 +0,0 @@ -@mixin alert-variant($background, $border, $color) { - color: color-yiq($background); - @include gradient-bg($background); - border-color: $border; - - hr { - border-top-color: darken($border, 5%); - } - - .alert-link { - color: darken($color, 10%); - } -} \ No newline at end of file diff --git a/frontend/src/assets/scss/core/mixins/_background-variant.scss b/frontend/src/assets/scss/core/mixins/_background-variant.scss deleted file mode 100644 index 1b87864f1..000000000 --- a/frontend/src/assets/scss/core/mixins/_background-variant.scss +++ /dev/null @@ -1,30 +0,0 @@ -// Contextual backgrounds -@mixin bg-variant($parent, $color, $ignore-warning: true) { - #{$parent} { - background-color: $color !important; - } - a#{$parent}, - button#{$parent} { - @include hover-focus { - background-color: darken($color, 10%) !important; - } - } -} - -@mixin bg-gradient-variant($parent, $color, $ignore-warning: true) { - #{$parent} { - background: linear-gradient(87deg, $color 0, adjust-hue($color, 25%) 100%) !important; - } -} - -@mixin bg-translucent-variant($parent, $color, $ignore-warning: true) { - #{$parent} { - background-color: darken(rgba($color, $translucent-color-opacity), 7%) !important; - } - a#{$parent}, - button#{$parent} { - @include hover-focus { - background-color: darken(rgba($color, $translucent-color-opacity), 12%) !important; - } - } -} diff --git a/frontend/src/assets/scss/core/mixins/_badge.scss b/frontend/src/assets/scss/core/mixins/_badge.scss deleted file mode 100644 index f19044f91..000000000 --- a/frontend/src/assets/scss/core/mixins/_badge.scss +++ /dev/null @@ -1,12 +0,0 @@ -@mixin badge-variant($bg) { - color: saturate(darken($bg, 10%), 10); - background-color: transparentize(lighten($bg, 25%), .5); - - &[href] { - @include hover-focus { - color: color-yiq($bg); - text-decoration: none; - background-color: darken($bg, 10%); - } - } -} diff --git a/frontend/src/assets/scss/core/mixins/_buttons.scss b/frontend/src/assets/scss/core/mixins/_buttons.scss deleted file mode 100644 index 5cedd20ef..000000000 --- a/frontend/src/assets/scss/core/mixins/_buttons.scss +++ /dev/null @@ -1,105 +0,0 @@ -@mixin button-variant($background, $border, $hover-background: darken($background, 0%), $hover-border: darken($border, 0%), $active-background: darken($background, 10%), $active-border: darken($border, 0%)) { - color: color-yiq($background); - @include gradient-bg($background); - border-color: $border; - @include box-shadow($btn-box-shadow); - - @include hover { - color: color-yiq($hover-background); - @include gradient-bg($hover-background); - border-color: $hover-border; - } - - &:focus, - &.focus { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5); - } - @else { - box-shadow: 0 0 0 $btn-focus-width rgba($border, .5); - } - } // Disabled comes first so active can properly restyle - &.disabled, - &:disabled { - color: color-yiq($background); - background-color: $background; - border-color: $border; - } - - &:not(:disabled):not(.disabled):active, - &:not(:disabled):not(.disabled).active, - .show>&.dropdown-toggle { - color: color-yiq($active-background); - background-color: $active-background; - @if $enable-gradients { - background-image: none; // Remove the gradient for the pressed/active state - } - border-color: $active-border; - - &:focus { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($border, .5); - } - @else { - box-shadow: 0 0 0 $btn-focus-width rgba($border, .5); - } - } - } -} - -@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) { - color: $color; - background-color: transparent; - background-image: none; - border-color: $color; - - &:hover { - color: $color-hover; - background-color: $active-background; - border-color: $active-border; - } - - &:focus, - &.focus { - box-shadow: 0 0 0 $btn-focus-width rgba($color, .5); - } - - &.disabled, - &:disabled { - color: $color; - background-color: transparent; - } - - &:not(:disabled):not(.disabled):active, - &:not(:disabled):not(.disabled).active, - .show>&.dropdown-toggle { - color: color-yiq($active-background); - background-color: $active-background; - border-color: $active-border; - - &:focus { - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows and $btn-active-box-shadow !=none { - box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5); - } - @else { - box-shadow: 0 0 0 $btn-focus-width rgba($color, .5); - } - } - } -} - -// Button sizes -@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { - padding: $padding-y $padding-x; - font-size: $font-size; - line-height: $line-height; // Manually declare to provide an override to the browser default - @if $enable-rounded { - border-radius: $border-radius; - } - @else { - border-radius: 0; - } -} \ No newline at end of file diff --git a/frontend/src/assets/scss/core/mixins/_forms.scss b/frontend/src/assets/scss/core/mixins/_forms.scss deleted file mode 100644 index 0c51a3be6..000000000 --- a/frontend/src/assets/scss/core/mixins/_forms.scss +++ /dev/null @@ -1,127 +0,0 @@ -@mixin form-control-focus($ignore-warning: true) { - &:focus { - color: $input-focus-color; - background-color: $input-focus-bg; - border-color: $input-focus-border-color; - outline: 0; - // Avoid using mixin so we can pass custom focus shadow properly - @if $enable-shadows { - box-shadow: $input-box-shadow, $input-focus-box-shadow; - } @else { - box-shadow: $input-focus-box-shadow; - } - } -} - - -@mixin form-validation-state($state, $color, $icon) { - .#{$state}-feedback { - display: none; - width: 100%; - margin-top: $form-feedback-margin-top; - font-size: $form-feedback-font-size; - color: $color; - } - - .#{$state}-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; // Contain to parent when possible - padding: .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1; - color: #fff; - background-color: rgba($color, .8); - border-radius: .2rem; - } - - .form-control, - .custom-select { - .was-validated &:#{$state}, - &.is-#{$state} { - border-color: $color; - - &:focus { - border-color: $color; - //box-shadow: 0 1px $input-focus-width 0 rgba($color, .75); - } - - ~ .#{$state}-feedback, - ~ .#{$state}-tooltip { - display: block; - } - } - } - - .form-check-input { - .was-validated &:#{$state}, - &.is-#{$state} { - ~ .form-check-label { - color: $color; - } - - ~ .#{$state}-feedback, - ~ .#{$state}-tooltip { - display: block; - } - } - } - - .custom-control-input { - .was-validated &:#{$state}, - &.is-#{$state} { - ~ .custom-control-label { - color: $color; - - &::before { - background-color: lighten($color, 25%); - border-color: lighten($color, 25%); - } - } - - ~ .#{$state}-feedback, - ~ .#{$state}-tooltip { - display: block; - } - - &:checked { - ~ .custom-control-label::before { - @include gradient-bg(lighten($color, 10%)); - border-color: lighten($color, 25%); - } - } - - &:focus { - ~ .custom-control-label::before { - box-shadow: 0 0 0 1px $body-bg, 0 0 0 $input-focus-width rgba($color, .25); - } - } - } - } - - // custom file - .custom-file-input { - .was-validated &:#{$state}, - &.is-#{$state} { - ~ .custom-file-label { - border-color: $color; - - &::before { border-color: inherit; } - } - - ~ .#{$state}-feedback, - ~ .#{$state}-tooltip { - display: block; - } - - &:focus { - ~ .custom-file-label { - box-shadow: 0 0 0 $input-focus-width rgba($color, .25); - } - } - } - } -} diff --git a/frontend/src/assets/scss/core/mixins/_icon.scss b/frontend/src/assets/scss/core/mixins/_icon.scss deleted file mode 100644 index 88199859f..000000000 --- a/frontend/src/assets/scss/core/mixins/_icon.scss +++ /dev/null @@ -1,4 +0,0 @@ -@mixin icon-shape-variant($color) { - color: saturate(darken($color, 10%), 10); - background-color: transparentize(lighten($color, 10%), .5); -} \ No newline at end of file diff --git a/frontend/src/assets/scss/core/mixins/_modals.scss b/frontend/src/assets/scss/core/mixins/_modals.scss deleted file mode 100644 index f91249028..000000000 --- a/frontend/src/assets/scss/core/mixins/_modals.scss +++ /dev/null @@ -1,23 +0,0 @@ -@mixin modal-variant($background) { - .modal-title { - color: color-yiq($background); - } - .modal-header, - .modal-footer { - border-color: rgba(color-yiq($background), .075); - } - .modal-content { - background-color: $background; - color: color-yiq($background); - - .heading { - color: color-yiq($background); - } - } - - .close { - &>span:not(.sr-only) { - color: $white; - } - } -} \ No newline at end of file diff --git a/frontend/src/assets/scss/core/mixins/_popover.scss b/frontend/src/assets/scss/core/mixins/_popover.scss deleted file mode 100644 index e535b5379..000000000 --- a/frontend/src/assets/scss/core/mixins/_popover.scss +++ /dev/null @@ -1,36 +0,0 @@ -@mixin popover-variant($background) { - - background-color: $background; - - .popover-header { - background-color: $background; - color: color-yiq($background); - } - - .popover-body { - color: color-yiq($background); - } - .popover-header{ - border-color: rgba(color-yiq($background), .2); - } - &.bs-popover-top { - .arrow::after { - border-top-color: $background; - } - } - &.bs-popover-right { - .arrow::after { - border-right-color: $background; - } - } - &.bs-popover-bottom { - .arrow::after { - border-bottom-color: $background; - } - } - &.bs-popover-left { - .arrow::after { - border-left-color: $background; - } - } -} \ No newline at end of file diff --git a/frontend/src/assets/scss/core/modals/_modal.scss b/frontend/src/assets/scss/core/modals/_modal.scss deleted file mode 100644 index ed31d511e..000000000 --- a/frontend/src/assets/scss/core/modals/_modal.scss +++ /dev/null @@ -1,25 +0,0 @@ -// -// Modal -// - - -// Fluid modal - -.modal-fluid { - .modal-dialog { - margin-top: 0; - margin-bottom: 0; - } - .modal-content { - border-radius: 0; - } -} - - -// Background color variations - -@each $color, $value in $theme-colors { - .modal-#{$color} { - @include modal-variant($value); - } -} diff --git a/frontend/src/assets/scss/core/navbars/_navbar-collapse.scss b/frontend/src/assets/scss/core/navbars/_navbar-collapse.scss deleted file mode 100644 index ffd998af3..000000000 --- a/frontend/src/assets/scss/core/navbars/_navbar-collapse.scss +++ /dev/null @@ -1,125 +0,0 @@ -// -// Navabar collapse -// - -// Collapse - -.navbar-collapse-header { - display: none; -} - -@include media-breakpoint-down(sm) { - .navbar-nav { - .nav-link { - padding: .625rem 0; - color: theme-color("default") !important; - } - - .dropdown-menu { - box-shadow: none; - min-width: auto; - - .media { - svg { - width: 30px; - } - } - } - } - - .navbar-collapse { - width: calc(100% - 1.4rem); - position: absolute; - top: 0; - left: 0; - right: 0; - z-index: 1050; - margin: .7rem; - overflow-y: auto; - height: auto !important; - opacity: 0; - - .navbar-toggler { - width: 20px; - height: 20px; - position: relative; - cursor: pointer; - display: inline-block; - padding: 0; - - span { - display: block; - position: absolute; - width: 100%; - height: 2px; - border-radius: 2px; - opacity: 1; - background: #283448; - } - - :nth-child(1) { - transform: rotate(135deg); - } - - :nth-child(2) { - transform: rotate(-135deg); - } - } - - .navbar-collapse-header { - display: block; - padding-bottom: 1rem; - margin-bottom: 1rem; - border-bottom: 1px solid rgba(0, 0, 0, .1); - } - - .collapse-brand { - img { - height: 36px; - } - } - - .collapse-close { - text-align: right; - } - } - - .navbar-collapse.collapsing, - .navbar-collapse.show { - padding: 1.5rem; - border-radius: $border-radius; - background: #FFF; - box-shadow: 0 50px 100px rgba(50,50,93,.1),0 15px 35px rgba(50,50,93,.15),0 5px 15px rgba(0,0,0,.1); - animation: show-navbar-collapse .2s ease forwards; - } - - .navbar-collapse.collapsing-out { - animation: hide-navbar-collapse .2s ease forwards; - } -} - -@keyframes show-navbar-collapse { - 0% { - opacity: 0; - transform: scale(.95); - transform-origin: 100% 0; - } - - 100% { - opacity: 1; - transform: scale(1); - } -} - -@keyframes hide-navbar-collapse { - from { - opacity: 1; - transform: scale(1); - transform-origin: 100% 0; - } - - to { - opacity: 0; - transform: scale(.95); - } -} diff --git a/frontend/src/assets/scss/core/navbars/_navbar-dropdown.scss b/frontend/src/assets/scss/core/navbars/_navbar-dropdown.scss deleted file mode 100644 index 3db781c86..000000000 --- a/frontend/src/assets/scss/core/navbars/_navbar-dropdown.scss +++ /dev/null @@ -1,101 +0,0 @@ -// Dropdown menu - -@include media-breakpoint-up(md) { - .navbar { - .dropdown-menu { - opacity: 0; - pointer-events: none; - margin: 0; - } - - .dropdown-menu-arrow { - &:before { - background: $dropdown-bg; - box-shadow: none; - content: ''; - display: block; - height: 12px; - width: 12px; - left: 20px; - position: absolute; - bottom: 100%; - transform: rotate(-45deg) translateY(12px); - z-index: -5; - border-radius: 2px; - } - } - - .dropdown-menu-right { - &:before { - right: 20px; - left: auto; - } - } - - &:not(.navbar-nav-hover) { - .dropdown-menu { - &.show { - opacity: 1; - pointer-events: auto; - animation: show-navbar-dropdown .25s ease forwards; - } - - &.close { - display: block; - animation: hide-navbar-dropdown .15s ease backwards; - } - } - } - - &.navbar-nav-hover { - .dropdown-menu { - opacity: 0; - display: block; - pointer-events: none; - transform: translate(0, 10px) perspective(200px) rotateX(-2deg); - transition: visibility 0.25s, opacity 0.25s, transform 0.25s; - } - - .nav-item.dropdown:hover > .dropdown-menu { - display: block; - opacity: 1; - pointer-events: auto; - visibility: visible; - transform: translate(0, 0); - animation: none; - } - } - - .dropdown-menu-inner { - position: relative; - padding: 1rem; - } - - - // Keyframes - - @keyframes show-navbar-dropdown { - 0% { - opacity: 0; - transform: translate(0, 10px) perspective(200px) rotateX(-2deg); - transition: visibility 0.25s, opacity 0.25s, transform 0.25s; - } - - 100% { - transform: translate(0, 0); - opacity: 1; - } - } - - @keyframes hide-navbar-dropdown { - from { - opacity: 1; - } - - to { - opacity: 0; - transform: translate(0, 10px); - } - } - } -} diff --git a/frontend/src/assets/scss/core/navbars/_navbar-search.scss b/frontend/src/assets/scss/core/navbars/_navbar-search.scss deleted file mode 100644 index d95a1410a..000000000 --- a/frontend/src/assets/scss/core/navbars/_navbar-search.scss +++ /dev/null @@ -1,69 +0,0 @@ -// -// Navbar search -// - -.navbar-search { - .input-group { - border-radius: $navbar-search-border-radius; - border: $navbar-search-border-width solid; - background-color: transparent; - - .input-group-text { - background-color: transparent; - padding-left: 1rem; - } - } - - .form-control { - width: $navbar-search-width; - background-color: transparent; - } -} - -.navbar-search-dark { - .input-group { - border-color: $navbar-search-dark-border-color; - } - - .input-group-text { - color: $navbar-search-dark-color; - } - - .form-control { - color: $navbar-search-dark-focus-color; - - &::placeholder { - color: $navbar-search-dark-color; - } - } - - .focused { - .input-group { - border-color: $navbar-search-dark-focus-border-color; - } - } -} - -.navbar-search-light { - .input-group { - border-color: $navbar-search-light-border-color; - } - - .input-group-text { - color: $navbar-search-light-color; - } - - .form-control { - color: $navbar-search-light-focus-color; - - &::placeholder { - color: $navbar-search-light-color; - } - } - - .focused { - .input-group { - border-color: $navbar-search-light-focus-border-color; - } - } -} diff --git a/frontend/src/assets/scss/core/navbars/_navbar-vertical.scss b/frontend/src/assets/scss/core/navbars/_navbar-vertical.scss deleted file mode 100644 index 48e1fd7be..000000000 --- a/frontend/src/assets/scss/core/navbars/_navbar-vertical.scss +++ /dev/null @@ -1,286 +0,0 @@ -// -// Vertical navbar -// - - -// Vertical -// -// Creates a vertically aligned version of the navbar -.navbar-vertical { - box-shadow: $navbar-vertical-box-shadow; - - .navbar { - border-width: 0 0 1px 0; - border-style: solid; - } - - - // Navbar light - - .navbar-light { - background-color: $navbar-light-bg; - border-color: $navbar-light-border-color; - } - - - // Navbar brand - - .navbar-brand { - margin-right: 0; - } - - .navbar-brand-img, - .navbar-brand > img { - max-width: 100%; - max-height: 2rem; - } - - - // Navbar collapse - - @include media-breakpoint-up(md) { - .navbar-collapse { - margin-left: -$navbar-padding-x; - margin-right: -$navbar-padding-x; - padding-left: $navbar-padding-x; - padding-right: $navbar-padding-x; - - &:before { - content: ''; - display: block; - margin: $navbar-padding-y (-$navbar-padding-x); - } - } - } - - - - // Navbar navigaton - - .navbar-nav { - margin-left: -$navbar-padding-x; - margin-right: -$navbar-padding-x; - - - // Navbar link - - .nav-link { - padding-left: $navbar-padding-x; - padding-right: $navbar-padding-x; - font-size: $navbar-nav-link-font-size; - - &.active { - position: relative; - - &:before { - content: ''; - position: absolute; - left: 0; - top: $nav-link-padding-y; - bottom: $nav-link-padding-y; - border-left: 2px solid $primary; - } - } - - - // Icon - - > i { - min-width: $navbar-icon-min-width; - font-size: .9375rem; - line-height: ($font-size-base * $line-height-base); - } - - - // Dropdown - - .dropdown-menu { - border: none; - - .dropdown-menu { - margin-left: $dropdown-item-padding-x / 2; - } - } - } - } - - - // Navbar navigation - .navbar-nav .nav-link { - display: flex; - align-items: center; - } - - .navbar-nav .nav-link[data-toggle="collapse"] { - &:after { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - font-family: 'Font Awesome 5 Free'; - font-weight: 700; - content: "\f105"; - margin-left: auto; - color: $text-muted; - transition: $transition-base; - } // Expanded - &[aria-expanded="true"] { - - &:after { - transform: rotate(90deg); - } - } - } - - // Second level - .navbar-nav .nav .nav-link { - padding-left: $navbar-padding-x + $navbar-icon-min-width; - } - - // Third level - .navbar-nav .nav .nav .nav-link { - padding-left: $navbar-padding-x * 1.5 + $navbar-icon-min-width; - } - - - // Navbar heading - .navbar-heading { - padding-top: $nav-link-padding-y; - padding-bottom: $nav-link-padding-y; - font-size: $font-size-xs; - text-transform: uppercase; - letter-spacing: .04em; - } - - - // Expanded navbar specific styles - &.navbar-expand { - @each $breakpoint, - $dimension in $grid-breakpoints { - - &-#{$breakpoint} { - @include media-breakpoint-up(#{$breakpoint}) { - display: block; - position: fixed; - top: 0; - bottom: 0; - width: 100%; - max-width: $navbar-vertical-width; - padding-left: $navbar-vertical-padding-x; - padding-right: $navbar-vertical-padding-x; - - overflow-y: auto; - - // Container - >[class*="container"] { - flex-direction: column; - align-items: stretch; - min-height: 100%; - padding-left: 0; - padding-right: 0; // Target IE 10 & 11 - @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { - min-height: none; - height: 100%; - } - } - - - // Fixes the vertical navbar to the left - &.fixed-left { - left: 0; - border-width: 0 1px 0 0; - } - - - // Fixed the vertical navbar to the right - &.fixed-right { - right: 0; - border-width: 0 0 0 1px; - } - - - // Navbar collapse - .navbar-collapse { - flex: 1; - display: flex; - flex-direction: column; - align-items: stretch; - margin-left: -$navbar-vertical-padding-x; - margin-right: -$navbar-vertical-padding-x; - padding-left: $navbar-vertical-padding-x; - padding-right: $navbar-vertical-padding-x; - - > * { - min-width: 100%; - } - } - - - // Navbar navigation - .navbar-nav { - flex-direction: column; - margin-left: -$navbar-vertical-padding-x; - margin-right: -$navbar-vertical-padding-x; - } - - .navbar-nav .nav-link { - padding: $navbar-vertical-nav-link-padding-y $navbar-vertical-nav-link-padding-x; - - &.active { - &:before { - top: $nav-link-padding-y; - bottom: $nav-link-padding-y; - left: 0; - right: auto; - border-left: 2px solid $primary; - border-bottom: 0; - } - } - } - - - // Second level - .navbar-nav .nav .nav-link { - padding-left: $navbar-vertical-padding-x + $navbar-icon-min-width; - } - - - // Third level - .navbar-nav .nav .nav .nav-link { - padding-left: $navbar-vertical-padding-x * 1.5 + $navbar-icon-min-width; - } - - // Navbar brand - .navbar-brand { - display: block; - text-align: center; - padding-top: (2rem - $navbar-padding-y); - padding-bottom: (2rem - $navbar-padding-y); - } - - .navbar-brand-img { - max-height: 2.5rem; - } - - // Navbar user - .navbar-user { - margin-left: -$navbar-vertical-padding-x; - margin-right: -$navbar-vertical-padding-x; - padding-top: $spacer; - padding-bottom: $spacer - $navbar-padding-y; - padding-left: $navbar-vertical-padding-x; - padding-right: $navbar-vertical-padding-x; - border-top: 1px solid $border-color; - - // Dropup menu - .dropup .dropdown-menu { - left: 50%; - transform: translateX(-50%); - } - } - } - } - } - } -} diff --git a/frontend/src/assets/scss/core/navbars/_navbar.scss b/frontend/src/assets/scss/core/navbars/_navbar.scss deleted file mode 100644 index a2390b326..000000000 --- a/frontend/src/assets/scss/core/navbars/_navbar.scss +++ /dev/null @@ -1,153 +0,0 @@ -// -// Navbar -// - - -// Navbar links - -.navbar-horizontal { - .navbar-nav { - .nav-link { - font-size: $navbar-nav-link-font-size; - font-weight: $navbar-nav-link-font-weight; - text-transform: $navbar-nav-link-text-transform; - letter-spacing: $navbar-nav-link-letter-spacing; - @include transition($navbar-transition); - - .nav-link-inner--text { - margin-left: .25rem; - } - } - } - - - // Navbar brand (logo) - - .navbar-brand { - font-size: $font-size-sm; - font-weight: 600; - text-transform: uppercase; - font-size: .875rem; - letter-spacing: .05px; - - img { - height: 30px; - } - } - - .navbar-dark { - .navbar-brand { - color: $white; - } - } - - .navbar-light { - .navbar-brand { - color: $gray-800; - } - } - - .navbar-nav { - .nav-item { - .media:not(:last-child){ - margin-bottom: 1.5rem; - } - } - } - - @include media-breakpoint-up(lg) { - .navbar-nav { - .nav-item { - margin-right: .5rem; - - [data-toggle="dropdown"]::after { - transition: $transition-base; - } - - &.show { - [data-toggle="dropdown"]::after { - transform: rotate(180deg); - } - } - } - .nav-link { - padding-top: $navbar-nav-link-padding-y; - padding-bottom: $navbar-nav-link-padding-y; - border-radius: $navbar-nav-link-border-radius; - - i { - margin-right: .625rem; - } - } - - .nav-link-icon { - padding-left: .5rem !important; - padding-right: .5rem !important; - font-size: 1rem; - border-radius: $navbar-nav-link-border-radius; - - i { - margin-right: 0; - } - } - } - } - - - // Transparent navbar - - .navbar-transparent { - position: absolute; - top: 0; - width: 100%; - z-index: 100; - background-color: transparent; - border: 0; - box-shadow: none; - - .navbar-brand { - color: rgba(255, 255, 255, 1); - } - - .navbar-toggler { - color: rgba(255, 255, 255, 1); - } - - .navbar-toggler-icon { - background-image: $navbar-dark-toggler-icon-bg; - } - } - - @include media-breakpoint-up(md) { - .navbar-transparent { - .navbar-nav { - .nav-link { - color: $navbar-dark-color; - - @include hover-focus { - color: $navbar-dark-hover-color; - } - - &.disabled { - color: $navbar-dark-disabled-color; - } - } - - .show > .nav-link, - .active > .nav-link, - .nav-link.show, - .nav-link.active { - color: $navbar-dark-active-color; - } - } - - .navbar-brand { - color: $navbar-dark-color; - - @include hover-focus { - color: $navbar-dark-color; - } - } - } - } -} diff --git a/frontend/src/assets/scss/core/navs/_nav-pills.scss b/frontend/src/assets/scss/core/navs/_nav-pills.scss deleted file mode 100644 index 9fe2a3743..000000000 --- a/frontend/src/assets/scss/core/navs/_nav-pills.scss +++ /dev/null @@ -1,66 +0,0 @@ -// -// Nav pills -// - - -// General styles - -.nav-pills { - .nav-item:not(:last-child) { - padding-right: $nav-pills-space-x; - } - - .nav-link { - padding: $nav-pills-padding-y $nav-pills-padding-x; - color: $nav-pills-link-color; - font-weight: 500; - font-size: $font-size-sm; - box-shadow: $nav-pills-box-shadow; - background-color: $nav-pills-bg; - transition: $transition-base; - - &:hover { - color: $nav-pills-link-hover-color; - } - } - - .nav-link.active, - .show > .nav-link { - color: $nav-pills-link-active-color; - background-color: $nav-pills-link-active-bg; - } - - @include media-breakpoint-down(xs) { - .nav-item { - margin-bottom: $spacer; - } - } -} - -@include media-breakpoint-down(sm) { - .nav-pills:not(.nav-pills-circle) { - .nav-item { - padding-right: 0; - } - } -} - - -// Rounded circle nav pills - -.nav-pills-circle { - .nav-link { - text-align: center; - height: 60px; - width: 60px; - padding: 0; - line-height: 60px; - border-radius: 50%; - } - - .nav-link-icon { - i, svg { - font-size: 1rem; - } - } -} diff --git a/frontend/src/assets/scss/core/navs/_nav.scss b/frontend/src/assets/scss/core/navs/_nav.scss deleted file mode 100644 index ed1a9f3c9..000000000 --- a/frontend/src/assets/scss/core/navs/_nav.scss +++ /dev/null @@ -1,33 +0,0 @@ -// -// Nav -// - - -// Nav wrapper (container) - -// Nav wrapper -.nav-wrapper { - padding: 1rem 0; - @include border-top-radius($card-border-radius); - - + .card { - @include border-top-radius(0); - @include border-bottom-radius($card-border-radius); - } -} - - -// Nav links - -.nav-link { - color: $nav-link-color; - - &:hover { - color: $nav-link-hover-color; - } - - i.ni { - position: relative; - top: 2px; - } -} diff --git a/frontend/src/assets/scss/core/paginations/_pagination.scss b/frontend/src/assets/scss/core/paginations/_pagination.scss deleted file mode 100644 index 02f76275c..000000000 --- a/frontend/src/assets/scss/core/paginations/_pagination.scss +++ /dev/null @@ -1,48 +0,0 @@ -// -// Pagination -// - - -.page-item { - &.active .page-link { - box-shadow: $pagination-active-box-shadow; - } - - .page-link, - span { - display: flex; - align-items: center; - justify-content: center; - padding: 0; - margin: 0 3px; - border-radius: 50% !important; - width: 36px; - height: 36px; - font-size: $font-size-sm; - } -} - - -// Size variations - -.pagination-lg { - .page-item { - .page-link, - span { - width: 46px; - height: 46px; - line-height: 46px; - } - } -} - -.pagination-sm { - .page-item { - .page-link, - span { - width: 30px; - height: 30px; - line-height: 30px; - } - } -} diff --git a/frontend/src/assets/scss/core/popovers/_popover.scss b/frontend/src/assets/scss/core/popovers/_popover.scss deleted file mode 100644 index 52cedec0f..000000000 --- a/frontend/src/assets/scss/core/popovers/_popover.scss +++ /dev/null @@ -1,21 +0,0 @@ -// -// Popover -// - - -.popover { - border: 0; -} - -.popover-header { - font-weight: $font-weight-bold; -} - - -// Alternative colors - -@each $color, $value in $theme-colors { - .popover-#{$color} { - @include popover-variant($value); - } -} diff --git a/frontend/src/assets/scss/core/progresses/_progress.scss b/frontend/src/assets/scss/core/progresses/_progress.scss deleted file mode 100644 index 70a50432b..000000000 --- a/frontend/src/assets/scss/core/progresses/_progress.scss +++ /dev/null @@ -1,79 +0,0 @@ -// -// Progress -// - - -// Progress container - -.progress-wrapper { - position: relative; - padding-top: 1.5rem; -} - - -// General styles - -.progress { - height: 8px; - margin-bottom: $spacer; - overflow: hidden; - border-radius: $border-radius-sm; - background-color: $progress-bg; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - - .sr-only { - width: auto; - height: 20px; - margin: 0 0 0 30px; - left: 0; - clip: auto; - line-height: 20px; - font-size: 13px; - } -} - - -// Progress inner elements - -.progress-heading { - font-size: 14px; - font-weight: 500; - margin: 0 0 2px; - padding: 0; -} - -.progress-bar { - box-shadow: none; - border-radius: 0; - height: auto; -} - -.progress-info{ - margin-bottom: .5rem; - display: flex; - align-items: center; - justify-content: space-between; -} - -.progress-label { - span { - display: inline-block; - color: $primary; - font-size: .625rem; - font-weight: 600; - text-transform: uppercase; - background: rgba($primary, .1); - padding: .25rem 1rem; - border-radius: 30px; - } -} - -.progress-percentage { - text-align: right; - span { - display: inline-block; - color: $gray-600; - font-size: .875rem; - font-weight: 600; - } -} diff --git a/frontend/src/assets/scss/core/separators/_separator.scss b/frontend/src/assets/scss/core/separators/_separator.scss deleted file mode 100644 index 4808dfb6c..000000000 --- a/frontend/src/assets/scss/core/separators/_separator.scss +++ /dev/null @@ -1,54 +0,0 @@ -// -// Separator -// add svg on top or bottom of a section for a more stylish visual -// - - -.separator { - position: absolute; - top: auto; - left: 0; - right: 0; - width: 100%; - height: 150px; - transform: translateZ(0); - overflow: hidden; - pointer-events: none; - - svg { - position: absolute; - pointer-events: none; - } -} - -.separator-top { - top: 0; - bottom: auto; - - svg { - top: 0; - } -} - -.separator-bottom { - top: auto; - bottom: 0; - - svg { - bottom: 0; - } -} - -.separator-inverse { - transform: rotate(180deg); -} - -// Styles - -.separator-skew { - height: 60px; - - @include media-breakpoint-up(xl) { - height: 70px; - } -} diff --git a/frontend/src/assets/scss/core/tables/_table.scss b/frontend/src/assets/scss/core/tables/_table.scss deleted file mode 100644 index 18475b5a5..000000000 --- a/frontend/src/assets/scss/core/tables/_table.scss +++ /dev/null @@ -1,118 +0,0 @@ -// -// Table -// - - -// General styles - -.table { - thead th { - padding-top: $table-head-spacer-y; - padding-bottom: $table-head-spacer-y; - font-size: $table-head-font-size; - text-transform: $table-head-text-transform; - letter-spacing: $table-head-letter-spacing; - border-bottom: $table-border-width solid $table-border-color; - } - - th { - font-weight: $table-head-font-weight; - } - - td { - .progress { - height: 3px; - width: 120px; - margin: 0; - } - } - - td, - th { - font-size: $table-body-font-size; - white-space: nowrap; - } - - - // Vetical align table content - - &.align-items-center { - td, - th { - vertical-align: middle; - } - } - - - // Styles for dark table - - .thead-dark { - th { - background-color: $table-dark-head-bg; - color: $table-dark-head-color; - } - } - - - // Styles for light table - - .thead-light { - th { - background-color: $table-head-bg; - color: $table-head-color; - } - } -} - - -// Add transition for hover state - -.table-hover { - tr { - @include transition($transition-base); - } -} - - -// Flush tables - -.table-flush { - td, - th { - border-left: 0; - border-right: 0; - } - - tbody { - tr { - &:first-child { - td, - th { - border-top: 0; - } - } - - &:last-child { - td, - th { - border-bottom: 0; - } - } - } - } -} - - -// Tables inside cards - -.card { - .table { - margin-bottom: 0; - - td, - th { - padding-left: $card-spacer-x; - padding-right: $card-spacer-x; - } - } -} diff --git a/frontend/src/assets/scss/core/type/_article.scss b/frontend/src/assets/scss/core/type/_article.scss deleted file mode 100644 index 47ac1c754..000000000 --- a/frontend/src/assets/scss/core/type/_article.scss +++ /dev/null @@ -1,22 +0,0 @@ -// -// Article -// - -article { - h4:not(:first-child), - h5:not(:first-child) { - margin-top: 3rem; - } - - h4, h5 { - margin-bottom: 1.5rem; - } - - figure { - margin: 3rem 0; - } - - h5 + figure { - margin-top: 0; - } -} diff --git a/frontend/src/assets/scss/core/type/_display.scss b/frontend/src/assets/scss/core/type/_display.scss deleted file mode 100644 index c0b1ec548..000000000 --- a/frontend/src/assets/scss/core/type/_display.scss +++ /dev/null @@ -1,14 +0,0 @@ -// -// Display -// - - -.display-1, -.display-2, -.display-3, -.display-4 { - span { - display: block; - font-weight: $font-weight-light; - } -} diff --git a/frontend/src/assets/scss/core/type/_heading.scss b/frontend/src/assets/scss/core/type/_heading.scss deleted file mode 100644 index eb028b7a6..000000000 --- a/frontend/src/assets/scss/core/type/_heading.scss +++ /dev/null @@ -1,52 +0,0 @@ -// -// Heading -// - - -// General styles - -.heading { - letter-spacing: $heading-letter-spacing; - font-size: $heading-font-size; - text-transform: $heading-text-transform; - font-weight: $heading-font-weight; -} - - -// Heading variations - -.heading-small { - padding-top: .25rem; - padding-bottom: .25rem; - font-size: .75rem; - text-transform: uppercase; - letter-spacing: .04em; -} - -.heading-title { - letter-spacing: $heading-title-letter-spacing; - font-size: $heading-title-font-size; - font-weight: $heading-title-font-weight; - text-transform: $heading-title-text-transform; -} - -.heading-section { - letter-spacing: $heading-section-letter-spacing; - font-size: $heading-section-font-size; - font-weight: $heading-section-font-weight; - text-transform: $heading-section-text-transform; - - img { - display: block; - width: 72px; - height: 72px; - margin-bottom: 1.5rem; - } - - &.text-center { - img { - margin-left: auto; - margin-right: auto; - } - } -} diff --git a/frontend/src/assets/scss/core/type/_type.scss b/frontend/src/assets/scss/core/type/_type.scss deleted file mode 100644 index 6512a7f5f..000000000 --- a/frontend/src/assets/scss/core/type/_type.scss +++ /dev/null @@ -1,27 +0,0 @@ -// -// Type -// - - -// Paragraphs - -p { - font-size: $paragraph-font-size; - font-weight: $paragraph-font-weight; - line-height: $paragraph-line-height; -} - -.lead { - font-size: $lead-font-size; - font-weight: $lead-font-weight; - line-height: $paragraph-line-height; - margin-top: 1.5rem; - - + .btn-wrapper { - margin-top: 3rem; - } -} - -.description { - font-size: $font-size-sm; -} diff --git a/frontend/src/assets/scss/core/utilities/_backgrounds.scss b/frontend/src/assets/scss/core/utilities/_backgrounds.scss deleted file mode 100644 index 45a9f0635..000000000 --- a/frontend/src/assets/scss/core/utilities/_backgrounds.scss +++ /dev/null @@ -1,51 +0,0 @@ -// -// Backgrounds -// - - -@each $color, $value in $colors { - @include bg-variant(".bg-#{$color}", $value, $ignore-warning: true); -} - -@each $color, $value in $theme-colors { - @include bg-gradient-variant(".bg-gradient-#{$color}", $value, $ignore-warning: true); -} - -@each $color, $value in $colors { - @include bg-gradient-variant(".bg-gradient-#{$color}", $value, $ignore-warning: true); -} - - -// Background colors with transparency - -@each $color, $value in $theme-colors { - @include bg-translucent-variant(".bg-translucent-#{$color}", $value, $ignore-warning: true); -} - - -// Sections backgrounds - -@each $color, $value in $section-colors { - @include bg-variant(".section-#{$color}", $value, $ignore-warning: true); -} - -@each $color, $value in $theme-colors { - @include bg-gradient-variant(".bg-gradient-#{$color}", $value, $ignore-warning: true); -} - - -// Shape (svg) fill colors - -@each $color, $value in $theme-colors { - .fill-#{$color} { - fill: $value; - } - - .stroke-#{$color} { - stroke: $value; - } -} - -.fill-opacity-8 { - fill-opacity: .8; -} diff --git a/frontend/src/assets/scss/core/utilities/_blurable.scss b/frontend/src/assets/scss/core/utilities/_blurable.scss deleted file mode 100644 index a558c0d44..000000000 --- a/frontend/src/assets/scss/core/utilities/_blurable.scss +++ /dev/null @@ -1,37 +0,0 @@ -// -// Blurable -// add a blue effect on hover on any element with .blur--hover class -// - -.blur--hover { - position: relative; - - .blur-item { - transition: 1s cubic-bezier(.19,1,.22,1); - will-change: transform; - filter: blur(0); - opacity: 1; - } - - .blur-hidden { - position: absolute; - top: calc(50% + 7px); - left: 50%; - transform: translate(-50%, -50%); - opacity: 0; - transition: $transition-base; - z-index: 100; - } - &:hover { - .blur-item { - opacity: .8; - filter: blur(10px); - transform: scale(.95); - z-index: 1; - } - .blur-hidden { - opacity: 1; - top: 50%; - } - } -} diff --git a/frontend/src/assets/scss/core/utilities/_floating.scss b/frontend/src/assets/scss/core/utilities/_floating.scss deleted file mode 100644 index eaa90fc9b..000000000 --- a/frontend/src/assets/scss/core/utilities/_floating.scss +++ /dev/null @@ -1,64 +0,0 @@ -// -// Floating -// floating animation utility class -// - - -.floating { - animation: floating 3s ease infinite; - will-change: transform; - - &:hover { - animation-play-state: paused; - } -} - - -// Size variations - -.floating-lg { - animation: floating-lg 3s ease infinite; -} - -.floating-sm { - animation: floating-sm 3s ease infinite; -} - - -// Keyframes - -@keyframes floating-lg { - 0% { - transform: translateY(0px) - } - 50% { - transform: translateY(15px) - } - 100% { - transform: translateY(0px) - } -} - -@keyframes floating { - 0% { - transform: translateY(0px) - } - 50% { - transform: translateY(10px) - } - 100% { - transform: translateY(0px) - } -} - -@keyframes floating-sm { - 0% { - transform: translateY(0px) - } - 50% { - transform: translateY(5px) - } - 100% { - transform: translateY(0px) - } -} diff --git a/frontend/src/assets/scss/core/utilities/_helper.scss b/frontend/src/assets/scss/core/utilities/_helper.scss deleted file mode 100644 index 013bd2890..000000000 --- a/frontend/src/assets/scss/core/utilities/_helper.scss +++ /dev/null @@ -1,18 +0,0 @@ -// -// Helper -// helper classes for different cases -// - - -// Clearfix for sections that use float property - -.floatfix { - &:before, - &:after { - content: ''; - display: table; - } - &:after { - clear: both; - } -} diff --git a/frontend/src/assets/scss/core/utilities/_image.scss b/frontend/src/assets/scss/core/utilities/_image.scss deleted file mode 100644 index 8bdfbbc0f..000000000 --- a/frontend/src/assets/scss/core/utilities/_image.scss +++ /dev/null @@ -1,9 +0,0 @@ -// -// Image -// - -.img-center { - display: block; - margin-left: auto; - margin-right: auto; -} diff --git a/frontend/src/assets/scss/core/utilities/_opacity.scss b/frontend/src/assets/scss/core/utilities/_opacity.scss deleted file mode 100644 index 812bfd8bc..000000000 --- a/frontend/src/assets/scss/core/utilities/_opacity.scss +++ /dev/null @@ -1,35 +0,0 @@ -// -// Opacity -// modify the transparency of an element with this quick modifier classes -// - -.opacity-1 { - opacity: .1 !important; -} -.opacity-2 { - opacity: .2 !important; -} -.opacity-3 { - opacity: .3 !important; -} -.opacity-4 { - opacity: .4 !important; -} -.opacity-5 { - opacity: .5 !important; -} -.opacity-6 { - opacity: .6 !important; -} -.opacity-7 { - opacity: .7 !important; -} -.opacity-8 { - opacity: .8 !important; -} -.opacity-8 { - opacity: .9 !important; -} -.opacity-10 { - opacity: 1 !important; -} diff --git a/frontend/src/assets/scss/core/utilities/_overflow.scss b/frontend/src/assets/scss/core/utilities/_overflow.scss deleted file mode 100644 index b4063fc31..000000000 --- a/frontend/src/assets/scss/core/utilities/_overflow.scss +++ /dev/null @@ -1,11 +0,0 @@ -// -// Overflow -// - -.overflow-visible { - overflow: visible !important; -} - -.overflow-hidden { - overflow: hidden !important; -} diff --git a/frontend/src/assets/scss/core/utilities/_position.scss b/frontend/src/assets/scss/core/utilities/_position.scss deleted file mode 100644 index 58aaa0929..000000000 --- a/frontend/src/assets/scss/core/utilities/_position.scss +++ /dev/null @@ -1,25 +0,0 @@ -// -// Position -// modifier classes to be applied on an abosolute positioned element -// use it next to .position-absolute class -// - -@each $size, $value in $spacers { - .top-#{$size} { - top: $value; - } - .right-#{$size} { - right: $value; - } - .bottom-#{$size} { - bottom: $value; - } - .left-#{$size} { - left: $value; - } -} - -.center { - left: 50%; - transform: translateX(-50%); -} diff --git a/frontend/src/assets/scss/core/utilities/_shadows.scss b/frontend/src/assets/scss/core/utilities/_shadows.scss deleted file mode 100644 index 8907c8b5b..000000000 --- a/frontend/src/assets/scss/core/utilities/_shadows.scss +++ /dev/null @@ -1,28 +0,0 @@ -// -// Shadows -// - -// General styles -[class*="shadow"] { - @if $enable-transitions { - transition: $transition-base; - } -} - - -// Size variations -.shadow-sm--hover:hover { - box-shadow: $box-shadow-sm !important; -} - -.shadow--hover:hover { - box-shadow: $box-shadow !important; -} - -.shadow-lg--hover:hover { - box-shadow: $box-shadow-lg !important; -} - -.shadow-none--hover:hover { - box-shadow: none !important; -} diff --git a/frontend/src/assets/scss/core/utilities/_sizing.scss b/frontend/src/assets/scss/core/utilities/_sizing.scss deleted file mode 100644 index 5dd6b2195..000000000 --- a/frontend/src/assets/scss/core/utilities/_sizing.scss +++ /dev/null @@ -1,7 +0,0 @@ -// -// Height -// - -.h-100vh { - height: 100vh !important; -} diff --git a/frontend/src/assets/scss/core/utilities/_spacing.scss b/frontend/src/assets/scss/core/utilities/_spacing.scss deleted file mode 100644 index b3fb9fa0e..000000000 --- a/frontend/src/assets/scss/core/utilities/_spacing.scss +++ /dev/null @@ -1,107 +0,0 @@ -// -// Spacing -// - -.row.row-grid > [class*="col-"] + [class*="col-"] { - margin-top: 3rem; -} - -@include media-breakpoint-up(lg) { - .row.row-grid > [class*="col-lg-"] + [class*="col-lg-"] { - margin-top: 0; - } -} -@include media-breakpoint-up(md) { - .row.row-grid > [class*="col-md-"] + [class*="col-md-"] { - margin-top: 0; - } -} -@include media-breakpoint-up(sm) { - .row.row-grid > [class*="col-sm-"] + [class*="col-sm-"] { - margin-top: 0; - } -} - -.row-grid + .row-grid { - margin-top: 3rem; -} - - -// Negative margins and paddings - -@media(min-width: 992px) { - [class*="mt--"], - [class*="mr--"], - [class*="mb--"], - [class*="ml--"] { - - } - - - // Large negative margins in pixels - - .mt--100 { - margin-top: -100px !important; - } - .mr--100 { - margin-right: -100px !important; - } - .mb--100 { - margin-bottom: -100px !important; - } - .ml--100 { - margin-left: -100px !important; - } - .mt--150 { - margin-top: -150px !important; - } - .mb--150 { - margin-bottom: -150px !important; - } - .mt--200 { - margin-top: -200px !important; - } - .mb--200 { - margin-bottom: -200px !important; - } - .mt--300 { - margin-top: -300px !important; - } - .mb--300 { - margin-bottom: -300px !important; - } - - - // Large margins in pixels - - .pt-100 { - padding-top: 100px !important; - } - .pb-100 { - padding-bottom: 100px !important; - } - .pt-150 { - padding-top: 150px !important; - } - .pb-150 { - padding-bottom: 150px !important; - } - .pt-200 { - padding-top: 200px !important; - } - .pb-200 { - padding-bottom: 200px !important; - } - .pt-250 { - padding-top: 250px !important; - } - .pb-250 { - padding-bottom: 250px !important; - } - .pt-300 { - padding-top: 300px!important; - } - .pb-300 { - padding-bottom: 300px!important; - } -} diff --git a/frontend/src/assets/scss/core/utilities/_text.scss b/frontend/src/assets/scss/core/utilities/_text.scss deleted file mode 100644 index 65c1f6cec..000000000 --- a/frontend/src/assets/scss/core/utilities/_text.scss +++ /dev/null @@ -1,49 +0,0 @@ -// Weight and italics - -.font-weight-300 { font-weight: 300 !important; } -.font-weight-400 { font-weight: 400 !important; } -.font-weight-500 { font-weight: 500 !important; } -.font-weight-600 { font-weight: 600 !important; } -.font-weight-700 { font-weight: 700 !important; } -.font-weight-800 { font-weight: 800 !important; } -.font-weight-900 { font-weight: 900 !important; } - - -// Text decorations - -.text-underline { text-decoration: underline; } -.text-through { text-decoration: line-through; } - - -// Text size - -.text-xs { font-size: $font-size-xs !important; } -.text-sm { font-size: $font-size-sm !important; } -.text-lg { font-size: $font-size-lg !important; } -.text-xl { font-size: $font-size-xl !important; } - - -// Line heights - -.lh-100 { line-height: 1; } -.lh-110 { line-height: 1.1; } -.lh-120 { line-height: 1.2; } -.lh-130 { line-height: 1.3; } -.lh-140 { line-height: 1.4; } -.lh-150 { line-height: 1.5; } -.lh-160 { line-height: 1.6; } -.lh-170 { line-height: 1.7; } -.lh-180 { line-height: 1.8; } - - -// Letter spacings - -.ls-1 { letter-spacing: .0625rem; } -.ls-15 { letter-spacing: .09375rem; } -.ls-2 { letter-spacing: 0.125rem; } - -// Color variations - -@each $color, $value in $colors { - @include text-emphasis-variant(".text-#{$color}", $value); -} diff --git a/frontend/src/assets/scss/core/utilities/_transform.scss b/frontend/src/assets/scss/core/utilities/_transform.scss deleted file mode 100644 index e595bf8b4..000000000 --- a/frontend/src/assets/scss/core/utilities/_transform.scss +++ /dev/null @@ -1,13 +0,0 @@ -// -// Tranform -// - - -@include media-breakpoint-up(lg) { - .transform-perspective-right { - transform: scale(1) perspective(1040px) rotateY(-11deg) rotateX(2deg) rotate(2deg); - } - .transform-perspective-left{ - transform: scale(1) perspective(2000px) rotateY(11deg) rotateX(2deg) rotate(-2deg) - } -} diff --git a/frontend/src/assets/scss/core/vendors/_flatpickr.scss b/frontend/src/assets/scss/core/vendors/_flatpickr.scss deleted file mode 100644 index 655e982c7..000000000 --- a/frontend/src/assets/scss/core/vendors/_flatpickr.scss +++ /dev/null @@ -1,72 +0,0 @@ -%active-day { - background: $datepicker-active-background; - color: $datepicker-active-color; - box-shadow: $datepicker-active-box-shadow; - border: none; -} -.flatpickr-calendar { - @include box-shadow($dropdown-box-shadow); - padding: $datepicker-dropdown-padding; - width: 347px; - color: $gray-700; - - .flatpickr-weekday { - text-align: center; - font-size: $font-size-sm; - color: $gray-700; - font-weight: normal; - } - .flatpickr-day { - border: none; - } - .flatpickr-day:hover { - @extend %active-day; - } - .flatpickr-day.selected { - @extend %active-day; - &:hover { - @extend %active-day; - } - } - - .flatpickr-day.today { - border: 1px solid $datepicker-active-background; - &:hover { - background: $datepicker-active-background; - color: $datepicker-active-color; - } - } - .flatpickr-day.inRange { - background: $datepicker-active-background !important; - color: $datepicker-active-color; - box-shadow: -5px 0 0 $datepicker-active-background, 5px 0 0 $datepicker-active-background; - border: none !important; - } - - .flatpickr-day.startRange, .flatpickr-day.endRange { - background: $datepicker-active-background; - } - - .flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)), - .flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)), - .flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)) { - box-shadow: -10px 0 0 $datepicker-active-background; - } - - .flatpickr-months .flatpickr-prev-month:hover svg, - .flatpickr-months .flatpickr-next-month:hover svg{ - fill: $datepicker-active-background; - } - - .flatpickr-current-month span.cur-month, - .flatpickr-current-month input.cur-year{ - padding: 0 10px; - color: $gray-700; - font-size: $font-size-sm; - font-weight: 500; - &:hover { - background: $gray-200; - border-radius: $datepicker-header-cell-border-radius; - } - } -} diff --git a/frontend/src/assets/scss/core/vendors/_headroom.scss b/frontend/src/assets/scss/core/vendors/_headroom.scss deleted file mode 100644 index 3542e4a1e..000000000 --- a/frontend/src/assets/scss/core/vendors/_headroom.scss +++ /dev/null @@ -1,25 +0,0 @@ -// -// Headroom -// - - -.headroom { - will-change: transform; - background-color: inherit; - @include transition($transition-base); -} -.headroom--pinned { - @extend .position-fixed; - transform: translateY(0%); -} -.headroom--unpinned { - @extend .position-fixed; - transform: translateY(-100%); -} - -.headroom--not-top { - padding-top: .5rem; - padding-bottom: .5rem; - background-color: theme-color("default") !important; - box-shadow: 0 1px 10px rgba(130, 130, 134, 0.1); -} diff --git a/frontend/src/assets/scss/core/vendors/_nouislider.scss b/frontend/src/assets/scss/core/vendors/_nouislider.scss deleted file mode 100644 index cb99d7705..000000000 --- a/frontend/src/assets/scss/core/vendors/_nouislider.scss +++ /dev/null @@ -1,410 +0,0 @@ -// -// NoUi Slider -// - - -// Original styles - -.noUi-target, -.noUi-target * { - -webkit-touch-callout: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - -webkit-user-select: none; - touch-action: none; - user-select: none; - box-sizing: border-box; -} - -.noUi-target { - position: relative; - direction: ltr; -} - -.noUi-base, -.noUi-connects { - width: 100%; - height: 100%; - position: relative; - z-index: 1; -} - - -// Wrapper for all connect elements - -.noUi-connects { - overflow: hidden; - z-index: 0; -} - -.noUi-connect, -.noUi-origin { - will-change: transform; - position: absolute; - z-index: 1; - top: 0; - left: 0; - height: 100%; - width: 100%; - transform-origin: 0 0; -} - - -html:not([dir="rtl"]) .noUi-horizontal .noUi-origin { - left: 100%; - width: 10%; - right: 0; -} - -.noUi-vertical .noUi-origin { - width: 0; -} - -.noUi-horizontal .noUi-origin { - height: 0; -} - -.noUi-handle { - position: absolute; -} - -.noUi-state-tap .noUi-connect, -.noUi-state-tap .noUi-origin { - transition: transform .3s; -} - -.noUi-state-drag * { - cursor: inherit !important; -} - -.noUi-horizontal { - height: $noui-target-thickness; -} - -.noUi-horizontal .noUi-handle { - width: 34px; - height: 28px; - left: -17px; - top: -6px; -} - -.noUi-vertical { - width: $noui-target-thickness; -} - -.noUi-vertical .noUi-handle { - width: 28px; - height: 34px; - left: -6px; - top: -17px; -} - -html:not([dir="rtl"]) .noUi-horizontal .noUi-handle { - left: auto; -} - -.noUi-connects { - border-radius: 3px; -} - -.noUi-connect { - background: $noui-slider-connect-bg; -} - -.noUi-draggable { - cursor: ew-resize; -} - -.noUi-vertical .noUi-draggable { - cursor: ns-resize; -} - -.noUi-handle { - border: 1px solid #D9D9D9; - border-radius: 3px; - background: #FFF; - cursor: default; - box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; - outline: none; -} - -.noUi-active { - outline: none; -} - - -/* Disabled state; - */ - -[disabled] .noUi-connect { - background: #B8B8B8; -} - -[disabled].noUi-target, -[disabled].noUi-handle, -[disabled] .noUi-handle { - cursor: not-allowed; -} - - -/* Base; - * - */ - -.noUi-pips, -.noUi-pips * { - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.noUi-pips { - position: absolute; - color: #999; -} - - -/* Values; - * - */ - -.noUi-value { - position: absolute; - white-space: nowrap; - text-align: center; -} - -.noUi-value-sub { - color: #ccc; - font-size: 10px; -} - - -/* Markings; - * - */ - -.noUi-marker { - position: absolute; - background: #CCC; -} - -.noUi-marker-sub { - background: #AAA; -} - -.noUi-marker-large { - background: #AAA; -} - - -/* Horizontal layout; - * - */ - -.noUi-pips-horizontal { - padding: 10px 0; - height: 80px; - top: 100%; - left: 0; - width: 100%; -} - -.noUi-value-horizontal { - transform: translate(-50%, 50%); -} - -.noUi-rtl .noUi-value-horizontal { - transform: translate(50%, 50%); -} - -.noUi-marker-horizontal.noUi-marker { - margin-left: -1px; - width: 2px; - height: 5px; -} - -.noUi-marker-horizontal.noUi-marker-sub { - height: 10px; -} - -.noUi-marker-horizontal.noUi-marker-large { - height: 15px; -} - - -/* Vertical layout; - * - */ - -.noUi-pips-vertical { - padding: 0 10px; - height: 100%; - top: 0; - left: 100%; -} - -.noUi-value-vertical { - -webkit-transform: translate(0, -50%); - transform: translate(0, -50%, 0); - padding-left: 25px; -} - -.noUi-rtl .noUi-value-vertical { - -webkit-transform: translate(0, 50%); - transform: translate(0, 50%); -} - -.noUi-marker-vertical.noUi-marker { - width: 5px; - height: 2px; - margin-top: -1px; -} - -.noUi-marker-vertical.noUi-marker-sub { - width: 10px; -} - -.noUi-marker-vertical.noUi-marker-large { - width: 15px; -} - -.noUi-tooltip { - display: block; - position: absolute; - border: 1px solid #D9D9D9; - border-radius: 3px; - background: #fff; - color: #000; - padding: 5px; - text-align: center; - white-space: nowrap; -} - -.noUi-horizontal .noUi-tooltip { - -webkit-transform: translate(-50%, 0); - transform: translate(-50%, 0); - left: 50%; - bottom: 120%; -} - -.noUi-vertical .noUi-tooltip { - -webkit-transform: translate(0, -50%); - transform: translate(0, -50%); - top: 50%; - right: 120%; -} - - -// Custom styles - -.noUi-target { - background: $noui-target-bg; - border-radius: $noui-target-border-radius; - border: 0; - box-shadow: $noui-target-box-shadow; - margin: 15px 0; - cursor: pointer; -} - -.noUi-horizontal { - height: $noui-target-thickness; -} - - -.noUi-vertical { - width: $noui-target-thickness; -} - -.noUi-connect { - background: theme-color("primary"); - box-shadow: none; -} - -.noUi-handle { - -} - -.noUi-horizontal .noUi-handle, -.noUi-vertical .noUi-handle { - top: -$noui-target-thickness; - width: $noui-handle-width; - height: $noui-handle-width; - border-radius: 100%; - box-shadow: none; - cursor: pointer; - background-color: $noui-handle-bg; - border: $noui-handle-border; - transition: box-shadow .15s, transform .15s; -} - -.noUi-horizontal .noUi-handle.noUi-active, -.noUi-vertical .noUi-handle.noUi-active { - box-shadow: 0px 0px 0px 2px rgba($noui-handle-bg, 1); -} - -.input-slider--cyan .noUi-connect { - background: $cyan; -} - - -/* Disabled state */ - -[disabled] .noUi-connect, -[disabled].noUi-connect { - background: $noui-slider-connect-disabled-bg; -} - -[disabled] .noUi-handle, -[disabled].noUi-origin { - cursor: not-allowed; -} - -/* Range slider value labels */ - -.range-slider-value { - font-size: $font-size-xs; - font-weight: 500; - background-color: rgba($dark, .7); - color: color-yiq($dark); - border-radius: 10px; - padding: .4em .8em .3em .85em; -} - -.range-slider-wrapper .upper-info { - font-weight: 400; - margin-bottom: 5px; -} - -.input-slider-value-output { - background: #333; - color: #fff; - padding: 4px 8px; - position: relative; - top: 12px; - font-size: 11px; - border-radius: 2px; -} - -.input-slider-value-output:after { - bottom: 100%; - left: 10px; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-color: rgba(136, 183, 213, 0); - border-bottom-color: #333; - border-width: 4px; - margin-left: -4px; -} - -.input-slider-value-output.left:after { - left: 10px; - right: auto; -} - -.input-slider-value-output.right:after { - right: 10px; - left: auto; -} diff --git a/frontend/src/assets/scss/core/vendors/_scrollbar.scss b/frontend/src/assets/scss/core/vendors/_scrollbar.scss deleted file mode 100644 index 4aff7d92d..000000000 --- a/frontend/src/assets/scss/core/vendors/_scrollbar.scss +++ /dev/null @@ -1,35 +0,0 @@ -// -// Custom scrollbar -// - -.scrollbar-inner { - height: 100%; - - &:not(:hover) .scroll-element { - opacity: 0; - } - - .scroll-element { - transition: opacity 300ms; - margin-right: 2px; - - .scroll-bar, - .scroll-element_track { - transition: background-color 300ms; - } - - .scroll-element_track { - background-color: transparent; - } - } - - .scroll-element.scroll-y { - width: 3px; - right: 0; - } - - .scroll-element.scroll-x { - height: 3px; - bottom: 0; - } -} diff --git a/frontend/src/assets/scss/custom/_alert.scss b/frontend/src/assets/scss/custom/_alert.scss deleted file mode 100644 index 2ef0b7c2f..000000000 --- a/frontend/src/assets/scss/custom/_alert.scss +++ /dev/null @@ -1,6 +0,0 @@ -// -// Alert -// - -@import "../core/alerts/alert"; -@import "../core/alerts/alert-dismissible"; diff --git a/frontend/src/assets/scss/custom/_avatar.scss b/frontend/src/assets/scss/custom/_avatar.scss deleted file mode 100644 index 98818a6d6..000000000 --- a/frontend/src/assets/scss/custom/_avatar.scss +++ /dev/null @@ -1,6 +0,0 @@ -// -// Avatar -// - -@import "../core/avatars/avatar"; -@import "../core/avatars/avatar-group"; diff --git a/frontend/src/assets/scss/custom/_badge.scss b/frontend/src/assets/scss/custom/_badge.scss deleted file mode 100644 index 2682e1a2f..000000000 --- a/frontend/src/assets/scss/custom/_badge.scss +++ /dev/null @@ -1,7 +0,0 @@ -// -// Badge -// - -@import "../core/badges/badge"; -@import "../core/badges/badge-circle"; -@import "../core/badges/badge-dot"; diff --git a/frontend/src/assets/scss/custom/_buttons.scss b/frontend/src/assets/scss/custom/_buttons.scss deleted file mode 100644 index 4f2888c65..000000000 --- a/frontend/src/assets/scss/custom/_buttons.scss +++ /dev/null @@ -1,7 +0,0 @@ -// -// Button -// - -@import "../core/buttons/button"; -@import "../core/buttons/button-icon"; -@import "../core/buttons/button-brand"; diff --git a/frontend/src/assets/scss/custom/_card.scss b/frontend/src/assets/scss/custom/_card.scss deleted file mode 100644 index 1eb5ff336..000000000 --- a/frontend/src/assets/scss/custom/_card.scss +++ /dev/null @@ -1,9 +0,0 @@ -// -// Cards -// - -@import "../core/cards/card"; -@import "../core/cards/card-profile"; -@import "../core/cards/card-blockquote"; -@import "../core/cards/card-animations"; -@import "../core/cards/card-stats"; diff --git a/frontend/src/assets/scss/custom/_chart.scss b/frontend/src/assets/scss/custom/_chart.scss deleted file mode 100644 index 836ade8b7..000000000 --- a/frontend/src/assets/scss/custom/_chart.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Chart -// - -@import "../core/charts/chart"; diff --git a/frontend/src/assets/scss/custom/_close.scss b/frontend/src/assets/scss/custom/_close.scss deleted file mode 100644 index 292d6a090..000000000 --- a/frontend/src/assets/scss/custom/_close.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Close -// - -@import "../core/close/close" diff --git a/frontend/src/assets/scss/custom/_components.scss b/frontend/src/assets/scss/custom/_components.scss deleted file mode 100644 index e6815e903..000000000 --- a/frontend/src/assets/scss/custom/_components.scss +++ /dev/null @@ -1,30 +0,0 @@ -// -// Components -// - -@import "alert"; -@import "avatar"; -@import "buttons"; -@import "card"; -@import "chart"; -@import "close"; -@import "content"; -@import "custom-forms"; -@import "dropdown"; -@import "footer"; -@import "forms"; -@import "header"; -@import "icons"; -@import "input-group"; -@import "list-group"; -@import "map"; -@import "mask"; -@import "modal"; -@import "nav"; -@import "navbar"; -@import "pagination"; -@import "popover"; -@import "progress"; -@import "separator"; -@import "tables"; -@import "type"; diff --git a/frontend/src/assets/scss/custom/_content.scss b/frontend/src/assets/scss/custom/_content.scss deleted file mode 100644 index d0e638bb0..000000000 --- a/frontend/src/assets/scss/custom/_content.scss +++ /dev/null @@ -1,47 +0,0 @@ -.main-content { - position: relative; - - // Navbar - .navbar-top { - position: absolute; - left: 0; - top: 0; - width: 100%; - z-index: 1; - background-color: transparent; - padding-left: 0 !important; - padding-right: 0 !important; - } - - // Container - .container-fluid { - @include media-breakpoint-up(md) { - padding-left: ($main-content-padding-x + $grid-gutter-width / 2) !important; - padding-right: ($main-content-padding-x + $grid-gutter-width / 2) !important; - } - } -} - - -// Offsets the main content depending on the sidebar positioning - -.navbar-vertical.navbar-expand { - - @each $breakpoint, - $dimension in $grid-breakpoints { - - &-#{$breakpoint} { - - @include media-breakpoint-up(#{$breakpoint}) { - - // Left - &.fixed-left + .main-content { - margin-left: $navbar-vertical-width; - } // Right - &.fixed-right + .main-content { - margin-right: $navbar-vertical-width; - } - } - } - } -} diff --git a/frontend/src/assets/scss/custom/_custom-forms.scss b/frontend/src/assets/scss/custom/_custom-forms.scss deleted file mode 100644 index 92d8290be..000000000 --- a/frontend/src/assets/scss/custom/_custom-forms.scss +++ /dev/null @@ -1,9 +0,0 @@ -// -// Custom form -// - -@import "../core/custom-forms/custom-form"; -@import "../core/custom-forms/custom-control"; -@import "../core/custom-forms/custom-checkbox"; -@import "../core/custom-forms/custom-radio"; -@import "../core/custom-forms/custom-toggle"; diff --git a/frontend/src/assets/scss/custom/_dropdown.scss b/frontend/src/assets/scss/custom/_dropdown.scss deleted file mode 100644 index 54314b6d3..000000000 --- a/frontend/src/assets/scss/custom/_dropdown.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Dropdown -// - -@import "../core/dropdowns/dropdown"; diff --git a/frontend/src/assets/scss/custom/_footer.scss b/frontend/src/assets/scss/custom/_footer.scss deleted file mode 100644 index 9b65604a7..000000000 --- a/frontend/src/assets/scss/custom/_footer.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Footer -// - -@import "../core/footers/footer"; diff --git a/frontend/src/assets/scss/custom/_forms.scss b/frontend/src/assets/scss/custom/_forms.scss deleted file mode 100644 index 835edea84..000000000 --- a/frontend/src/assets/scss/custom/_forms.scss +++ /dev/null @@ -1,7 +0,0 @@ -// -// Forms -// - -@import "../core/forms/form"; -@import "../core/forms/form-validation"; -@import "../core/forms/input-group"; diff --git a/frontend/src/assets/scss/custom/_functions.scss b/frontend/src/assets/scss/custom/_functions.scss deleted file mode 100644 index d0b556c56..000000000 --- a/frontend/src/assets/scss/custom/_functions.scss +++ /dev/null @@ -1,33 +0,0 @@ -// -// Functions -// - -// Bootstrap default functions - -@import "~bootstrap/scss/functions"; - - -// Retrieve color Sass maps - -@function section-color($key: "primary") { - @return map-get($section-colors, $key); -} - - -// Lines colors - -@function shapes-primary-color($key: "step-1-gradient-bg") { - @return map-get($shapes-primary-colors, $key); -} - -@function shapes-default-color($key: "step-1-gradient-bg") { - @return map-get($shapes-default-colors, $key); -} - -@function lines-light-color($key: "step-1-gradient-bg") { - @return map-get($shapes-light-colors, $key); -} - -@function shapes-dark-color($key: "step-1-gradient-bg") { - @return map-get($shapes-dark-colors, $key); -} diff --git a/frontend/src/assets/scss/custom/_header.scss b/frontend/src/assets/scss/custom/_header.scss deleted file mode 100644 index d3fb2bb42..000000000 --- a/frontend/src/assets/scss/custom/_header.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Header -// - -@import "../core/headers/header"; diff --git a/frontend/src/assets/scss/custom/_icons.scss b/frontend/src/assets/scss/custom/_icons.scss deleted file mode 100644 index 86df08e38..000000000 --- a/frontend/src/assets/scss/custom/_icons.scss +++ /dev/null @@ -1,6 +0,0 @@ -// -// Icon -// - -@import "../core/icons/icon"; -@import "../core/icons/icon-shape"; diff --git a/frontend/src/assets/scss/custom/_input-group.scss b/frontend/src/assets/scss/custom/_input-group.scss deleted file mode 100644 index cc8f3dcef..000000000 --- a/frontend/src/assets/scss/custom/_input-group.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Input group -// - -@import "../core/forms/input-group"; diff --git a/frontend/src/assets/scss/custom/_list-group.scss b/frontend/src/assets/scss/custom/_list-group.scss deleted file mode 100644 index c630aa9ab..000000000 --- a/frontend/src/assets/scss/custom/_list-group.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// List group -// - -@import "../core/list-groups/list-group"; diff --git a/frontend/src/assets/scss/custom/_map.scss b/frontend/src/assets/scss/custom/_map.scss deleted file mode 100644 index 85983c632..000000000 --- a/frontend/src/assets/scss/custom/_map.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Maps -// - -@import "../core/maps/map"; diff --git a/frontend/src/assets/scss/custom/_mask.scss b/frontend/src/assets/scss/custom/_mask.scss deleted file mode 100644 index 7b2788745..000000000 --- a/frontend/src/assets/scss/custom/_mask.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Mask -// - -@import "../core/masks/mask"; diff --git a/frontend/src/assets/scss/custom/_mixins.scss b/frontend/src/assets/scss/custom/_mixins.scss deleted file mode 100644 index 89e370a42..000000000 --- a/frontend/src/assets/scss/custom/_mixins.scss +++ /dev/null @@ -1,19 +0,0 @@ -// -// Mixins -// - -// Bootstrap default mixins - -@import "~bootstrap/scss/mixins"; - - -// Custom mixins - -@import "../core/mixins/alert"; -@import "../core/mixins/badge"; -@import "../core/mixins/background-variant"; -@import "../core/mixins/buttons"; -@import "../core/mixins/forms"; -@import "../core/mixins/icon"; -@import "../core/mixins/modals"; -@import "../core/mixins/popover"; diff --git a/frontend/src/assets/scss/custom/_modal.scss b/frontend/src/assets/scss/custom/_modal.scss deleted file mode 100644 index a33f2e9d8..000000000 --- a/frontend/src/assets/scss/custom/_modal.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Modal -// - -@import "../core/modals/modal"; diff --git a/frontend/src/assets/scss/custom/_nav.scss b/frontend/src/assets/scss/custom/_nav.scss deleted file mode 100644 index b7c7a0b04..000000000 --- a/frontend/src/assets/scss/custom/_nav.scss +++ /dev/null @@ -1,7 +0,0 @@ -// -// Nav -// - - -@import "../core/navs/nav"; -@import "../core/navs/nav-pills"; diff --git a/frontend/src/assets/scss/custom/_navbar.scss b/frontend/src/assets/scss/custom/_navbar.scss deleted file mode 100644 index db24441ff..000000000 --- a/frontend/src/assets/scss/custom/_navbar.scss +++ /dev/null @@ -1,9 +0,0 @@ -// -// Navbar -// - -@import "../core/navbars/navbar"; -@import "../core/navbars/navbar-vertical"; -@import "../core/navbars/navbar-search"; -@import "../core/navbars/navbar-dropdown"; -@import "../core/navbars/navbar-collapse"; diff --git a/frontend/src/assets/scss/custom/_pagination.scss b/frontend/src/assets/scss/custom/_pagination.scss deleted file mode 100644 index 557a8e0cd..000000000 --- a/frontend/src/assets/scss/custom/_pagination.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Pagination -// - -@import "../core/paginations/pagination"; diff --git a/frontend/src/assets/scss/custom/_popover.scss b/frontend/src/assets/scss/custom/_popover.scss deleted file mode 100644 index 5e062c459..000000000 --- a/frontend/src/assets/scss/custom/_popover.scss +++ /dev/null @@ -1,6 +0,0 @@ -// -// Popover -// - - -@import "../core/popovers/popover"; diff --git a/frontend/src/assets/scss/custom/_progress.scss b/frontend/src/assets/scss/custom/_progress.scss deleted file mode 100644 index bf5840643..000000000 --- a/frontend/src/assets/scss/custom/_progress.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Progress -// - -@import "../core/progresses/progress"; diff --git a/frontend/src/assets/scss/custom/_reboot.scss b/frontend/src/assets/scss/custom/_reboot.scss deleted file mode 100644 index 4a49a6984..000000000 --- a/frontend/src/assets/scss/custom/_reboot.scss +++ /dev/null @@ -1,13 +0,0 @@ -iframe { - border: 0; -} - -figcaption, -figure, -main { - display: block; -} - -main { - overflow: hidden; -} diff --git a/frontend/src/assets/scss/custom/_section.scss b/frontend/src/assets/scss/custom/_section.scss deleted file mode 100644 index db88d4025..000000000 --- a/frontend/src/assets/scss/custom/_section.scss +++ /dev/null @@ -1,139 +0,0 @@ -// -// Sections -// - - -// Nucleo icons for presentation purpose - -.section-nucleo-icons { - - --icon-size: 5rem; - --icon-sm-size: 3.75rem; - --gutter: 7rem; - - .icons-container { - position: relative; - max-width: 100%; - height: 360px; - margin: 0 auto; - z-index: 1; - - i { - position: absolute; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 50%; - background: $white; - z-index: 1; - transform: translate(-50%, -50%); - @include box-shadow($box-shadow); - transition: all .2s cubic-bezier(.25,.65,.9,.75); - - &.icon { - width: var(--icon-size); - height: var(--icon-size); - font-size: 1.7em; - } - - &.icon-sm { - width: var(--icon-sm-size); - height: var(--icon-sm-size); - font-size: 1.5em; - } - - &:nth-child(1) { - font-size: 42px; - color: theme-color("warning"); - z-index: 2; - } - } - - &:not(.on-screen) { - i { - transform: translate(-50%, -50%); - left: 50%; - top: 50%; - - &:not(:nth-child(1)) { - opacity: 0; - } - } - } - - &.on-screen { - - i { - opacity: 1; - - &:nth-child(1) { - left: 50%; - top: 50%; - font-size: 42px; - color: theme-color("warning"); - } - - &:nth-child(2) { - left: calc(50% + (var(--gutter) * 1.7)); - top: 50%; - } - - &:nth-child(3) { - left: calc(50% + var(--gutter)); - top: calc(50% + var(--gutter)); - } - - &:nth-child(4) { - left: calc(50% + var(--gutter)); - top: calc(50% - var(--gutter)); - } - - &:nth-child(5) { - left: calc(50% + (var(--gutter) * 4)); - top: 50%; - } - - &:nth-child(6) { - left: calc(50% + (var(--gutter) * 2.7)); - top: calc(50% + (var(--gutter) * 1.5)); - } - - &:nth-child(7) { - left: calc(50% + (var(--gutter) * 2.7)); - top: calc(50% - (var(--gutter) * 1.5)); - } - - &:nth-child(8) { - left: calc(50% - (var(--gutter) * 1.7)); - top: 50%; - } - - &:nth-child(9) { - left: calc(50% - var(--gutter)); - top: calc(50% + var(--gutter)); - } - - &:nth-child(10) { - left: calc(50% - var(--gutter)); - top: calc(50% - var(--gutter)); - } - - &:nth-child(11) { - left: calc(50% - (var(--gutter) * 4)); - top: 50%; - } - - &:nth-child(12) { - left: calc(50% - (var(--gutter) * 2.7)); - top: calc(50% + (var(--gutter) * 1.5)); - } - - &:nth-child(13) { - left: calc(50% - (var(--gutter) * 2.7)); - top: calc(50% - (var(--gutter) * 1.5)); - } - } - - } - } -} diff --git a/frontend/src/assets/scss/custom/_separator.scss b/frontend/src/assets/scss/custom/_separator.scss deleted file mode 100644 index b4df82a6c..000000000 --- a/frontend/src/assets/scss/custom/_separator.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Separator -// - -@import "../core/separators/separator"; diff --git a/frontend/src/assets/scss/custom/_tables.scss b/frontend/src/assets/scss/custom/_tables.scss deleted file mode 100644 index be176ef0a..000000000 --- a/frontend/src/assets/scss/custom/_tables.scss +++ /dev/null @@ -1,5 +0,0 @@ -// -// Tables -// - -@import "../core/tables/table"; diff --git a/frontend/src/assets/scss/custom/_type.scss b/frontend/src/assets/scss/custom/_type.scss deleted file mode 100644 index 6be0c5a69..000000000 --- a/frontend/src/assets/scss/custom/_type.scss +++ /dev/null @@ -1,8 +0,0 @@ -// -// Typography -// - -@import "../core/type/type"; -@import "../core/type/heading"; -@import "../core/type/display"; -@import "../core/type/article"; diff --git a/frontend/src/assets/scss/custom/_utilities.scss b/frontend/src/assets/scss/custom/_utilities.scss deleted file mode 100644 index c73c09814..000000000 --- a/frontend/src/assets/scss/custom/_utilities.scss +++ /dev/null @@ -1,16 +0,0 @@ -// -// Utilities -// - -@import "../core/utilities/backgrounds"; -@import "../core/utilities/floating"; -@import "../core/utilities/helper"; -@import "../core/utilities/image"; -@import "../core/utilities/opacity"; -@import "../core/utilities/overflow"; -@import "../core/utilities/position"; -@import "../core/utilities/sizing"; -@import "../core/utilities/spacing"; -@import "../core/utilities/shadows"; -@import "../core/utilities/text"; -@import "../core/utilities/transform"; diff --git a/frontend/src/assets/scss/custom/_variables.scss b/frontend/src/assets/scss/custom/_variables.scss index 07cd1500e..a17320d1d 100644 --- a/frontend/src/assets/scss/custom/_variables.scss +++ b/frontend/src/assets/scss/custom/_variables.scss @@ -1,1008 +1,980 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// // Variables -// // Global settings +@import "gradido-custom/global"; -$enable-caret: true !default; -$enable-rounded: true !default; -$enable-shadows: true !default; -$enable-gradients: false !default; -$enable-transitions: true !default; -$enable-grid-classes: true !default; -$enable-print-styles: true !default; - +// $enable-caret: true !default; +// $enable-rounded: true !default; +// $enable-shadows: true !default; +// $enable-gradients: false !default; +// $enable-transitions: true !default; +// $enable-grid-classes: true !default; +// $enable-print-styles: true !default; // Color system +@import "gradido-custom/color"; -$white: #fff !default; -$gray-100: #f6f9fc !default; -$gray-200: #e9ecef !default; -$gray-300: #dee2e6 !default; -$gray-400: #ced4da !default; -$gray-500: #adb5bd !default; -$gray-600: #8898aa !default; // Line footer color -$gray-700: #525f7f !default; // Line p color -$gray-800: #32325d !default; // Line heading color -$gray-900: #212529 !default; -$black: #000 !default; +// $white: #fff !default; +// $gray-100: #f6f9fc !default; +// $gray-200: #e9ecef !default; +// $gray-300: #dee2e6 !default; +// $gray-400: #ced4da !default; +// $gray-500: #adb5bd !default; +// $gray-600: #8898aa !default; // Line footer color +// $gray-700: #525f7f !default; // Line p color +// $gray-800: #32325d !default; // Line heading color +// $gray-900: #212529 !default; +// $black: #000 !default; -$grays: () !default; -$grays: map-merge(( - "100": $gray-100, - "200": $gray-200, - "300": $gray-300, - "400": $gray-400, - "500": $gray-500, - "600": $gray-600, - "700": $gray-700, - "800": $gray-800, - "900": $gray-900 -), $grays); +// $grays: () !default; +// $grays: map-merge(( +// "100": $gray-100, +// "200": $gray-200, +// "300": $gray-300, +// "400": $gray-400, +// "500": $gray-500, +// "600": $gray-600, +// "700": $gray-700, +// "800": $gray-800, +// "900": $gray-900 +// ), $grays); -$blue: #5e72e4 !default; -$indigo: #5603ad !default; -$purple: #8965e0 !default; -$pink: #f3a4b5 !default; -$red: #f5365c !default; -$orange: #fb6340 !default; -$yellow: #ffd600 !default; -$green: #2dce89 !default; -$teal: #11cdef !default; -$cyan: #2bffc6 !default; +// $blue: #5e72e4 !default; +// $indigo: #5603ad !default; +// $purple: #8965e0 !default; +// $pink: #f3a4b5 !default; +// $red: #f5365c !default; +// $orange: #fb6340 !default; +// $yellow: #ffd600 !default; +// $green: #2dce89 !default; +// $teal: #11cdef !default; +// $cyan: #2bffc6 !default; -$colors: () !default; -$colors: map-merge(( - "blue": $blue, - "indigo": $indigo, - "purple": $purple, - "pink": $pink, - "red": $red, - "orange": $orange, - "yellow": $yellow, - "green": $green, - "teal": $teal, - "cyan": $cyan, - "white": $white, - "gray": $gray-600, - "light": $gray-400, - "lighter": $gray-200, - "gray-dark": $gray-800 -), $colors); +// $colors: () !default; +// $colors: map-merge(( +// "blue": $blue, +// "indigo": $indigo, +// "purple": $purple, +// "pink": $pink, +// "red": $red, +// "orange": $orange, +// "yellow": $yellow, +// "green": $green, +// "teal": $teal, +// "cyan": $cyan, +// "white": $white, +// "gray": $gray-600, +// "light": $gray-400, +// "lighter": $gray-200, +// "gray-dark": $gray-800 +// ), $colors); -$default: #172b4d !default; -$primary: #5e72e4 !default; -$secondary: #f7fafc !default; -$success: $green !default; -$info: $teal !default; -$warning: $orange !default; -$danger: $red !default; -$light: $gray-500 !default; -$dark: $gray-900 !default; -$darker: darken($gray-900, 15%) !default; +// $default: #172b4d !default; +// $primary: #5e72e4 !default; +// $secondary: #f7fafc !default; +// $success: $green !default; +// $info: $teal !default; +// $warning: $orange !default; +// $danger: $red !default; +// $light: $gray-500 !default; +// $dark: $gray-900 !default; +// $darker: darken($gray-900, 15%) !default; -$facebook: #3b5999 !default; -$twitter: #1da1f2 !default; -$google-plus: #dd4b39 !default; -$instagram: #e4405f !default; -$pinterest: #bd081c !default; -$youtube: #cd201f !default; -$slack: #3aaf85 !default; -$dribbble: #ea4c89 !default; -$github: #222222 !default; +// $facebook: #3b5999 !default; +// $twitter: #1da1f2 !default; +// $google-plus: #dd4b39 !default; +// $instagram: #e4405f !default; +// $pinterest: #bd081c !default; +// $youtube: #cd201f !default; +// $slack: #3aaf85 !default; +// $dribbble: #ea4c89 !default; +// $github: #222222 !default; -$theme-colors: () !default; -$theme-colors: map-merge(( - "default": $default, - "primary": $primary, - "secondary": $secondary, - "success": $success, - "info": $info, - "warning": $warning, - "danger": $danger, - "white": $white, - "neutral": $white, - "dark": $dark, - "darker": $darker -), $theme-colors); +// $theme-colors: () !default; +// $theme-colors: map-merge(( +// "default": $default, +// "primary": $primary, +// "secondary": $secondary, +// "success": $success, +// "info": $info, +// "warning": $warning, +// "danger": $danger, +// "white": $white, +// "neutral": $white, +// "dark": $dark, +// "darker": $darker +// ), $theme-colors); -$brand-colors: () !default; -$brand-colors: map-merge(( - "facebook": $facebook, - "twitter": $twitter, - "google-plus": $google-plus, - "instagram": $instagram, - "pinterest": $pinterest, - "youtube": $youtube, - "slack": $slack, - "dribbble": $dribbble, - "github": $github -), $brand-colors); +// $brand-colors: () !default; +// $brand-colors: map-merge(( +// "facebook": $facebook, +// "twitter": $twitter, +// "google-plus": $google-plus, +// "instagram": $instagram, +// "pinterest": $pinterest, +// "youtube": $youtube, +// "slack": $slack, +// "dribbble": $dribbble, +// "github": $github +// ), $brand-colors); -$shape-colors: () !default; -$shape-colors: map-merge(( - "default": #32325d, - "primary": #5533ff, - "secondary": #24b47e, - "neutral": #e9ecef, - "blue-gray": #b2cbe1, +// $shape-colors: () !default; +// $shape-colors: map-merge(( +// "default": #32325d, +// "primary": #5533ff, +// "secondary": #24b47e, +// "neutral": #e9ecef, +// "blue-gray": #b2cbe1, -), $shape-colors); +// ), $shape-colors); -$shapes-primary-colors: () !default; -$shapes-primary-colors: map-merge(( - "step-1-gradient-bg": #281483, - "step-2-gradient-bg": #8f6ed5, - "step-3-gradient-bg": #d782d9, - "span-1-bg": #53f, - "span-2-bg": #4553ff, - "span-3-bg": #4f40ff, - "span-4-bg": #25ddf5, - "span-5-bg": #1fa2ff -), $shapes-primary-colors); +// $shapes-primary-colors: () !default; +// $shapes-primary-colors: map-merge(( +// "step-1-gradient-bg": #281483, +// "step-2-gradient-bg": #8f6ed5, +// "step-3-gradient-bg": #d782d9, +// "span-1-bg": #53f, +// "span-2-bg": #4553ff, +// "span-3-bg": #4f40ff, +// "span-4-bg": #25ddf5, +// "span-5-bg": #1fa2ff +// ), $shapes-primary-colors); -$shapes-default-colors: () !default; -$shapes-default-colors: map-merge(( - "step-1-gradient-bg": #7795f8, - "step-2-gradient-bg": #6772e5, - "step-3-gradient-bg": #555abf, - "span-1-bg": #7795f8, - "span-2-bg": #7b9aff, - "span-3-bg": #6f8ff8, - "span-4-bg": #76eea7, - "span-5-bg": #6adaff -), $shapes-default-colors); +// $shapes-default-colors: () !default; +// $shapes-default-colors: map-merge(( +// "step-1-gradient-bg": #7795f8, +// "step-2-gradient-bg": #6772e5, +// "step-3-gradient-bg": #555abf, +// "span-1-bg": #7795f8, +// "span-2-bg": #7b9aff, +// "span-3-bg": #6f8ff8, +// "span-4-bg": #76eea7, +// "span-5-bg": #6adaff +// ), $shapes-default-colors); -$shapes-light-colors: () !default; -$shapes-light-colors: map-merge(( - "step-1-gradient-bg": #b2cbe1, - "step-2-gradient-bg": #f6f9fc, - "step-3-gradient-bg": #f6f9fc, - "span-1-bg": #b4cce1, - "span-2-bg": #c5dbef, - "span-3-bg": #b9d5ed, - "span-4-bg": #74e4a2, - "span-5-bg": #008169 -), $shapes-light-colors); +// $shapes-light-colors: () !default; +// $shapes-light-colors: map-merge(( +// "step-1-gradient-bg": #b2cbe1, +// "step-2-gradient-bg": #f6f9fc, +// "step-3-gradient-bg": #f6f9fc, +// "span-1-bg": #b4cce1, +// "span-2-bg": #c5dbef, +// "span-3-bg": #b9d5ed, +// "span-4-bg": #74e4a2, +// "span-5-bg": #008169 +// ), $shapes-light-colors); -$shapes-dark-colors: () !default; -$shapes-dark-colors: map-merge(( - "step-1-gradient-bg": #32325d, - "step-2-gradient-bg": #32325d, - "step-3-gradient-bg": #32325d, - "span-1-bg": #2e2e57, - "span-2-bg": #2b2b58, - "span-3-bg": #25254d, - "span-4-bg": #d782d9, - "span-5-bg": #008169 -), $shapes-dark-colors); +// $shapes-dark-colors: () !default; +// $shapes-dark-colors: map-merge(( +// "step-1-gradient-bg": #32325d, +// "step-2-gradient-bg": #32325d, +// "step-3-gradient-bg": #32325d, +// "span-1-bg": #2e2e57, +// "span-2-bg": #2b2b58, +// "span-3-bg": #25254d, +// "span-4-bg": #d782d9, +// "span-5-bg": #008169 +// ), $shapes-dark-colors); +// // Translucent color variations +// $translucent-color-opacity: .6 !default; -// Translucent color variations -$translucent-color-opacity: .6 !default; +// // Set a specific jump point for requesting color jumps +// $theme-color-interval: 8% !default; -// Set a specific jump point for requesting color jumps -$theme-color-interval: 8% !default; +// // The yiq lightness value that determines when the lightness of color changes +// from "dark" to "light". Acceptable values are between 0 and 255. +// $yiq-contrasted-threshold: 200 !default; -// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255. -$yiq-contrasted-threshold: 200 !default; +// // Customize the light and dark text colors for use in our YIQ color contrast function. +// $yiq-text-dark: $gray-900 !default; +// $yiq-text-light: $white !default; -// Customize the light and dark text colors for use in our YIQ color contrast function. -$yiq-text-dark: $gray-900 !default; -$yiq-text-light: $white !default; +// // Action colors -// Action colors - -$star-rating-color: $gray-400 !default; -$star-rating-color-active: $yellow !default; - -$favorite-color: $yellow !default; -$like-color: $blue !default; -$love-color: $red !default; +// $star-rating-color: $gray-400 !default; +// $star-rating-color-active: $yellow !default; +// $favorite-color: $yellow !default; +// $like-color: $blue !default; +// $love-color: $red !default; // Body +@import "gradido-custom/body"; - -$body-bg: #f8f9fe !default; -$body-color: $gray-700 !default; - - +// $body-bg: #f8f9fe !default; +// $body-color: $gray-700 !default; // Sections +@import "gradido-custom/sections"; -$section-colors: () !default; -$section-colors: map-merge(( - "primary": $body-bg, - "secondary": $secondary, - "light": $gray-400, - "dark": $dark, - "darker": $darker -), $section-colors); +// $section-colors: () !default; +// $section-colors: map-merge(( +// "primary": $body-bg, +// "secondary": $secondary, +// "light": $gray-400, +// "dark": $dark, +// "darker": $darker +// ), $section-colors); // Links +@import "gradido-custom/links"; -$link-color: $primary !default; -$link-decoration: none !default; -$link-hover-color: darken($link-color, 15%) !default; -$link-hover-decoration: none !default; +// $link-color: $primary !default; +// $link-decoration: none !default; +// $link-hover-color: darken($link-color, 15%) !default; +// $link-hover-decoration: none !default; // Grid breakpoints +@import "gradido-custom/grid-breakpoint"; -$grid-breakpoints: ( - xs: 0, - sm: 576px, - md: 768px, - lg: 992px, - xl: 1200px -); - -@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); -@include _assert-starts-at-zero($grid-breakpoints); - - -// Grid containers -// -// Define the maximum width of `.container` for different screen sizes. +// $grid-breakpoints: ( +// xs: 0, +// sm: 576px, +// md: 768px, +// lg: 992px, +// xl: 1200px +// ); +// @include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +// @include _assert-starts-at-zero($grid-breakpoints); +// // Grid containers +// // +// // Define the maximum width of `.container` for different screen sizes. // Spacing +@import "gradido-custom/spacing"; -$spacer: 1rem !default; -$spacers: () !default; -$spacers: map-merge(( - -9: -($spacer * 10), - -8: -($spacer * 8), - -7: -($spacer * 6), - -6: -($spacer * 4.5), - -5: -($spacer * 3), - -4: -($spacer * 1.5), - -3: -$spacer, - -2: -($spacer * .5), - -1: -($spacer * .25), - 0: 0, - 1: ($spacer * .25), - 2: ($spacer * .5), - 3: $spacer, - 4: ($spacer * 1.5), - 5: ($spacer * 3), - 6: ($spacer * 4.5), - 7: ($spacer * 6), - 8: ($spacer * 8), - 9: ($spacer * 10) -), $spacers); +// $spacer: 1rem !default; +// $spacers: () !default; +// $spacers: map-merge(( +// -9: -($spacer * 10), +// -8: -($spacer * 8), +// -7: -($spacer * 6), +// -6: -($spacer * 4.5), +// -5: -($spacer * 3), +// -4: -($spacer * 1.5), +// -3: -$spacer, +// -2: -($spacer * .5), +// -1: -($spacer * .25), +// 0: 0, +// 1: ($spacer * .25), +// 2: ($spacer * .5), +// 3: $spacer, +// 4: ($spacer * 1.5), +// 5: ($spacer * 3), +// 6: ($spacer * 4.5), +// 7: ($spacer * 6), +// 8: ($spacer * 8), +// 9: ($spacer * 10) +// ), $spacers); +// // This variable affects the `.h-*` and `.w-*` classes. -// This variable affects the `.h-*` and `.w-*` classes. - -$sizes: () !default; -$sizes: map-merge(( - 25: 25%, - 50: 50%, - 75: 75%, - 100: 100% -), $sizes); +// $sizes: () !default; +// $sizes: map-merge(( +// 25: 25%, +// 50: 50%, +// 75: 75%, +// 100: 100% +// ), $sizes); // Components +@import "gradido-custom/components"; -$shape-height-xl: 1.5 !default; -$shape-height-lg: 1.5 !default; -$shape-height-sm: 1.5 !default; +// $shape-height-xl: 1.5 !default; +// $shape-height-lg: 1.5 !default; +// $shape-height-sm: 1.5 !default; -$border-width: 1px !default; -$border-color: $gray-200 !default; +// $border-width: 1px !default; +// $border-color: $gray-200 !default; -$border-radius: .375rem !default; -$border-radius-xl: .5rem !default; -$border-radius-lg: .4375rem !default; -$border-radius-sm: .25rem !default; +// $border-radius: .375rem !default; +// $border-radius-xl: .5rem !default; +// $border-radius-lg: .4375rem !default; +// $border-radius-sm: .25rem !default; -$box-shadow-sm: 0 0 .5rem rgba($gray-600, .075) !default; -$box-shadow: 0 0 2rem 0 rgba($gray-600, .15) !default; -$box-shadow-lg: 0 0 3rem rgba($gray-600, .175) !default; +// $box-shadow-sm: 0 0 .5rem rgba($gray-600, .075) !default; +// $box-shadow: 0 0 2rem 0 rgba($gray-600, .15) !default; +// $box-shadow-lg: 0 0 3rem rgba($gray-600, .175) !default; -$component-active-color: $white !default; -$component-active-bg: theme-color("primary") !default; -$component-active-border-color: theme-color("primary") !default; +// $component-active-color: $white !default; +// $component-active-bg: theme-color("primary") !default; +// $component-active-border-color: theme-color("primary") !default; -$component-hover-color: $gray-300 !default; -$component-hover-bg: $gray-300 !default; -$component-hover-border-color: $gray-300 !default; +// $component-hover-color: $gray-300 !default; +// $component-hover-bg: $gray-300 !default; +// $component-hover-border-color: $gray-300 !default; -$caret-width: .3em !default; - -$transition-base: all .15s ease !default; -$transition-fade: opacity .15s linear !default; -$transition-collapse: height .35s ease !default; +// $caret-width: .3em !default; +// $transition-base: all .15s ease !default; +// $transition-fade: opacity .15s linear !default; +// $transition-collapse: height .35s ease !default; // Fonts +@import "gradido-custom/fonts"; -$font-family-sans-serif: Open Sans, sans-serif !default; -$font-family-base: $font-family-sans-serif !default; +// $font-family-sans-serif: Open Sans, sans-serif !default; +// $font-family-base: $font-family-sans-serif !default; -$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` -$font-size-xl: ($font-size-base * 1.5); -$font-size-lg: ($font-size-base * 1.25); -$font-size-sm: ($font-size-base * .875); -$font-size-xs: ($font-size-base * .75); +// $font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +// $font-size-xl: ($font-size-base * 1.5); +// $font-size-lg: ($font-size-base * 1.25); +// $font-size-sm: ($font-size-base * .875); +// $font-size-xs: ($font-size-base * .75); -$font-weight-light: 300 !default; -$font-weight-normal: 400 !default; -$font-weight-bold: 600 !default; -$font-weight-extra-bold: 700 !default; +// $font-weight-light: 300 !default; +// $font-weight-normal: 400 !default; +// $font-weight-bold: 600 !default; +// $font-weight-extra-bold: 700 !default; -$font-weight-base: $font-weight-normal !default; -$line-height-base: 1.5 !default; -$shape-height-base: 1.5 !default; +// $font-weight-base: $font-weight-normal !default; +// $line-height-base: 1.5 !default; +// $shape-height-base: 1.5 !default; +// $h1-font-size: $font-size-base * 1.625 !default; +// $h2-font-size: $font-size-base * 1.25 !default; +// $h3-font-size: $font-size-base * 1.0625 !default; +// $h4-font-size: $font-size-base * .9375 !default; +// $h5-font-size: $font-size-base * .8125 !default; +// $h6-font-size: $font-size-base * .625 !default; -$h1-font-size: $font-size-base * 1.625 !default; -$h2-font-size: $font-size-base * 1.25 !default; -$h3-font-size: $font-size-base * 1.0625 !default; -$h4-font-size: $font-size-base * .9375 !default; -$h5-font-size: $font-size-base * .8125 !default; -$h6-font-size: $font-size-base * .625 !default; +// $headings-margin-bottom: ($spacer / 2); +// $headings-font-family: inherit !default; +// $headings-font-weight: $font-weight-bold !default; +// $headings-line-height: 1.5 !default; +// $headings-color: $gray-800 !default; +// $heading-letter-spacing: .025em !default; +// $heading-font-size: .95rem !default; +// $heading-text-transform: uppercase !default; +// $heading-font-weight: $headings-font-weight !default; -$headings-margin-bottom: ($spacer / 2); -$headings-font-family: inherit !default; -$headings-font-weight: $font-weight-bold !default; -$headings-line-height: 1.5 !default; -$headings-color: $gray-800 !default; +// $heading-title-letter-spacing: .025em !default; +// $heading-title-font-size: 1.375rem !default; +// $heading-title-font-weight: $font-weight-bold !default; +// $heading-title-text-transform: uppercase !default; -$heading-letter-spacing: .025em !default; -$heading-font-size: .95rem !default; -$heading-text-transform: uppercase !default; -$heading-font-weight: $headings-font-weight !default; +// $heading-section-letter-spacing: .025em !default; +// $heading-section-font-size: 1.375rem !default; +// $heading-section-font-weight: $font-weight-bold !default; +// $heading-section-text-transform: uppercase !default; -$heading-title-letter-spacing: .025em !default; -$heading-title-font-size: 1.375rem !default; -$heading-title-font-weight: $font-weight-bold !default; -$heading-title-text-transform: uppercase !default; +// $display1-size: 3.3rem !default; +// $display2-size: 2.75rem !default; +// $display3-size: 2.1875rem !default; +// $display4-size: 1.6275rem !default; -$heading-section-letter-spacing: .025em !default; -$heading-section-font-size: 1.375rem !default; -$heading-section-font-weight: $font-weight-bold !default; -$heading-section-text-transform: uppercase !default; +// $display1-weight: $font-weight-bold !default; +// $display2-weight: $font-weight-bold !default; +// $display3-weight: $font-weight-bold !default; +// $display4-weight: $font-weight-bold !default; +// $display-line-height: $headings-line-height !default; -$display1-size: 3.3rem !default; -$display2-size: 2.75rem !default; -$display3-size: 2.1875rem !default; -$display4-size: 1.6275rem !default; +// $paragraph-font-size: 1rem !default; +// $paragraph-font-weight: 300 !default; +// $paragraph-line-height: 1.7 !default; -$display1-weight: $font-weight-bold !default; -$display2-weight: $font-weight-bold !default; -$display3-weight: $font-weight-bold !default; -$display4-weight: $font-weight-bold !default; -$display-line-height: $headings-line-height !default; +// $lead-font-size: ($paragraph-font-size * 1.25) !default; +// $lead-font-weight: 300 !default; -$paragraph-font-size: 1rem !default; -$paragraph-font-weight: 300 !default; -$paragraph-line-height: 1.7 !default; +// $small-font-size: 80% !default; -$lead-font-size: ($paragraph-font-size * 1.25) !default; -$lead-font-weight: 300 !default; +// $text-muted: $gray-600 !default; -$small-font-size: 80% !default; +// $blockquote-small-color: $gray-600 !default; +// $blockquote-font-size: ($font-size-base * 1.25) !default; -$text-muted: $gray-600 !default; +// $hr-border-color: rgba($black, .1); +// $hr-border-width: $border-width !default; -$blockquote-small-color: $gray-600 !default; -$blockquote-font-size: ($font-size-base * 1.25) !default; +// $mark-padding: .2em !default; -$hr-border-color: rgba($black, .1); -$hr-border-width: $border-width !default; +// $dt-font-weight: $font-weight-bold !default; -$mark-padding: .2em !default; +// $list-inline-padding: .5rem !default; -$dt-font-weight: $font-weight-bold !default; - -$list-inline-padding: .5rem !default; - -$mark-bg: #fcf8e3 !default; - -$hr-margin-y: $spacer * 2 !default; +// $mark-bg: #fcf8e3 !default; +// $hr-margin-y: $spacer * 2 !default; // Icons +@import "gradido-custom/icons"; -$icon-size: 3rem !default; -$icon-size-xl: 5rem !default; -$icon-size-lg: 4rem !default; -$icon-size-sm: 2rem !default; - +// $icon-size: 3rem !default; +// $icon-size-xl: 5rem !default; +// $icon-size-lg: 4rem !default; +// $icon-size-sm: 2rem !default; // Tables +@import "gradido-custom/tables"; -$table-cell-padding: 1rem !default; -$table-cell-padding-sm: .5rem !default; +// $table-cell-padding: 1rem !default; +// $table-cell-padding-sm: .5rem !default; -$table-bg: transparent !default; -$table-accent-bg: rgba($black, .05) !default; -$table-hover-bg: $gray-100 !default; -$table-active-bg: $table-hover-bg !default; +// $table-bg: transparent !default; +// $table-accent-bg: rgba($black, .05) !default; +// $table-hover-bg: $gray-100 !default; +// $table-active-bg: $table-hover-bg !default; -$table-border-width: $border-width !default; -$table-border-color: $gray-200 !default; +// $table-border-width: $border-width !default; +// $table-border-color: $gray-200 !default; -$table-head-bg: $gray-100 !default; -$table-head-color: $gray-600 !default; -$table-head-spacer-y: .75rem !default; +// $table-head-bg: $gray-100 !default; +// $table-head-color: $gray-600 !default; +// $table-head-spacer-y: .75rem !default; -$table-head-font-size: .65rem !default; -$table-head-font-weight: $font-weight-bold !default; -$table-head-text-transform: uppercase !default; -$table-head-letter-spacing: 1px !default; +// $table-head-font-size: .65rem !default; +// $table-head-font-weight: $font-weight-bold !default; +// $table-head-text-transform: uppercase !default; +// $table-head-letter-spacing: 1px !default; -$table-body-font-size: .8125rem !default; +// $table-body-font-size: .8125rem !default; -$table-dark-bg: theme-color("default") !default; -$table-dark-accent-bg: rgba($white, .05) !default; -$table-dark-hover-bg: rgba($white, .075) !default; -$table-dark-border-color: lighten(theme-color("default"), 7%) !default; -$table-dark-color: $body-bg !default; +// $table-dark-bg: theme-color("default") !default; +// $table-dark-accent-bg: rgba($white, .05) !default; +// $table-dark-hover-bg: rgba($white, .075) !default; +// $table-dark-border-color: lighten(theme-color("default"), 7%) !default; +// $table-dark-color: $body-bg !default; -$table-dark-head-bg: lighten(theme-color("default"), 4%) !default; -$table-dark-head-color: lighten(theme-color("default"), 35%) !default; +// $table-dark-head-bg: lighten(theme-color("default"), 4%) !default; +// $table-dark-head-color: lighten(theme-color("default"), 35%) !default; // Buttons + Forms +@import "gradido-custom/buttons-forms"; -$input-btn-padding-y: .625rem !default; -$input-btn-padding-x: .75rem !default; -$input-btn-line-height: $shape-height-base !default; +// $input-btn-padding-y: .625rem !default; +// $input-btn-padding-x: .75rem !default; +// $input-btn-line-height: $shape-height-base !default; -$input-btn-focus-width: 0 !default; -$input-btn-focus-color: rgba($component-active-bg, 1) !default; -$input-btn-focus-box-shadow: none !default; +// $input-btn-focus-width: 0 !default; +// $input-btn-focus-color: rgba($component-active-bg, 1) !default; +// $input-btn-focus-box-shadow: none !default; -$input-btn-padding-y-sm: .25rem !default; -$input-btn-padding-x-sm: .5rem !default; -$input-btn-line-height-sm: $shape-height-sm !default; +// $input-btn-padding-y-sm: .25rem !default; +// $input-btn-padding-x-sm: .5rem !default; +// $input-btn-line-height-sm: $shape-height-sm !default; -$input-btn-padding-y-lg: .875rem !default; -$input-btn-padding-x-lg: 1rem !default; -$input-btn-line-height-lg: $shape-height-lg !default; +// $input-btn-padding-y-lg: .875rem !default; +// $input-btn-padding-x-lg: 1rem !default; +// $input-btn-line-height-lg: $shape-height-lg !default; -$input-btn-border-width: 1px !default; +// $input-btn-border-width: 1px !default; -$input-btn-font-size-sm: .75rem !default; -$input-btn-font-size: .875rem !default; -$input-btn-font-size-lg: .875rem !default; +// $input-btn-font-size-sm: .75rem !default; +// $input-btn-font-size: .875rem !default; +// $input-btn-font-size-lg: .875rem !default; // Buttons +@import "gradido-custom/buttons"; -$btn-padding-y: $input-btn-padding-y !default; -$btn-padding-x: $input-btn-padding-x + 0.5 !default; -$btn-line-height: $input-btn-line-height !default; +// $btn-padding-y: $input-btn-padding-y !default; +// $btn-padding-x: $input-btn-padding-x + 0.5 !default; +// $btn-line-height: $input-btn-line-height !default; -$btn-padding-y-sm: $input-btn-padding-y-sm !default; -$btn-padding-x-sm: $input-btn-padding-x-sm !default; -$btn-line-height-sm: $input-btn-line-height-sm !default; +// $btn-padding-y-sm: $input-btn-padding-y-sm !default; +// $btn-padding-x-sm: $input-btn-padding-x-sm !default; +// $btn-line-height-sm: $input-btn-line-height-sm !default; -$btn-padding-y-lg: $input-btn-padding-y-lg !default; -$btn-padding-x-lg: $input-btn-padding-x-lg !default; -$btn-line-height-lg: $input-btn-line-height-lg !default; +// $btn-padding-y-lg: $input-btn-padding-y-lg !default; +// $btn-padding-x-lg: $input-btn-padding-x-lg !default; +// $btn-line-height-lg: $input-btn-line-height-lg !default; -$btn-border-width: $input-btn-border-width !default; +// $btn-border-width: $input-btn-border-width !default; -$btn-font-weight: 600 !default; +// $btn-font-weight: 600 !default; -$btn-text-transform: none !default; +// $btn-text-transform: none !default; +// $btn-letter-spacing: .025em !default; +// $btn-box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08) !default; +// $btn-hover-box-shadow: 0 7px 14px rgba(50,50,93,.1), 0 3px 6px rgba(0,0,0,.08) !default; +// $btn-focus-box-shadow: $btn-hover-box-shadow !default; +// $btn-focus-width: $input-btn-focus-width !default; +// $btn-active-box-shadow: none !default; -$btn-letter-spacing: .025em !default; -$btn-box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08) !default; -$btn-hover-box-shadow: 0 7px 14px rgba(50,50,93,.1), 0 3px 6px rgba(0,0,0,.08) !default; -$btn-focus-box-shadow: $btn-hover-box-shadow !default; -$btn-focus-width: $input-btn-focus-width !default; -$btn-active-box-shadow: none !default; +// $btn-hover-translate-y: -1px !default; -$btn-hover-translate-y: -1px !default; +// Input +@import "gradido-custom/input"; -// Forms +// $input-padding-y: $input-btn-padding-y !default; +// $input-padding-x: $input-btn-padding-x !default; +// $input-line-height: $input-btn-line-height !default; -$input-padding-y: $input-btn-padding-y !default; -$input-padding-x: $input-btn-padding-x !default; -$input-line-height: $input-btn-line-height !default; +// $input-padding-y-sm: $input-btn-padding-y-sm !default; +// $input-padding-x-sm: $input-btn-padding-x-sm !default; +// $input-line-height-sm: $input-btn-line-height-sm !default; -$input-padding-y-sm: $input-btn-padding-y-sm !default; -$input-padding-x-sm: $input-btn-padding-x-sm !default; -$input-line-height-sm: $input-btn-line-height-sm !default; +// $input-padding-y-lg: $input-btn-padding-y-lg !default; +// $input-padding-x-lg: $input-btn-padding-x-lg !default; +// $input-line-height-lg: $input-btn-line-height-lg !default; -$input-padding-y-lg: $input-btn-padding-y-lg !default; -$input-padding-x-lg: $input-btn-padding-x-lg !default; -$input-line-height-lg: $input-btn-line-height-lg !default; +// $input-border-radius: $border-radius !default; +// $input-border-radius-xl: $border-radius-xl !default; +// $input-border-radius-lg: $border-radius-lg !default; +// $input-border-radius-sm: $border-radius-sm !default; -$input-border-radius: $border-radius !default; -$input-border-radius-xl: $border-radius-xl !default; -$input-border-radius-lg: $border-radius-lg !default; -$input-border-radius-sm: $border-radius-sm !default; +// $input-bg: $white !default; +// $input-disabled-bg: $gray-200 !default; -$input-bg: $white !default; -$input-disabled-bg: $gray-200 !default; +// $input-muted-bg: #F7FAFE !default; +// $input-focus-muted-bg: lighten($input-muted-bg, 1%) !default; -$input-muted-bg: #F7FAFE !default; -$input-focus-muted-bg: lighten($input-muted-bg, 1%) !default; +// $input-alternative-box-shadow: 0 1px 3px rgba(50,50,93,.15), 0 1px 0 rgba(0,0,0,.02) !default; +// $input-focus-alternative-box-shadow: 0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08) !default; -$input-alternative-box-shadow: 0 1px 3px rgba(50,50,93,.15), 0 1px 0 rgba(0,0,0,.02) !default; -$input-focus-alternative-box-shadow: 0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08) !default; +// $input-color: $gray-600 !default; +// $input-border-color: #cad1d7 !default; +// $input-border-width: $input-btn-border-width !default; +// $input-box-shadow: none !default; // 0 1px 3px 0 $gray-400 !default; -$input-color: $gray-600 !default; -$input-border-color: #cad1d7 !default; -$input-border-width: $input-btn-border-width !default; -$input-box-shadow: none !default; // 0 1px 3px 0 $gray-400 !default; +// $input-focus-bg: $white !default; +// $input-focus-border-color: rgba(50,151,211,.25) !default; +// $input-focus-color: $input-color !default; +// $input-focus-width: 0 !default; +// $input-focus-box-shadow: none !default; //0 1px 3px 0 $gray-500 !default; -$input-focus-bg: $white !default; -$input-focus-border-color: rgba(50,151,211,.25) !default; -$input-focus-color: $input-color !default; -$input-focus-width: 0 !default; -$input-focus-box-shadow: none !default; //0 1px 3px 0 $gray-500 !default; +// $input-placeholder-color: $gray-500 !default; +// $input-focus-placeholder-color: $gray-500 !default; -$input-placeholder-color: $gray-500 !default; -$input-focus-placeholder-color: $gray-500 !default; - -$input-height-border: $input-border-width * 2 !default; - -$input-transition: all .2s cubic-bezier(0.68, -0.55, 0.265, 1.55) !default; +// $input-height-border: $input-border-width * 2 !default; +// $input-transition: all .2s cubic-bezier(0.68, -0.55, 0.265, 1.55) !default; // Input groups +@import "gradido-custom/input-groups"; -$input-group-addon-color: $input-placeholder-color !default; -$input-group-addon-bg: $input-bg !default; -$input-group-addon-border-color: $input-border-color !default; - -$input-group-addon-focus-color: $input-focus-color !default; -$input-group-addon-focus-bg: $input-focus-bg !default; -$input-group-addon-focus-border-color: $input-focus-border-color !default; +// $input-group-addon-color: $input-placeholder-color !default; +// $input-group-addon-bg: $input-bg !default; +// $input-group-addon-border-color: $input-border-color !default; +// $input-group-addon-focus-color: $input-focus-color !default; +// $input-group-addon-focus-bg: $input-focus-bg !default; +// $input-group-addon-focus-border-color: $input-focus-border-color !default; // Form group +@import "gradido-custom/form-groups"; -$form-group-margin-bottom: 1.5rem !default; - +// $form-group-margin-bottom: 1.5rem !default; // Custom forms +@import "gradido-custom/custom-forms"; -$custom-control-gutter: 1.75rem !default; -$custom-control-spacer-x: 1rem !default; -$custom-control-indicator-size: 1.25rem !default; +// custom-control-gutter: 1.75rem !default; +// custom-control-spacer-x: 1rem !default; +// custom-control-indicator-size: 1.25rem !default; -$custom-control-indicator-bg: $input-bg !default; -$custom-control-indicator-border-width: 1px !default; -$custom-control-indicator-border-color: $input-border-color !default; -$custom-control-indicator-box-shadow: none !default; +// custom-control-indicator-bg: $input-bg !default; +// custom-control-indicator-border-width: 1px !default; +// custom-control-indicator-border-color: $input-border-color !default; +// custom-control-indicator-box-shadow: none !default; -$custom-control-indicator-focus-box-shadow: $custom-control-indicator-box-shadow !default; +// custom-control-indicator-focus-box-shadow: $custom-control-indicator-box-shadow !default; -$custom-control-indicator-hover-color: $component-hover-color !default; -$custom-control-indicator-hover-bg: $component-hover-bg !default; -$custom-control-indicator-hover-border-color: $component-hover-border-color !default; +// custom-control-indicator-hover-color: $component-hover-color !default; +// custom-control-indicator-hover-bg: $component-hover-bg !default; +// custom-control-indicator-hover-border-color: $component-hover-border-color !default; -$custom-control-indicator-active-color: $component-active-color !default; -$custom-control-indicator-active-bg: $component-active-bg !default; -$custom-control-indicator-active-border-color: $component-active-border-color !default; -$custom-control-indicator-active-box-shadow: $custom-control-indicator-box-shadow !default; +// custom-control-indicator-active-color: $component-active-color !default; +// custom-control-indicator-active-bg: $component-active-bg !default; +// custom-control-indicator-active-border-color: $component-active-border-color !default; +// custom-control-indicator-active-box-shadow: $custom-control-indicator-box-shadow !default; -$custom-control-indicator-checked-color: $component-active-color !default; -$custom-control-indicator-checked-bg: $component-active-bg !default; -$custom-control-indicator-checked-border-color: $component-active-border-color !default; -$custom-control-indicator-checked-box-shadow: $custom-control-indicator-box-shadow !default; -$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default; +// custom-control-indicator-checked-color: $component-active-color !default; +// custom-control-indicator-checked-bg: $component-active-bg !default; +// custom-control-indicator-checked-border-color: $component-active-border-color !default; +// custom-control-indicator-checked-box-shadow: $custom-control-indicator-box-shadow !default; +// custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default; -$custom-control-indicator-disabled-bg: $gray-200 !default; -$custom-control-label-disabled-color: $gray-600 !default; +// custom-control-indicator-disabled-bg: $gray-200 !default; +// custom-control-label-disabled-color: $gray-600 !default; -$custom-checkbox-indicator-border-radius: $border-radius-sm !default; -//$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml !default;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default; +// custom-checkbox-indicator-border-radius: $border-radius-sm !default; +// //$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml !default;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default; // Custom toggle +@import "gradido-custom/custom-toogle"; -$custom-toggle-width: 50px !default; -$custom-toggle-slider-bg: $gray-200 !default; -$custom-toggle-checked-bg: theme-color("primary") !default; +// $custom-toggle-width: 50px !default; +// $custom-toggle-slider-bg: $gray-200 !default; +// $custom-toggle-checked-bg: theme-color("primary") !default; // Form validation +@import "gradido-custom/form-validation"; -$form-feedback-valid-bg: lighten($success, 15%) !default; -$form-feedback-valid-color: theme-color("success") !default; -$form-feedback-invalid-bg: lighten($warning, 15%) !default; -$form-feedback-invalid-color: theme-color("warning") !default; - +// $form-feedback-valid-bg: lighten($success, 15%) !default; +// $form-feedback-valid-color: theme-color("success") !default; +// $form-feedback-invalid-bg: lighten($warning, 15%) !default; +// $form-feedback-invalid-color: theme-color("warning") !default; // Allows for customizing button radius independently from global border radius -$btn-border-radius: $input-border-radius !default; -$btn-border-radius-xl: $input-border-radius-xl !default; -$btn-border-radius-lg: $input-border-radius-lg !default; -$btn-border-radius-sm: $input-border-radius !default; - - - -$chart-height: 350px !default; -$chart-height-sm: 230px !default; - -$chart-legend-margin-top: 2.5rem !default; -$chart-legend-font-size: $font-size-sm !default; -$chart-legend-color: $text-muted !default; -$chart-legend-height: $chart-legend-margin-top + $chart-legend-font-size * $line-height-base !default; +$btn-border-radius: $input-border-radius !default; +$btn-border-radius-xl: $input-border-radius-xl !default; +$btn-border-radius-lg: $input-border-radius-lg !default; +$btn-border-radius-sm: $input-border-radius !default; +// Chart +@import "gradido-custom/chart"; +// $chart-height: 350px !default; +// $chart-height-sm: 230px !default; +// $chart-legend-margin-top: 2.5rem !default; +// $chart-legend-font-size: $font-size-sm !default; +// $chart-legend-color: $text-muted !default; +// $chart-legend-height: $chart-legend-margin-top + $chart-legend-font-size * $line-height-base !default; // Map -$map-height: 500px !default; +@import "gradido-custom/map"; +// $map-height: 500px !default; // No UI Slider +@import "gradido-custom/nouislider"; -$noui-target-bg: #eceeef !default; -$noui-target-thickness: 5px !default; -$noui-target-border-radius: 5px !default; -$noui-target-border-color: 0 !default; -$noui-target-box-shadow: inset 0 1px 2px rgba(90,97,105,.1) !default; +// $noui-target-bg: #eceeef !default; +// $noui-target-thickness: 5px !default; +// $noui-target-border-radius: 5px !default; +// $noui-target-border-color: 0 !default; +// $noui-target-box-shadow: inset 0 1px 2px rgba(90,97,105,.1) !default; -$noui-slider-connect-bg: $primary !default; -$noui-slider-connect-disabled-bg: #b2b2b2 !default; +// $noui-slider-connect-bg: $primary !default; +// $noui-slider-connect-disabled-bg: #b2b2b2 !default; -$noui-handle-width: 15px !default; -$noui-handle-bg: theme-color("primary") !default; -$noui-handle-border: 0 !default; -$noui-handle-border-radius: 100% !default; - -$noui-origin-border-radius: 2px !default; +// $noui-handle-width: 15px !default; +// $noui-handle-bg: theme-color("primary") !default; +// $noui-handle-border: 0 !default; +// $noui-handle-border-radius: 100% !default; +// $noui-origin-border-radius: 2px !default; // Dropdown +@import "gradido-custom/dropdown"; -$dropdown-bg: $white !default; -$dropdown-border-width: 0 !default; -$dropdown-border-color: rgba($black, .15) !default; -$dropdown-border-radius: $border-radius-lg !default; -$dropdown-box-shadow: 0 50px 100px rgba(50, 50, 93, .1), 0 15px 35px rgba(50, 50, 93, .15), 0 5px 15px rgba(0, 0, 0, .1) !default; - +// $dropdown-bg: $white !default; +// $dropdown-border-width: 0 !default; +// $dropdown-border-color: rgba($black, .15) !default; +// $dropdown-border-radius: $border-radius-lg !default; +// $dropdown-box-shadow: 0 50px 100px rgba(50, 50, 93, .1), +// 0 15px 35px rgba(50, 50, 93, .15), +// 0 5px 15px rgba(0, 0, 0, .1) !default; // Navs +@import "gradido-custom/navs"; -$nav-link-padding-y: .25rem !default; -$nav-link-padding-x: .75rem !default; -$nav-link-color: $gray-700 !default; -$nav-link-hover-color: theme-color("primary") !default; -$nav-link-disabled-color: $gray-600 !default; +// $nav-link-padding-y: .25rem !default; +// $nav-link-padding-x: .75rem !default; +// $nav-link-color: $gray-700 !default; +// $nav-link-hover-color: theme-color("primary") !default; +// $nav-link-disabled-color: $gray-600 !default; -$nav-pills-padding-y: .75rem !default; -$nav-pills-padding-x: 1rem !default; +// $nav-pills-padding-y: .75rem !default; +// $nav-pills-padding-x: 1rem !default; -$nav-pills-space-x: 1rem !default; +// $nav-pills-space-x: 1rem !default; -$nav-pills-bg: $white !default; -$nav-pills-border-width: 1px !default; -$nav-pills-border-color: theme-color("primary") !default; -$nav-pills-border-radius: $border-radius !default; +// $nav-pills-bg: $white !default; +// $nav-pills-border-width: 1px !default; +// $nav-pills-border-color: theme-color("primary") !default; +// $nav-pills-border-radius: $border-radius !default; -$nav-pills-link-color: theme-color("primary") !default; -$nav-pills-link-hover-color: darken(theme-color("primary"), 5%) !default; -$nav-pills-link-active-color: color-yiq(theme-color("primary")) !default; -$nav-pills-link-active-bg: theme-color("primary") !default; -$nav-pills-box-shadow: $btn-box-shadow !default; +// $nav-pills-link-color: theme-color("primary") !default; +// $nav-pills-link-hover-color: darken(theme-color("primary"), 5%) !default; +// $nav-pills-link-active-color: color-yiq(theme-color("primary")) !default; +// $nav-pills-link-active-bg: theme-color("primary") !default; +// $nav-pills-box-shadow: $btn-box-shadow !default; // Navbar +@import "gradido-custom/navbar"; -$navbar-transition: all .15s linear !default; -$navbar-padding-y: 1rem !default; -$navbar-padding-x: 1rem !default; +// $navbar-transition: all .15s linear !default; +// $navbar-padding-y: 1rem !default; +// $navbar-padding-x: 1rem !default; -$navbar-nav-link-padding-x: 1rem !default; -$navbar-nav-link-padding-y: 1rem !default; +// $navbar-nav-link-padding-x: 1rem !default; +// $navbar-nav-link-padding-y: 1rem !default; -$navbar-nav-link-font-size: .9rem !default; -$navbar-nav-link-font-weight: 400 !default; -$navbar-nav-link-text-transform: normal !default; -$navbar-nav-link-letter-spacing: 0 !default; -$navbar-nav-link-border-radius: $border-radius !default; +// $navbar-nav-link-font-size: .9rem !default; +// $navbar-nav-link-font-weight: 400 !default; +// $navbar-nav-link-text-transform: normal !default; +// $navbar-nav-link-letter-spacing: 0 !default; +// $navbar-nav-link-border-radius: $border-radius !default; -$navbar-search-width: 270px !default; -$navbar-search-bg: transparent !default; +// $navbar-search-width: 270px !default; +// $navbar-search-bg: transparent !default; -$navbar-search-border-radius: 2rem !default; -$navbar-search-border-width: 2px !default; +// $navbar-search-border-radius: 2rem !default; +// $navbar-search-border-width: 2px !default; -$navbar-dark-bg: transparent !default; -$navbar-dark-hover-bg: rgba(255, 255, 255, .1) !default; -$navbar-dark-active-bg: rgba(255, 255, 255, .1) !default; -$navbar-dark-color: rgba($white, .95) !default; -$navbar-dark-hover-color: rgba($white, .65) !default; -$navbar-dark-active-color: rgba($white, .65) !default; -$navbar-dark-disabled-color: rgba($white, .25) !default; -$navbar-dark-toggler-border-color: transparent !default; +// $navbar-dark-bg: transparent !default; +// $navbar-dark-hover-bg: rgba(255, 255, 255, .1) !default; +// $navbar-dark-active-bg: rgba(255, 255, 255, .1) !default; +// $navbar-dark-color: rgba($white, .95) !default; +// $navbar-dark-hover-color: rgba($white, .65) !default; +// $navbar-dark-active-color: rgba($white, .65) !default; +// $navbar-dark-disabled-color: rgba($white, .25) !default; +// $navbar-dark-toggler-border-color: transparent !default; -$navbar-search-dark-border-color: rgba(255, 255, 255, .6) !default; -$navbar-search-dark-color: rgba(255, 255, 255, .6) !default; -$navbar-search-dark-focus-border-color: rgba(255, 255, 255, .9) !default; -$navbar-search-dark-focus-color: rgba(255, 255, 255, .9) !default; - -$navbar-light-bg: transparent !default; -$navbar-light-hover-bg: rgba(0, 0, 0, .1) !default; -$navbar-light-active-bg: rgba(0, 0, 0, .1) !default; -$navbar-light-border-color: $gray-100 !default; -$navbar-light-color: rgba($black, .5) !default; -$navbar-light-hover-color: rgba($black, .7) !default; -$navbar-light-active-color: rgba($black, .9) !default; -$navbar-light-disabled-color: rgba($black, .3) !default; -$navbar-light-toggler-border-color: transparent !default; - -$navbar-search-light-border-color: rgba(0, 0, 0, .6) !default; -$navbar-search-light-color: rgba(0, 0, 0, .6) !default; -$navbar-search-light-focus-border-color: rgba(0, 0, 0, .9) !default; -$navbar-search-light-focus-color: rgba(0, 0, 0, .9) !default; +// $navbar-search-dark-border-color: rgba(255, 255, 255, .6) !default; +// $navbar-search-dark-color: rgba(255, 255, 255, .6) !default; +// $navbar-search-dark-focus-border-color: rgba(255, 255, 255, .9) !default; +// $navbar-search-dark-focus-color: rgba(255, 255, 255, .9) !default; +// $navbar-light-bg: transparent !default; +// $navbar-light-hover-bg: rgba(0, 0, 0, .1) !default; +// $navbar-light-active-bg: rgba(0, 0, 0, .1) !default; +// $navbar-light-border-color: $gray-100 !default; +// $navbar-light-color: rgba($black, .5) !default; +// $navbar-light-hover-color: rgba($black, .7) !default; +// $navbar-light-active-color: rgba($black, .9) !default; +// $navbar-light-disabled-color: rgba($black, .3) !default; +// $navbar-light-toggler-border-color: transparent !default; +// $navbar-search-light-border-color: rgba(0, 0, 0, .6) !default; +// $navbar-search-light-color: rgba(0, 0, 0, .6) !default; +// $navbar-search-light-focus-border-color: rgba(0, 0, 0, .9) !default; +// $navbar-search-light-focus-color: rgba(0, 0, 0, .9) !default; // Vertical navbar -$navbar-vertical-box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15) !important; -$navbar-vertical-width: 250px !default; -$navbar-vertical-padding-x: 1.5rem !default; -$navbar-vertical-nav-link-padding-x: 1.5rem !default; -$navbar-vertical-nav-link-padding-y: .65rem !default; +@import "gradido-custom/vertical-navbar"; -$navbar-icon-min-width: 2.25rem !default; - -$navbar-breadcrumb-padding-y: $nav-link-padding-y !default; -$navbar-breadcrumb-padding-x: 0 !default; - -$navbar-light-bg: $white !default; -$navbar-light-border-color: $border-color !default; +// $navbar-vertical-box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15) !important; +// $navbar-vertical-width: 250px !default; +// $navbar-vertical-padding-x: 1.5rem !default; +// $navbar-vertical-nav-link-padding-x: 1.5rem !default; +// $navbar-vertical-nav-link-padding-y: .65rem !default; +// $navbar-icon-min-width: 2.25rem !default; +// $navbar-breadcrumb-padding-y: $nav-link-padding-y !default; +// $navbar-breadcrumb-padding-x: 0 !default; +// $navbar-light-bg: $white !default; +// $navbar-light-border-color: $border-color !default; // Main content +@import "gradido-custom/main-content"; -$main-content-padding-y: 40px !default; -$main-content-padding-x: 24px !default; // in px to combine with $grid-gutter-width - +// $main-content-padding-y: 40px !default; +// $main-content-padding-x: 24px !default; // in px to combine with $grid-gutter-width // Alerts +@import "gradido-custom/alerts"; -$alert-padding-y: 1rem !default; -$alert-padding-x: 1.5rem !default; -$alert-border-radius: $border-radius !default; - -$alert-bg-level: -2 !default; -$alert-border-level: -2 !default; -$alert-color-level: 0 !default; +// $alert-padding-y: 1rem !default; +// $alert-padding-x: 1.5rem !default; +// $alert-border-radius: $border-radius !default; +// $alert-bg-level: -2 !default; +// $alert-border-level: -2 !default; +// $alert-color-level: 0 !default; // List group +@import "gradido-custom/list-group"; -$list-group-bg: $white !default; -$list-group-border-color: $border-color !default; //rgba($black, .125); -$list-group-border-width: $border-width !default; -$list-group-border-radius: $border-radius !default; +// $list-group-bg: $white !default; +// $list-group-border-color: $border-color !default; //rgba($black, .125); +// $list-group-border-width: $border-width !default; +// $list-group-border-radius: $border-radius !default; -$list-group-item-padding-y: 1rem !default; -$list-group-item-padding-x: 1rem !default; +// $list-group-item-padding-y: 1rem !default; +// $list-group-item-padding-x: 1rem !default; -$list-group-hover-bg: $gray-100 !default; -$list-group-active-color: $component-active-color !default; -$list-group-active-bg: $component-active-bg !default; -$list-group-active-border-color: $list-group-active-bg !default; +// $list-group-hover-bg: $gray-100 !default; +// $list-group-active-color: $component-active-color !default; +// $list-group-active-bg: $component-active-bg !default; +// $list-group-active-border-color: $list-group-active-bg !default; -$list-group-disabled-color: $gray-600 !default; -$list-group-disabled-bg: $list-group-bg !default; +// $list-group-disabled-color: $gray-600 !default; +// $list-group-disabled-bg: $list-group-bg !default; -$list-group-action-color: $gray-700 !default; -$list-group-action-hover-color: $list-group-action-color !default; - -$list-group-action-active-color: $list-group-action-color !default; -$list-group-action-active-bg: $gray-200 !default; +// $list-group-action-color: $gray-700 !default; +// $list-group-action-hover-color: $list-group-action-color !default; +// $list-group-action-active-color: $list-group-action-color !default; +// $list-group-action-active-bg: $gray-200 !default; // Close +@import "gradido-custom/close"; -$close-font-size: $font-size-base * 1.5 !default; -$close-font-weight: $font-weight-bold !default; -$close-bg: transparent !default; -$close-hover-bg: transparent !default; -$close-color: rgba(0, 0, 0, .6) !default !default; -$close-hover-color: rgba(0, 0, 0, .9) !default; -$close-text-shadow: none !default; - +// $close-font-size: $font-size-base * 1.5 !default; +// $close-font-weight: $font-weight-bold !default; +// $close-bg: transparent !default; +// $close-hover-bg: transparent !default; +// $close-color: rgba(0, 0, 0, .6) !default !default; +// $close-hover-color: rgba(0, 0, 0, .9) !default; +// $close-text-shadow: none !default; // Popovers +@import "gradido-custom/popovers"; -$popover-font-size: $font-size-sm !default; -$popover-bg: $white !default; -$popover-max-width: 276px !default; -$popover-border-width: 1px !default; -$popover-border-color: rgba($black, .05) !default; -$popover-border-radius: $border-radius-lg !default; -$popover-box-shadow: 0px .5rem 2rem 0px rgba($black, .2) !default; +// $popover-font-size: $font-size-sm !default; +// $popover-bg: $white !default; +// $popover-max-width: 276px !default; +// $popover-border-width: 1px !default; +// $popover-border-color: rgba($black, .05) !default; +// $popover-border-radius: $border-radius-lg !default; +// $popover-box-shadow: 0px .5rem 2rem 0px rgba($black, .2) !default; -$popover-header-bg: $popover-bg !default; -$popover-header-color: $headings-color !default; -$popover-header-padding-y: .5rem !default; -$popover-header-padding-x: .95rem !default; +// $popover-header-bg: $popover-bg !default; +// $popover-header-color: $headings-color !default; +// $popover-header-padding-y: .5rem !default; +// $popover-header-padding-x: .95rem !default; -$popover-body-color: $body-color !default; -$popover-body-padding-y: $popover-header-padding-y !default; -$popover-body-padding-x: $popover-header-padding-x !default; +// $popover-body-color: $body-color !default; +// $popover-body-padding-y: $popover-header-padding-y !default; +// $popover-body-padding-x: $popover-header-padding-x !default; -$popover-arrow-width: 1.5rem !default; -$popover-arrow-height: .75rem !default; -$popover-arrow-color: $popover-bg !default; - -$popover-arrow-outer-color: transparent !default; +// $popover-arrow-width: 1.5rem !default; +// $popover-arrow-height: .75rem !default; +// $popover-arrow-color: $popover-bg !default; +// $popover-arrow-outer-color: transparent !default; // Badges +@import "gradido-custom/badges"; -$badge-font-size: 66% !default; -$badge-font-weight: $font-weight-bold !default; -$badge-padding-y: .35rem !default; -$badge-padding-x: .375rem !default; -$badge-border-radius: $border-radius !default; -$badge-text-transfom: uppercase; +// $badge-font-size: 66% !default; +// $badge-font-weight: $font-weight-bold !default; +// $badge-padding-y: .35rem !default; +// $badge-padding-x: .375rem !default; +// $badge-border-radius: $border-radius !default; +// $badge-text-transfom: uppercase; -$badge-pill-padding-x: .875em !default; -$badge-pill-border-radius: 10rem !default; +// $badge-pill-padding-x: .875em !default; +// $badge-pill-border-radius: 10rem !default; -$badge-circle-size: 2rem !default; +// $badge-circle-size: 2rem !default; // Pagination +@import "gradido-custom/pagination"; -// $pagination-padding-y: .5rem !default; -// $pagination-padding-x: .75rem !default; -// $pagination-padding-y-sm: .25rem !default; -// $pagination-padding-x-sm: .5rem !default; -// $pagination-padding-y-lg: .75rem !default; -// $pagination-padding-x-lg: 1.5rem !default; -// $pagination-line-height: 1.25 !default; +// // $pagination-padding-y: .5rem !default; +// // $pagination-padding-x: .75rem !default; +// // $pagination-padding-y-sm: .25rem !default; +// // $pagination-padding-x-sm: .5rem !default; +// // $pagination-padding-y-lg: .75rem !default; +// // $pagination-padding-x-lg: 1.5rem !default; +// // $pagination-line-height: 1.25 !default; -$pagination-color: $gray-600 !default; -$pagination-bg: $white !default; -$pagination-border-width: $border-width !default; -$pagination-border-color: $gray-300 !default; +// $pagination-color: $gray-600 !default; +// $pagination-bg: $white !default; +// $pagination-border-width: $border-width !default; +// $pagination-border-color: $gray-300 !default; -//$pagination-focus-box-shadow: $btn-hover-box-shadow !default; +// //$pagination-focus-box-shadow: $btn-hover-box-shadow !default; -$pagination-hover-color: $gray-600 !default; -$pagination-hover-bg: $gray-300 !default; -$pagination-hover-border-color: $gray-300 !default; +// $pagination-hover-color: $gray-600 !default; +// $pagination-hover-bg: $gray-300 !default; +// $pagination-hover-border-color: $gray-300 !default; -$pagination-active-color: $component-active-color !default; -$pagination-active-bg: $component-active-bg !default; -$pagination-active-border-color: $pagination-active-bg !default; -$pagination-active-box-shadow: $btn-hover-box-shadow !default; - -$pagination-disabled-color: $gray-600 !default; -$pagination-disabled-bg: $white !default; -$pagination-disabled-border-color: $gray-300 !default; +// $pagination-active-color: $component-active-color !default; +// $pagination-active-bg: $component-active-bg !default; +// $pagination-active-border-color: $pagination-active-bg !default; +// $pagination-active-box-shadow: $btn-hover-box-shadow !default; +// $pagination-disabled-color: $gray-600 !default; +// $pagination-disabled-bg: $white !default; +// $pagination-disabled-border-color: $gray-300 !default; // Cards +@import "gradido-custom/cards"; -$card-spacer-y: 1.25rem !default; -$card-spacer-x: 1.5rem !default; -$card-border-width: $border-width !default; -$card-border-radius: $border-radius !default; -$card-border-color: rgba($black, .05) !default; -$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default; -$card-cap-bg: $white !default; -$card-bg: $white !default; +// $card-spacer-y: 1.25rem !default; +// $card-spacer-x: 1.5rem !default; +// $card-border-width: $border-width !default; +// $card-border-radius: $border-radius !default; +// $card-border-color: rgba($black, .05) !default; +// $card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default; +// $card-cap-bg: $white !default; +// $card-bg: $white !default; -$card-img-overlay-padding: 1.25rem !default; +// $card-img-overlay-padding: 1.25rem !default; -//$card-group-margin: ($grid-gutter-width / 2); -//$card-deck-margin: $card-group-margin !default; +// //$card-group-margin: ($grid-gutter-width / 2); +// //$card-deck-margin: $card-group-margin !default; -$card-columns-count: 3 !default; -$card-columns-gap: 1.25rem !default; -$card-columns-margin: $card-spacer-y !default; +// $card-columns-count: 3 !default; +// $card-columns-gap: 1.25rem !default; +// $card-columns-margin: $card-spacer-y !default; // Tooltips - -$tooltip-font-size: $font-size-sm !default; +// @import "tooltips"; +// $tooltip-font-size: $font-size-sm !default; // Modals +@import "gradido-custom/modals"; -$modal-inner-padding: 1.5rem !default; +// $modal-inner-padding: 1.5rem !default; -$modal-lg: 800px !default; -$modal-md: 500px !default; -$modal-sm: 380px !default; +// $modal-lg: 800px !default; +// $modal-md: 500px !default; +// $modal-sm: 380px !default; -$modal-title-line-height: 1.1; +// $modal-title-line-height: 1.1; -$modal-content-bg: $white !default; -$modal-content-border-color: rgba($black, .2) !default; -$modal-content-border-width: 0 !default; -$modal-content-border-radius: $border-radius-lg !default; -$modal-content-box-shadow-xs: 0 15px 35px rgba(50,50,93,.2), 0 5px 15px rgba(0,0,0,.17); -$modal-content-box-shadow-sm-up: 0 15px 35px rgba(50,50,93,.2), 0 5px 15px rgba(0,0,0,.17); +// $modal-content-bg: $white !default; +// $modal-content-border-color: rgba($black, .2) !default; +// $modal-content-border-width: 0 !default; +// $modal-content-border-radius: $border-radius-lg !default; +// $modal-content-box-shadow-xs: 0 15px 35px rgba(50,50,93,.2), 0 5px 15px rgba(0,0,0,.17); +// $modal-content-box-shadow-sm-up: 0 15px 35px rgba(50,50,93,.2), 0 5px 15px rgba(0,0,0,.17); -$modal-backdrop-bg: $black !default; -$modal-backdrop-opacity: .16 !default; -$modal-header-border-color: $gray-200 !default; -$modal-footer-border-color: $modal-header-border-color !default; -$modal-header-border-width: $modal-content-border-width !default; -$modal-footer-border-width: $modal-header-border-width !default; -$modal-header-padding: 1.25rem !default; +// $modal-backdrop-bg: $black !default; +// $modal-backdrop-opacity: .16 !default; +// $modal-header-border-color: $gray-200 !default; +// $modal-footer-border-color: $modal-header-border-color !default; +// $modal-header-border-width: $modal-content-border-width !default; +// $modal-footer-border-width: $modal-header-border-width !default; +// $modal-header-padding: 1.25rem !default; // Datepicker +@import "gradido-custom/datepicker"; -$datepicker-border-radius: $card-border-radius !default; -$datepicker-dropdown-padding: 20px 22px !default; +// $datepicker-border-radius: $card-border-radius !default; +// $datepicker-dropdown-padding: 20px 22px !default; -$datepicker-cell-transition: $transition-base !default; -$datepicker-cell-hover-background: lighten($gray-400, 55%); -$datepicker-cell-border-radius: 50% !default; -$datepicker-cell-width: 36px !default; -$datepicker-cell-height: 36px !default; +// $datepicker-cell-transition: $transition-base !default; +// $datepicker-cell-hover-background: lighten($gray-400, 55%); +// $datepicker-cell-border-radius: 50% !default; +// $datepicker-cell-width: 36px !default; +// $datepicker-cell-height: 36px !default; -$datepicker-disabled-cell-color: $gray-300 !default; -$datepicker-disabled-old-new-color: $gray-500 !default; +// $datepicker-disabled-cell-color: $gray-300 !default; +// $datepicker-disabled-old-new-color: $gray-500 !default; -$datepicker-header-cell-border-radius: $border-radius !default; +// $datepicker-header-cell-border-radius: $border-radius !default; -$datepicker-active-color: $white !default; -$datepicker-active-background: theme-color("primary") !default; -$datepicker-active-box-shadow: none !default; +// $datepicker-active-color: $white !default; +// $datepicker-active-background: theme-color("primary") !default; +// $datepicker-active-box-shadow: none !default; -$datepicker-range-background: theme-color("primary") !default; -$datepicker-range-cell-focused-background: darken($datepicker-range-background, 5%); -$datepicker-range-color: $white !default; -$datepicker-range-highlighted-bg: $gray-200 !default; - -$datepicker-dropdown-border: lighten($gray-400, 40%); -$datepicker-dropdown-bg: $white !default; -$datepicker-highlighted-bg: $datepicker-active-background !default; +// $datepicker-range-background: theme-color("primary") !default; +// $datepicker-range-cell-focused-background: darken($datepicker-range-background, 5%); +// $datepicker-range-color: $white !default; +// $datepicker-range-highlighted-bg: $gray-200 !default; +// $datepicker-dropdown-border: lighten($gray-400, 40%); +// $datepicker-dropdown-bg: $white !default; +// $datepicker-highlighted-bg: $datepicker-active-background !default; // Footer +@import "gradido-custom/footer"; +// $footer-padding-y: 2.5rem; +// $footer-padding-x: 0; -$footer-padding-y: 2.5rem; -$footer-padding-x: 0; - - -$footer-link-font-size: .85rem !default; -$footer-bg: theme-color("secondary") !default; -$footer-color: $gray-600 !default; -$footer-link-color: $gray-600 !default; -$footer-link-hover-color: $gray-700 !default; -$footer-heading-color: $gray-600 !default; -$footer-heading-font-size: $font-size-sm !default; +// $footer-link-font-size: .85rem !default; +// $footer-bg: theme-color("secondary") !default; +// $footer-color: $gray-600 !default; +// $footer-link-color: $gray-600 !default; +// $footer-link-hover-color: $gray-700 !default; +// $footer-heading-color: $gray-600 !default; +// $footer-heading-font-size: $font-size-sm !default; // Import Bootstrap variable defaults diff --git a/frontend/src/assets/scss/custom/_vendors.scss b/frontend/src/assets/scss/custom/_vendors.scss deleted file mode 100644 index 3060e4a02..000000000 --- a/frontend/src/assets/scss/custom/_vendors.scss +++ /dev/null @@ -1,9 +0,0 @@ -// -// Vendors -// include plugin styles -// - - -@import "../core/vendors/flatpickr"; -@import "../core/vendors/nouislider"; -@import "../core/vendors/scrollbar"; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_alerts.scss b/frontend/src/assets/scss/custom/gradido-custom/_alerts.scss new file mode 100644 index 000000000..a5d3824cf --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_alerts.scss @@ -0,0 +1,8 @@ +// Alerts + +$alert-padding-y: 1rem !default; +$alert-padding-x: 1.5rem !default; +$alert-border-radius: $border-radius !default; +$alert-bg-level: -2 !default; +$alert-border-level: -2 !default; +$alert-color-level: 0 !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_badges.scss b/frontend/src/assets/scss/custom/gradido-custom/_badges.scss new file mode 100644 index 000000000..3796a34be --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_badges.scss @@ -0,0 +1,11 @@ +// Badges + +$badge-font-size: 66% !default; +$badge-font-weight: $font-weight-bold !default; +$badge-padding-y: 0.35rem !default; +$badge-padding-x: 0.375rem !default; +$badge-border-radius: $border-radius !default; +$badge-text-transfom: uppercase; +$badge-pill-padding-x: 0.875em !default; +$badge-pill-border-radius: 10rem !default; +$badge-circle-size: 2rem !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_body.scss b/frontend/src/assets/scss/custom/gradido-custom/_body.scss new file mode 100644 index 000000000..df8f91f5b --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_body.scss @@ -0,0 +1,4 @@ +// Body + +$body-bg: #f8f9fe !default; +$body-color: $gray-700 !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_buttons-forms.scss b/frontend/src/assets/scss/custom/gradido-custom/_buttons-forms.scss new file mode 100644 index 000000000..92992c070 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_buttons-forms.scss @@ -0,0 +1,18 @@ +// Buttons + Forms + +$input-btn-padding-y: 0.625rem !default; +$input-btn-padding-x: 0.75rem !default; +$input-btn-line-height: $shape-height-base !default; +$input-btn-focus-width: 0 !default; +$input-btn-focus-color: rgba($component-active-bg, 1) !default; +$input-btn-focus-box-shadow: none !default; +$input-btn-padding-y-sm: 0.25rem !default; +$input-btn-padding-x-sm: 0.5rem !default; +$input-btn-line-height-sm: $shape-height-sm !default; +$input-btn-padding-y-lg: 0.875rem !default; +$input-btn-padding-x-lg: 1rem !default; +$input-btn-line-height-lg: $shape-height-lg !default; +$input-btn-border-width: 1px !default; +$input-btn-font-size-sm: 0.75rem !default; +$input-btn-font-size: 0.875rem !default; +$input-btn-font-size-lg: 0.875rem !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_buttons.scss b/frontend/src/assets/scss/custom/gradido-custom/_buttons.scss new file mode 100644 index 000000000..3d16e762d --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_buttons.scss @@ -0,0 +1,25 @@ +// Buttons + +$btn-padding-y: $input-btn-padding-y !default; +$btn-padding-x: $input-btn-padding-x + 0.5 !default; +$btn-line-height: $input-btn-line-height !default; +$btn-padding-y-sm: $input-btn-padding-y-sm !default; +$btn-padding-x-sm: $input-btn-padding-x-sm !default; +$btn-line-height-sm: $input-btn-line-height-sm !default; +$btn-padding-y-lg: $input-btn-padding-y-lg !default; +$btn-padding-x-lg: $input-btn-padding-x-lg !default; +$btn-line-height-lg: $input-btn-line-height-lg !default; +$btn-border-width: $input-btn-border-width !default; +$btn-font-weight: 600 !default; +$btn-text-transform: none !default; +$btn-letter-spacing: 0.025em !default; +$btn-box-shadow: 0 4px 6px rgb(50 50 93 / 11%), 0 1px 3px rgb(0 0 0 / 8%) !default; +$btn-hover-box-shadow: 0 7px 14px rgb(50 50 93 / 10%), 0 3px 6px rgb(0 0 0 / 8%) !default; +$btn-focus-box-shadow: $btn-hover-box-shadow !default; +$btn-focus-width: $input-btn-focus-width !default; +$btn-active-box-shadow: none !default; +$btn-hover-translate-y: -1px !default; + +.btn-outline-secondary { + color: #4385b1 !important; +} diff --git a/frontend/src/assets/scss/custom/gradido-custom/_cards.scss b/frontend/src/assets/scss/custom/gradido-custom/_cards.scss new file mode 100644 index 000000000..fe112f8b7 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_cards.scss @@ -0,0 +1,18 @@ +// Cards + +$card-spacer-y: 1.25rem !default; +$card-spacer-x: 1.5rem !default; +$card-border-width: $border-width !default; +$card-border-radius: $border-radius !default; +$card-border-color: rgba($black, 0.05) !default; +$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default; +$card-cap-bg: $white !default; +$card-bg: $white !default; +$card-img-overlay-padding: 1.25rem !default; + +// $card-group-margin: ($grid-gutter-width / 2); +// $card-deck-margin: $card-group-margin !default; + +$card-columns-count: 3 !default; +$card-columns-gap: 1.25rem !default; +$card-columns-margin: $card-spacer-y !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_chart.scss b/frontend/src/assets/scss/custom/gradido-custom/_chart.scss new file mode 100644 index 000000000..95e884d49 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_chart.scss @@ -0,0 +1,8 @@ +// Chart + +$chart-height: 350px !default; +$chart-height-sm: 230px !default; +$chart-legend-margin-top: 2.5rem !default; +$chart-legend-font-size: $font-size-sm !default; +$chart-legend-color: $text-muted !default; +$chart-legend-height: $chart-legend-margin-top + $chart-legend-font-size * $line-height-base !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_close.scss b/frontend/src/assets/scss/custom/gradido-custom/_close.scss new file mode 100644 index 000000000..346372aa7 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_close.scss @@ -0,0 +1,9 @@ +// Close + +$close-font-size: $font-size-base * 1.5 !default; +$close-font-weight: $font-weight-bold !default; +$close-bg: transparent !default; +$close-hover-bg: transparent !default; +$close-color: rgb(0 0 0 / 60%) !default !default; +$close-hover-color: rgb(0 0 0 / 90%) !default; +$close-text-shadow: none !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_color.scss b/frontend/src/assets/scss/custom/gradido-custom/_color.scss new file mode 100644 index 000000000..20fcbefd6 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_color.scss @@ -0,0 +1,201 @@ +// Color system +@use "sass:map"; +@use "sass:color"; + +$white: #fff !default; +$gray-100: #f6f9fc !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #8898aa !default; // Line footer color +$gray-700: #525f7f !default; // Line p color +$gray-800: #32325d !default; // Line heading color +$gray-900: #212529 !default; +$black: #000 !default; +$grays: () !default; +$grays: map.merge( + ( + "100": $gray-100, + "200": $gray-200, + "300": $gray-300, + "400": $gray-400, + "500": $gray-500, + "600": $gray-600, + "700": $gray-700, + "800": $gray-800, + "900": $gray-900 + ), + $grays +); +$blue: #5e72e4 !default; +$indigo: #5603ad !default; +$purple: #8965e0 !default; +$pink: #f3a4b5 !default; +$red: #f5365c !default; +$orange: #fb6340 !default; +$yellow: #ffd600 !default; +$green: #2dce89 !default; +$teal: #11cdef !default; +$cyan: #2bffc6 !default; +$colors: () !default; +$colors: map.merge( + ( + "blue": $blue, + "indigo": $indigo, + "purple": $purple, + "pink": $pink, + "red": $red, + "orange": $orange, + "yellow": $yellow, + "green": $green, + "teal": $teal, + "cyan": $cyan, + "white": $white, + "gray": $gray-600, + "light": $gray-400, + "lighter": $gray-200, + "gray-dark": $gray-800 + ), + $colors +); +$default: #172b4d !default; +$primary: #5e72e4 !default; +$secondary: #f7fafc !default; +$success: $green !default; +$info: $teal !default; +$warning: $orange !default; +$danger: $red !default; +$light: $gray-500 !default; +$dark: $gray-900 !default; +$darker: color.adjust($gray-900, $lightness: -15%) !default; +$facebook: #3b5999 !default; +$twitter: #1da1f2 !default; +$google-plus: #dd4b39 !default; +$instagram: #e4405f !default; +$pinterest: #bd081c !default; +$youtube: #cd201f !default; +$slack: #3aaf85 !default; +$dribbble: #ea4c89 !default; +$github: #222 !default; +$theme-colors: () !default; +$theme-colors: map.merge( + ( + "default": $default, + "primary": $primary, + "secondary": $secondary, + "success": $success, + "info": $info, + "warning": $warning, + "danger": $danger, + "white": $white, + "neutral": $white, + "dark": $dark, + "darker": $darker + ), + $theme-colors +); +$brand-colors: () !default; +$brand-colors: map.merge( + ( + "facebook": $facebook, + "twitter": $twitter, + "google-plus": $google-plus, + "instagram": $instagram, + "pinterest": $pinterest, + "youtube": $youtube, + "slack": $slack, + "dribbble": $dribbble, + "github": $github + ), + $brand-colors +); +$shape-colors: () !default; +$shape-colors: map.merge( + ( + "default": #32325d, + "primary": #53f, + "secondary": #24b47e, + "neutral": #e9ecef, + "blue-gray": #b2cbe1, + ), + $shape-colors +); +$shapes-primary-colors: () !default; +$shapes-primary-colors: map.merge( + ( + "step-1-gradient-bg": #281483, + "step-2-gradient-bg": #8f6ed5, + "step-3-gradient-bg": #d782d9, + "span-1-bg": #53f, + "span-2-bg": #4553ff, + "span-3-bg": #4f40ff, + "span-4-bg": #25ddf5, + "span-5-bg": #1fa2ff + ), + $shapes-primary-colors +); +$shapes-default-colors: () !default; +$shapes-default-colors: map.merge( + ( + "step-1-gradient-bg": #7795f8, + "step-2-gradient-bg": #6772e5, + "step-3-gradient-bg": #555abf, + "span-1-bg": #7795f8, + "span-2-bg": #7b9aff, + "span-3-bg": #6f8ff8, + "span-4-bg": #76eea7, + "span-5-bg": #6adaff + ), + $shapes-default-colors +); +$shapes-light-colors: () !default; +$shapes-light-colors: map.merge( + ( + "step-1-gradient-bg": #b2cbe1, + "step-2-gradient-bg": #f6f9fc, + "step-3-gradient-bg": #f6f9fc, + "span-1-bg": #b4cce1, + "span-2-bg": #c5dbef, + "span-3-bg": #b9d5ed, + "span-4-bg": #74e4a2, + "span-5-bg": #008169 + ), + $shapes-light-colors +); +$shapes-dark-colors: () !default; +$shapes-dark-colors: map.merge( + ( + "step-1-gradient-bg": #32325d, + "step-2-gradient-bg": #32325d, + "step-3-gradient-bg": #32325d, + "span-1-bg": #2e2e57, + "span-2-bg": #2b2b58, + "span-3-bg": #25254d, + "span-4-bg": #d782d9, + "span-5-bg": #008169 + ), + $shapes-dark-colors +); + +// Translucent color variations +$translucent-color-opacity: 0.6 !default; + +// Set a specific jump point for requesting color jumps +$theme-color-interval: 8% !default; + +// The yiq lightness value that determines when the lightness of color changes +// from "dark" to "light". Acceptable values are between 0 and 255. +$yiq-contrasted-threshold: 200 !default; + +// Customize the light and dark text colors for use in our YIQ color contrast function. +$yiq-text-dark: $gray-900 !default; +$yiq-text-light: $white !default; + +// Action colors + +$star-rating-color: $gray-400 !default; +$star-rating-color-active: $yellow !default; +$favorite-color: $yellow !default; +$like-color: $blue !default; +$love-color: $red !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_components.scss b/frontend/src/assets/scss/custom/gradido-custom/_components.scss new file mode 100644 index 000000000..400fc0647 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_components.scss @@ -0,0 +1,24 @@ +// Components + +$shape-height-xl: 1.5 !default; +$shape-height-lg: 1.5 !default; +$shape-height-sm: 1.5 !default; +$border-width: 1px !default; +$border-color: $gray-200 !default; +$border-radius: 0.375rem !default; +$border-radius-xl: 0.5rem !default; +$border-radius-lg: 0.4375rem !default; +$border-radius-sm: 0.25rem !default; +$box-shadow-sm: 0 0 0.5rem rgba($gray-600, 0.075) !default; +$box-shadow: 0 0 2rem 0 rgba($gray-600, 0.15) !default; +$box-shadow-lg: 0 0 3rem rgba($gray-600, 0.175) !default; +$component-active-color: $white !default; +$component-active-bg: theme-color("primary") !default; +$component-active-border-color: theme-color("primary") !default; +$component-hover-color: $gray-300 !default; +$component-hover-bg: $gray-300 !default; +$component-hover-border-color: $gray-300 !default; +$caret-width: 0.3em !default; +$transition-base: all 0.15s ease !default; +$transition-fade: opacity 0.15s linear !default; +$transition-collapse: height 0.35s ease !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_custom-forms.scss b/frontend/src/assets/scss/custom/gradido-custom/_custom-forms.scss new file mode 100644 index 000000000..4fa437b38 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_custom-forms.scss @@ -0,0 +1,29 @@ +// Custom forms + +$custom-control-gutter: 1.75rem !default; +$custom-control-spacer-x: 1rem !default; +$custom-control-indicator-size: 1.25rem !default; +$custom-control-indicator-bg: $input-bg !default; +$custom-control-indicator-border-width: 1px !default; +$custom-control-indicator-border-color: $input-border-color !default; +$custom-control-indicator-box-shadow: none !default; +$custom-control-indicator-focus-box-shadow: $custom-control-indicator-box-shadow !default; +$custom-control-indicator-hover-color: $component-hover-color !default; +$custom-control-indicator-hover-bg: $component-hover-bg !default; +$custom-control-indicator-hover-border-color: $component-hover-border-color !default; +$custom-control-indicator-active-color: $component-active-color !default; +$custom-control-indicator-active-bg: $component-active-bg !default; +$custom-control-indicator-active-border-color: $component-active-border-color !default; +$custom-control-indicator-active-box-shadow: $custom-control-indicator-box-shadow !default; +$custom-control-indicator-checked-color: $component-active-color !default; +$custom-control-indicator-checked-bg: $component-active-bg !default; +$custom-control-indicator-checked-border-color: $component-active-border-color !default; +$custom-control-indicator-checked-box-shadow: $custom-control-indicator-box-shadow !default; + +// $custom-control-indicator-checked-disabled-bg: rgb(theme-color("primary") 0.5) !default; +$custom-control-indicator-checked-disabled-bg: theme-color("primary") !default; +$custom-control-indicator-disabled-bg: $gray-200 !default; +$custom-control-label-disabled-color: $gray-600 !default; +$custom-checkbox-indicator-border-radius: $border-radius-sm !default; + +// $custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml !default;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_custom-toogle.scss b/frontend/src/assets/scss/custom/gradido-custom/_custom-toogle.scss new file mode 100644 index 000000000..ddf88c14c --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_custom-toogle.scss @@ -0,0 +1,5 @@ +// Custom toggle + +$custom-toggle-width: 50px !default; +$custom-toggle-slider-bg: $gray-200 !default; +$custom-toggle-checked-bg: theme-color("primary") !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_datepicker.scss b/frontend/src/assets/scss/custom/gradido-custom/_datepicker.scss new file mode 100644 index 000000000..e745c22c5 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_datepicker.scss @@ -0,0 +1,23 @@ +// Datepicker +@use "sass:color"; + +$datepicker-border-radius: $card-border-radius !default; +$datepicker-dropdown-padding: 20px 22px !default; +$datepicker-cell-transition: $transition-base !default; +$datepicker-cell-hover-background: color.adjust($gray-400, $lightness: 55%); +$datepicker-cell-border-radius: 50% !default; +$datepicker-cell-width: 36px !default; +$datepicker-cell-height: 36px !default; +$datepicker-disabled-cell-color: $gray-300 !default; +$datepicker-disabled-old-new-color: $gray-500 !default; +$datepicker-header-cell-border-radius: $border-radius !default; +$datepicker-active-color: $white !default; +$datepicker-active-background: theme-color("primary") !default; +$datepicker-active-box-shadow: none !default; +$datepicker-range-background: theme-color("primary") !default; +$datepicker-range-cell-focused-background: color.adjust($datepicker-range-background, $lightness: -5%); +$datepicker-range-color: $white !default; +$datepicker-range-highlighted-bg: $gray-200 !default; +$datepicker-dropdown-border: color.adjust($gray-400, $lightness: 40%); +$datepicker-dropdown-bg: $white !default; +$datepicker-highlighted-bg: $datepicker-active-background !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_dropdown.scss b/frontend/src/assets/scss/custom/gradido-custom/_dropdown.scss new file mode 100644 index 000000000..e699f20df --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_dropdown.scss @@ -0,0 +1,9 @@ +// Dropdown + +$dropdown-bg: $white !default; +$dropdown-border-width: 0 !default; +$dropdown-border-color: rgba($black, 0.15) !default; +$dropdown-border-radius: $border-radius-lg !default; +$dropdown-box-shadow: 0 50px 100px rgb(50 50 93 / 10%), + 0 15px 35px rgb(50 50 93 / 15%), + 0 5px 15px rgb(0 0 0 / 10%) !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_fonts.scss b/frontend/src/assets/scss/custom/gradido-custom/_fonts.scss new file mode 100644 index 000000000..be6fbe74a --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_fonts.scss @@ -0,0 +1,63 @@ +// Fonts +$font-family-sans-serif: open sans, sans-serif !default; +$font-family-base: $font-family-sans-serif !default; +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +$font-size-xl: ($font-size-base * 1.5); +$font-size-lg: ($font-size-base * 1.25); +$font-size-sm: ($font-size-base * 0.875); +$font-size-xs: ($font-size-base * 0.75); +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-bold: 600 !default; +$font-weight-extra-bold: 700 !default; +$font-weight-base: $font-weight-normal !default; +$line-height-base: 1.5 !default; +$shape-height-base: 1.5 !default; +$h1-font-size: $font-size-base * 1.625 !default; +$h2-font-size: $font-size-base * 1.25 !default; +$h3-font-size: $font-size-base * 1.0625 !default; +$h4-font-size: $font-size-base * 0.9375 !default; +$h5-font-size: $font-size-base * 0.8125 !default; +$h6-font-size: $font-size-base * 0.625 !default; +$headings-margin-bottom: ($spacer / 2); +$headings-font-family: inherit !default; +$headings-font-weight: $font-weight-bold !default; +$headings-line-height: 1.5 !default; +$headings-color: $gray-800 !default; +$heading-letter-spacing: 0.025em !default; +$heading-font-size: 0.95rem !default; +$heading-text-transform: uppercase !default; +$heading-font-weight: $headings-font-weight !default; +$heading-title-letter-spacing: 0.025em !default; +$heading-title-font-size: 1.375rem !default; +$heading-title-font-weight: $font-weight-bold !default; +$heading-title-text-transform: uppercase !default; +$heading-section-letter-spacing: 0.025em !default; +$heading-section-font-size: 1.375rem !default; +$heading-section-font-weight: $font-weight-bold !default; +$heading-section-text-transform: uppercase !default; +$display1-size: 3.3rem !default; +$display2-size: 2.75rem !default; +$display3-size: 2.1875rem !default; +$display4-size: 1.6275rem !default; +$display1-weight: $font-weight-bold !default; +$display2-weight: $font-weight-bold !default; +$display3-weight: $font-weight-bold !default; +$display4-weight: $font-weight-bold !default; +$display-line-height: $headings-line-height !default; +$paragraph-font-size: 1rem !default; +$paragraph-font-weight: 300 !default; +$paragraph-line-height: 1.7 !default; +$lead-font-size: ($paragraph-font-size * 1.25) !default; +$lead-font-weight: 300 !default; +$small-font-size: 80% !default; +$text-muted: $gray-600 !default; +$blockquote-small-color: $gray-600 !default; +$blockquote-font-size: ($font-size-base * 1.25) !default; +$hr-border-color: rgba($black, 0.1); +$hr-border-width: $border-width !default; +$mark-padding: 0.2em !default; +$dt-font-weight: $font-weight-bold !default; +$list-inline-padding: 0.5rem !default; +$mark-bg: #fcf8e3 !default; +$hr-margin-y: $spacer * 2 !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_footer.scss b/frontend/src/assets/scss/custom/gradido-custom/_footer.scss new file mode 100644 index 000000000..8cc541f2e --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_footer.scss @@ -0,0 +1,11 @@ +// Footer + +$footer-padding-y: 2.5rem; +$footer-padding-x: 0; +$footer-link-font-size: 0.85rem !default; +$footer-bg: theme-color("secondary") !default; +$footer-color: $gray-600 !default; +$footer-link-color: $gray-600 !default; +$footer-link-hover-color: $gray-700 !default; +$footer-heading-color: $gray-600 !default; +$footer-heading-font-size: $font-size-sm !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_form-groups.scss b/frontend/src/assets/scss/custom/gradido-custom/_form-groups.scss new file mode 100644 index 000000000..e367b97a5 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_form-groups.scss @@ -0,0 +1,3 @@ +// Form group + +$form-group-margin-bottom: 1.5rem !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_form-validation.scss b/frontend/src/assets/scss/custom/gradido-custom/_form-validation.scss new file mode 100644 index 000000000..0d9243e08 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_form-validation.scss @@ -0,0 +1,7 @@ +// Form validation +@use "sass:color"; + +$form-feedback-valid-bg: color.adjust($success, $lightness: 15%) !default; +$form-feedback-valid-color: theme-color("success") !default; +$form-feedback-invalid-bg: color.adjust($warning, $lightness: 15%) !default; +$form-feedback-invalid-color: theme-color("warning") !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_forms.scss b/frontend/src/assets/scss/custom/gradido-custom/_forms.scss new file mode 100644 index 000000000..8b1a39374 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_forms.scss @@ -0,0 +1 @@ +// empty diff --git a/frontend/src/assets/scss/custom/gradido-custom/_global.scss b/frontend/src/assets/scss/custom/gradido-custom/_global.scss new file mode 100644 index 000000000..f4f787be6 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_global.scss @@ -0,0 +1,9 @@ +// Global settings + +$enable-caret: true !default; +$enable-rounded: true !default; +$enable-shadows: true !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-grid-classes: true !default; +$enable-print-styles: true !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_grid-breakpoint.scss b/frontend/src/assets/scss/custom/gradido-custom/_grid-breakpoint.scss new file mode 100644 index 000000000..af4296cf6 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_grid-breakpoint.scss @@ -0,0 +1,16 @@ +// Grid breakpoints + +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px +); + +@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +@include _assert-starts-at-zero($grid-breakpoints); + +// Grid containers + +// Define the maximum width of `.container` for different screen sizes. diff --git a/frontend/src/assets/scss/custom/gradido-custom/_icons.scss b/frontend/src/assets/scss/custom/gradido-custom/_icons.scss new file mode 100644 index 000000000..f20490d59 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_icons.scss @@ -0,0 +1,6 @@ +// Icons + +$icon-size: 3rem !default; +$icon-size-xl: 5rem !default; +$icon-size-lg: 4rem !default; +$icon-size-sm: 2rem !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_input-groups.scss b/frontend/src/assets/scss/custom/gradido-custom/_input-groups.scss new file mode 100644 index 000000000..66add56f5 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_input-groups.scss @@ -0,0 +1,8 @@ +// Input groups + +$input-group-addon-color: $input-placeholder-color !default; +$input-group-addon-bg: $input-bg !default; +$input-group-addon-border-color: $input-border-color !default; +$input-group-addon-focus-color: $input-focus-color !default; +$input-group-addon-focus-bg: $input-focus-bg !default; +$input-group-addon-focus-border-color: $input-focus-border-color !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_input.scss b/frontend/src/assets/scss/custom/gradido-custom/_input.scss new file mode 100644 index 000000000..12ecf12e5 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_input.scss @@ -0,0 +1,37 @@ +// Input +@use "sass:color"; + +$input-padding-y: $input-btn-padding-y !default; +$input-padding-x: $input-btn-padding-x !default; +$input-line-height: $input-btn-line-height !default; +$input-padding-y-sm: $input-btn-padding-y-sm !default; +$input-padding-x-sm: $input-btn-padding-x-sm !default; +$input-line-height-sm: $input-btn-line-height-sm !default; +$input-padding-y-lg: $input-btn-padding-y-lg !default; +$input-padding-x-lg: $input-btn-padding-x-lg !default; +$input-line-height-lg: $input-btn-line-height-lg !default; +$input-border-radius: $border-radius !default; +$input-border-radius-xl: $border-radius-xl !default; +$input-border-radius-lg: $border-radius-lg !default; +$input-border-radius-sm: $border-radius-sm !default; +$input-bg: $white !default; +$input-disabled-bg: $gray-200 !default; +$input-muted-bg: #f7fafe !default; +$input-focus-muted-bg: color.adjust($input-muted-bg, $lightness: 1%) !default; +$input-alternative-box-shadow: 0 1px 3px rgb(50 50 93 / 15%), 0 1px 0 rgb(0 0 0 / 2%) !default; +$input-focus-alternative-box-shadow: 0 4px 6px rgb(50 50 93 / 11%),0 1px 3px rgb(0 0 0 / 8%) !default; +$input-color: $gray-600 !default; +$input-border-color: #cad1d7 !default; +$input-border-width: $input-btn-border-width !default; +$input-box-shadow: none !default; // 0 1px 3px 0 $gray-400 !default; + +$input-focus-bg: $white !default; +$input-focus-border-color: rgb(50 151 211 / 25%) !default; +$input-focus-color: $input-color !default; +$input-focus-width: 0 !default; +$input-focus-box-shadow: none !default; // 0 1px 3px 0 $gray-500 !default; + +$input-placeholder-color: $gray-500 !default; +$input-focus-placeholder-color: $gray-500 !default; +$input-height-border: $input-border-width * 2 !default; +$input-transition: all 0.2s cubic-bezier(0.68, -0.55, 0.265, 1.55) !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_links.scss b/frontend/src/assets/scss/custom/gradido-custom/_links.scss new file mode 100644 index 000000000..bf06c470f --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_links.scss @@ -0,0 +1,7 @@ +// Links +@use "sass:color"; + +$link-color: $primary !default; +$link-decoration: none !default; +$link-hover-color: color.adjust($link-color, $lightness: -15%) !default; +$link-hover-decoration: none !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_list-group.scss b/frontend/src/assets/scss/custom/gradido-custom/_list-group.scss new file mode 100644 index 000000000..647570cb1 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_list-group.scss @@ -0,0 +1,18 @@ +// List group + +$list-group-bg: $white !default; +$list-group-border-color: $border-color !default; // rgba($black, .125); +$list-group-border-width: $border-width !default; +$list-group-border-radius: $border-radius !default; +$list-group-item-padding-y: 1rem !default; +$list-group-item-padding-x: 1rem !default; +$list-group-hover-bg: $gray-100 !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $list-group-active-bg !default; +$list-group-disabled-color: $gray-600 !default; +$list-group-disabled-bg: $list-group-bg !default; +$list-group-action-color: $gray-700 !default; +$list-group-action-hover-color: $list-group-action-color !default; +$list-group-action-active-color: $list-group-action-color !default; +$list-group-action-active-bg: $gray-200 !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_main-content.scss b/frontend/src/assets/scss/custom/gradido-custom/_main-content.scss new file mode 100644 index 000000000..d4787a666 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_main-content.scss @@ -0,0 +1,4 @@ +// Main content + +$main-content-padding-y: 40px !default; +$main-content-padding-x: 24px !default; // in px to combine with $grid-gutter-width diff --git a/frontend/src/assets/scss/custom/gradido-custom/_map.scss b/frontend/src/assets/scss/custom/gradido-custom/_map.scss new file mode 100644 index 000000000..ded56e7cc --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_map.scss @@ -0,0 +1,3 @@ +// Map + +$map-height: 500px !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_modals.scss b/frontend/src/assets/scss/custom/gradido-custom/_modals.scss new file mode 100644 index 000000000..a372d586d --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_modals.scss @@ -0,0 +1,20 @@ +// Modals + +$modal-inner-padding: 1.5rem !default; +$modal-lg: 800px !default; +$modal-md: 500px !default; +$modal-sm: 380px !default; +$modal-title-line-height: 1.1; +$modal-content-bg: $white !default; +$modal-content-border-color: rgba($black, 0.2) !default; +$modal-content-border-width: 0 !default; +$modal-content-border-radius: $border-radius-lg !default; +$modal-content-box-shadow-xs: 0 15px 35px rgb(50 50 93 / 20%), 0 5px 15px rgb(0 0 0 / 17%); +$modal-content-box-shadow-sm-up: 0 15px 35px rgb(50 50 93 / 20%), 0 5px 15px rgb(0 0 0 / 17%); +$modal-backdrop-bg: $black !default; +$modal-backdrop-opacity: 0.16 !default; +$modal-header-border-color: $gray-200 !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-footer-border-width: $modal-header-border-width !default; +$modal-header-padding: 1.25rem !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_navbar.scss b/frontend/src/assets/scss/custom/gradido-custom/_navbar.scss new file mode 100644 index 000000000..1f4abaf45 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_navbar.scss @@ -0,0 +1,41 @@ +// Navbar + +$navbar-transition: all 0.15s linear !default; +$navbar-padding-y: 1rem !default; +$navbar-padding-x: 1rem !default; +$navbar-nav-link-padding-x: 1rem !default; +$navbar-nav-link-padding-y: 1rem !default; +$navbar-nav-link-font-size: 0.9rem !default; +$navbar-nav-link-font-weight: 400 !default; +$navbar-nav-link-text-transform: normal !default; +$navbar-nav-link-letter-spacing: 0 !default; +$navbar-nav-link-border-radius: $border-radius !default; +$navbar-search-width: 270px !default; +$navbar-search-bg: transparent !default; +$navbar-search-border-radius: 2rem !default; +$navbar-search-border-width: 2px !default; +$navbar-dark-bg: transparent !default; +$navbar-dark-hover-bg: rgb(255 255 255 / 10%) !default; +$navbar-dark-active-bg: rgb(255 255 255 / 10%) !default; +$navbar-dark-color: rgba($white, 0.95) !default; +$navbar-dark-hover-color: rgba($white, 0.65) !default; +$navbar-dark-active-color: rgba($white, 0.65) !default; +$navbar-dark-disabled-color: rgba($white, 0.25) !default; +$navbar-dark-toggler-border-color: transparent !default; +$navbar-search-dark-border-color: rgb(255 255 255 / 60%) !default; +$navbar-search-dark-color: rgb(255 255 255 / 60%) !default; +$navbar-search-dark-focus-border-color: rgb(255 255 255 / 90%) !default; +$navbar-search-dark-focus-color: rgb(255 255 255 / 90%) !default; +$navbar-light-bg: transparent !default; +$navbar-light-hover-bg: rgb(0 0 0 / 10%) !default; +$navbar-light-active-bg: rgb(0 0 0 / 10%) !default; +$navbar-light-border-color: $gray-100 !default; +$navbar-light-color: rgba($black, 0.5) !default; +$navbar-light-hover-color: rgba($black, 0.7) !default; +$navbar-light-active-color: rgba($black, 0.9) !default; +$navbar-light-disabled-color: rgba($black, 0.3) !default; +$navbar-light-toggler-border-color: transparent !default; +$navbar-search-light-border-color: rgb(0 0 0 / 60%) !default; +$navbar-search-light-color: rgb(0 0 0 / 60%) !default; +$navbar-search-light-focus-border-color: rgb(0 0 0 / 90%) !default; +$navbar-search-light-focus-color: rgb(0 0 0 / 90%) !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_navs.scss b/frontend/src/assets/scss/custom/gradido-custom/_navs.scss new file mode 100644 index 000000000..106c58c4a --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_navs.scss @@ -0,0 +1,20 @@ +// Navs +@use "sass:color"; + +$nav-link-padding-y: 0.25rem !default; +$nav-link-padding-x: 0.75rem !default; +$nav-link-color: $gray-700 !default; +$nav-link-hover-color: theme-color("primary") !default; +$nav-link-disabled-color: $gray-600 !default; +$nav-pills-padding-y: 0.75rem !default; +$nav-pills-padding-x: 1rem !default; +$nav-pills-space-x: 1rem !default; +$nav-pills-bg: $white !default; +$nav-pills-border-width: 1px !default; +$nav-pills-border-color: theme-color("primary") !default; +$nav-pills-border-radius: $border-radius !default; +$nav-pills-link-color: theme-color("primary") !default; +$nav-pills-link-hover-color: color.adjust(theme-color("primary"), $lightness: -5%) !default; +$nav-pills-link-active-color: color-yiq(theme-color("primary")) !default; +$nav-pills-link-active-bg: theme-color("primary") !default; +$nav-pills-box-shadow: $btn-box-shadow !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_nouislider.scss b/frontend/src/assets/scss/custom/gradido-custom/_nouislider.scss new file mode 100644 index 000000000..9d4bb94ca --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_nouislider.scss @@ -0,0 +1,14 @@ +// No UI Slider + +$noui-target-bg: #eceeef !default; +$noui-target-thickness: 5px !default; +$noui-target-border-radius: 5px !default; +$noui-target-border-color: 0 !default; +$noui-target-box-shadow: inset 0 1px 2px rgb(90 97 105 / 10%) !default; +$noui-slider-connect-bg: $primary !default; +$noui-slider-connect-disabled-bg: #b2b2b2 !default; +$noui-handle-width: 15px !default; +$noui-handle-bg: theme-color("primary") !default; +$noui-handle-border: 0 !default; +$noui-handle-border-radius: 100% !default; +$noui-origin-border-radius: 2px !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_pagination.scss b/frontend/src/assets/scss/custom/gradido-custom/_pagination.scss new file mode 100644 index 000000000..f98151d0b --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_pagination.scss @@ -0,0 +1,27 @@ +// Pagination + +// $pagination-padding-y: .5rem !default; +// $pagination-padding-x: .75rem !default; +// $pagination-padding-y-sm: .25rem !default; +// $pagination-padding-x-sm: .5rem !default; +// $pagination-padding-y-lg: .75rem !default; +// $pagination-padding-x-lg: 1.5rem !default; +// $pagination-line-height: 1.25 !default; + +$pagination-color: $gray-600 !default; +$pagination-bg: $white !default; +$pagination-border-width: $border-width !default; +$pagination-border-color: $gray-300 !default; + +// $pagination-focus-box-shadow: $btn-hover-box-shadow !default; + +$pagination-hover-color: $gray-600 !default; +$pagination-hover-bg: $gray-300 !default; +$pagination-hover-border-color: $gray-300 !default; +$pagination-active-color: $component-active-color !default; +$pagination-active-bg: $component-active-bg !default; +$pagination-active-border-color: $pagination-active-bg !default; +$pagination-active-box-shadow: $btn-hover-box-shadow !default; +$pagination-disabled-color: $gray-600 !default; +$pagination-disabled-bg: $white !default; +$pagination-disabled-border-color: $gray-300 !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_popovers.scss b/frontend/src/assets/scss/custom/gradido-custom/_popovers.scss new file mode 100644 index 000000000..b5395f1d7 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_popovers.scss @@ -0,0 +1,20 @@ +// Popovers + +$popover-font-size: $font-size-sm !default; +$popover-bg: $white !default; +$popover-max-width: 276px !default; +$popover-border-width: 1px !default; +$popover-border-color: rgba($black, 0.05) !default; +$popover-border-radius: $border-radius-lg !default; +$popover-box-shadow: 0 0.5rem 2rem 0 rgba($black, 0.2) !default; +$popover-header-bg: $popover-bg !default; +$popover-header-color: $headings-color !default; +$popover-header-padding-y: 0.5rem !default; +$popover-header-padding-x: 0.95rem !default; +$popover-body-color: $body-color !default; +$popover-body-padding-y: $popover-header-padding-y !default; +$popover-body-padding-x: $popover-header-padding-x !default; +$popover-arrow-width: 1.5rem !default; +$popover-arrow-height: 0.75rem !default; +$popover-arrow-color: $popover-bg !default; +$popover-arrow-outer-color: transparent !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_sections.scss b/frontend/src/assets/scss/custom/gradido-custom/_sections.scss new file mode 100644 index 000000000..df8f91f5b --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_sections.scss @@ -0,0 +1,4 @@ +// Body + +$body-bg: #f8f9fe !default; +$body-color: $gray-700 !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_spacing.scss b/frontend/src/assets/scss/custom/gradido-custom/_spacing.scss new file mode 100644 index 000000000..2569048a8 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_spacing.scss @@ -0,0 +1,42 @@ +// Spacing +@use "sass:map"; + +$spacer: 1rem !default; +$spacers: () !default; +$spacers: map.merge( + ( + -9: - ($spacer * 10), + -8: - ($spacer * 8), + -7: - ($spacer * 6), + -6: - ($spacer * 4.5), + -5: - ($spacer * 3), + -4: - ($spacer * 1.5), + -3: - $spacer, + -2: - ($spacer * 0.5), + -1: - ($spacer * 0.25), + 0: 0, + 1: ($spacer * 0.25), + 2: ($spacer * 0.5), + 3: $spacer, + 4: ($spacer * 1.5), + 5: ($spacer * 3), + 6: ($spacer * 4.5), + 7: ($spacer * 6), + 8: ($spacer * 8), + 9: ($spacer * 10) + ), + $spacers +); + +// This variable affects the `.h-*` and `.w-*` classes. + +$sizes: () !default; +$sizes: map.merge( + ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100% + ), + $sizes +); diff --git a/frontend/src/assets/scss/custom/gradido-custom/_tables.scss b/frontend/src/assets/scss/custom/gradido-custom/_tables.scss new file mode 100644 index 000000000..7648d9cc3 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_tables.scss @@ -0,0 +1,26 @@ +// Tables +@use "sass:color"; + +$table-cell-padding: 1rem !default; +$table-cell-padding-sm: 0.5rem !default; +$table-bg: transparent !default; +$table-accent-bg: rgba($black, 0.05) !default; +$table-hover-bg: $gray-100 !default; +$table-active-bg: $table-hover-bg !default; +$table-border-width: $border-width !default; +$table-border-color: $gray-200 !default; +$table-head-bg: $gray-100 !default; +$table-head-color: $gray-600 !default; +$table-head-spacer-y: 0.75rem !default; +$table-head-font-size: 0.65rem !default; +$table-head-font-weight: $font-weight-bold !default; +$table-head-text-transform: uppercase !default; +$table-head-letter-spacing: 1px !default; +$table-body-font-size: 0.8125rem !default; +$table-dark-bg: theme-color("default") !default; +$table-dark-accent-bg: rgba($white, 0.05) !default; +$table-dark-hover-bg: rgba($white, 0.075) !default; +$table-dark-border-color: color.adjust(theme-color("default"), $lightness: 7%) !default; +$table-dark-color: $body-bg !default; +$table-dark-head-bg: color.adjust(theme-color("default"), $lightness: 4%) !default; +$table-dark-head-color: color.adjust(theme-color("default"), $lightness: 35%) !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_tooltips.scss b/frontend/src/assets/scss/custom/gradido-custom/_tooltips.scss new file mode 100644 index 000000000..63f9ea078 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_tooltips.scss @@ -0,0 +1,3 @@ +// Tooltips + +$tooltip-font-size: $font-size-sm !default; diff --git a/frontend/src/assets/scss/custom/gradido-custom/_vertical-navbar.scss b/frontend/src/assets/scss/custom/gradido-custom/_vertical-navbar.scss new file mode 100644 index 000000000..4b05084e8 --- /dev/null +++ b/frontend/src/assets/scss/custom/gradido-custom/_vertical-navbar.scss @@ -0,0 +1,12 @@ +// Vertical navbar + +$navbar-vertical-box-shadow: 0 0 2rem 0 rgb(136 152 170 / 15%) !important; +$navbar-vertical-width: 250px !default; +$navbar-vertical-padding-x: 1.5rem !default; +$navbar-vertical-nav-link-padding-x: 1.5rem !default; +$navbar-vertical-nav-link-padding-y: 0.65rem !default; +$navbar-icon-min-width: 2.25rem !default; +$navbar-breadcrumb-padding-y: $nav-link-padding-y !default; +$navbar-breadcrumb-padding-x: 0 !default; +$navbar-light-bg: $white !default; +$navbar-light-border-color: $border-color !default; diff --git a/frontend/src/assets/scss/gradido.scss b/frontend/src/assets/scss/gradido.scss new file mode 100644 index 000000000..53a296713 --- /dev/null +++ b/frontend/src/assets/scss/gradido.scss @@ -0,0 +1,211 @@ +// Bootstrap (4.5.3) functions + +@import "~bootstrap/scss/functions"; +@import "custom/variables"; + +// @import "~bootstrap/scss/variables"; wird am +// ende der custom/variables angehangen + +// Bootstrap (4.5.3) mixins +@import "~bootstrap/scss/mixins"; + +// Bootstrap (4.5.3) components + +@import "~bootstrap/scss/alert"; +@import "~bootstrap/scss/badge"; +@import "~bootstrap/scss/dropdown"; +@import "~bootstrap/scss/button-group"; +@import "~bootstrap/scss/buttons"; +@import "~bootstrap/scss/card"; +@import "~bootstrap/scss/carousel"; +@import "~bootstrap/scss/close"; +@import "~bootstrap/scss/code"; +@import "~bootstrap/scss/custom-forms"; + +// @import "~bootstrap/scss/dropdown"; +@import "~bootstrap/scss/forms"; + +// @import "~bootstrap/scss/functions"; +@import "~bootstrap/scss/grid"; +@import "~bootstrap/scss/input-group"; +@import "~bootstrap/scss/list-group"; + +// @import "~bootstrap/scss/mixins"; +@import "~bootstrap/scss/modal"; +@import "~bootstrap/scss/nav"; +@import "~bootstrap/scss/navbar"; +@import "~bootstrap/scss/pagination"; +@import "~bootstrap/scss/print"; +@import "~bootstrap/scss/progress"; +@import "~bootstrap/scss/reboot"; +@import "~bootstrap/scss/tables"; +@import "~bootstrap/scss/toasts"; +@import "~bootstrap/scss/tooltip"; +@import "~bootstrap/scss/transitions"; +@import "~bootstrap/scss/type"; +@import "~bootstrap/scss/utilities"; +@import "~bootstrap/scss/variables"; +@import "~bootstrap/scss/bootstrap-grid"; +@import "~bootstrap/scss/bootstrap-reboot"; +@import "~bootstrap/scss/bootstrap"; + +// Bootstrap-vue (2.21.1) scss +@import "~bootstrap-vue/src/index"; + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} + +.b-toast-danger .toast .toast-header { + color: #721c24; + background-color: rgb(248 215 218 / 85%); + border-bottom-color: rgb(245 198 203 / 85%); +} + +.b-toast-danger .toast .toast-body { + background-color: rgb(252 237 238 / 85%); + border-color: rgb(245 198 203 / 85%); + color: #721c24; +} + +.b-toast-success .toast .toast-header { + color: #155724; + background-color: rgb(212 237 218 / 58%); + border-bottom-color: rgb(195 230 203 / 85%); +} + +.b-toast-success .toast .toast-body { + color: #155724; + background-color: rgb(212 237 218 / 85%); + border-bottom-color: rgb(195 230 203 / 85%); +} + +// .btn-primary pim { +.btn-primary { + background-color: #5a7b02; + border-color: #5e72e4; +} + +.gradido-font-large { + font-size: large; + height: auto !important; +} + +a, +.copyright { + color: #5a7b02; +} + +.font12em { + font-size: 1.2em; +} + +.font2em { + font-size: 1.5em; +} + +.gradido-global-color-text { + color: #3d443b; +} + +.gradido-global-color-accent { + color: #047006; +} + +.gradido-global-color-6e0a9c9e { + color: #000; +} + +.gradido-global-color-2d0fb154 { + color: #047006; +} + +.gradido-global-color-16efe88c { + color: #7ebc55; +} + +.gradido-global-color-1939326 { + color: #f6fff6; +} + +.gradido-global-color-9d79fc1 { + color: #047006; +} + +.gradido-global-color-6347f4d { + color: #5a7b02; +} + +.gradido-global-color-4fbc19a { + color: #014034; +} + +.gradido-global-color-d341874 { + color: #b6d939; +} + +.gradido-global-color-619d338 { + color: #8ebfb1; +} + +.gradido-global-color-44819a9 { + color: #026873; +} + +.gradido-global-color-gray { + color: #858383; +} + +.gradido-custom-background { + background-color: #ebebeba3 !important; +} + +.gradido-max-width { + width: 100%; +} + +.gradido-width-300 { + width: 300px; +} + +.gradido-absolute { + position: absolute; +} + +.gradido-width-95-absolute { + width: 95%; + position: absolute; +} + +.gradido-width-96-absolute { + width: 96%; + position: absolute; +} + +.gradido-no-border-radius { + border-radius: 0; +} + +.gradido-no-border { + border: 0; +} + +.gradido-background-f1 { + background-color: #f1f1f1; +} + +.gradido-background-white { + background-color: #fff; +} + +.gradido-font-15rem { + font-size: 1.5rem; +} diff --git a/frontend/src/assets/vendor/nucleo/css/nucleo-svg.css b/frontend/src/assets/vendor/nucleo/css/nucleo-svg.css deleted file mode 100644 index c68c10e35..000000000 --- a/frontend/src/assets/vendor/nucleo/css/nucleo-svg.css +++ /dev/null @@ -1,135 +0,0 @@ -/* Generated using nucleoapp.com */ -/* -------------------------------- - -Icon colors - --------------------------------- */ - -.icon { - display: inline-block; - /* icon primary color */ - color: #111111; - height: 1em; - width: 1em; -} - -.icon use { - /* icon secondary color - fill */ - fill: #7ea6f6; -} - -.icon.icon-outline use { - /* icon secondary color - stroke */ - stroke: #7ea6f6; -} - -/* -------------------------------- - -Change icon size - --------------------------------- */ - -.icon-xs { - height: 0.5em; - width: 0.5em; -} - -.icon-sm { - height: 0.8em; - width: 0.8em; -} - -.icon-lg { - height: 1.6em; - width: 1.6em; -} - -.icon-xl { - height: 2em; - width: 2em; -} - -/* -------------------------------- - -Align icon and text - --------------------------------- */ - -.icon-text-aligner { - /* add this class to parent element that contains icon + text */ - display: flex; - align-items: center; -} - -.icon-text-aligner .icon { - color: inherit; - margin-right: 0.4em; -} - -.icon-text-aligner .icon use { - color: inherit; - fill: currentColor; -} - -.icon-text-aligner .icon.icon-outline use { - stroke: currentColor; -} - -/* -------------------------------- - -Icon reset values - used to enable color customizations - --------------------------------- */ - -.icon { - fill: currentColor; - stroke: none; -} - -.icon.icon-outline { - fill: none; - stroke: currentColor; -} - -.icon use { - stroke: none; -} - -.icon.icon-outline use { - fill: none; -} - -/* -------------------------------- - -Stroke effects - Nucleo outline icons - -- 16px icons -> up to 1px stroke (16px outline icons do not support stroke changes) -- 24px, 32px icons -> up to 2px stroke -- 48px, 64px icons -> up to 4px stroke - --------------------------------- */ - -.icon-outline.icon-stroke-1 { - stroke-width: 1px; -} - -.icon-outline.icon-stroke-2 { - stroke-width: 2px; -} - -.icon-outline.icon-stroke-3 { - stroke-width: 3px; -} - -.icon-outline.icon-stroke-4 { - stroke-width: 4px; -} - -.icon-outline.icon-stroke-1 use, -.icon-outline.icon-stroke-3 use { - -webkit-transform: translateX(0.5px) translateY(0.5px); - -moz-transform: translateX(0.5px) translateY(0.5px); - -ms-transform: translateX(0.5px) translateY(0.5px); - -o-transform: translateX(0.5px) translateY(0.5px); - transform: translateX(0.5px) translateY(0.5px); -} \ No newline at end of file diff --git a/frontend/src/assets/vendor/nucleo/css/nucleo.css b/frontend/src/assets/vendor/nucleo/css/nucleo.css deleted file mode 100644 index 481bf62c8..000000000 --- a/frontend/src/assets/vendor/nucleo/css/nucleo.css +++ /dev/null @@ -1,572 +0,0 @@ -/*-------------------------------- - -hermes-dashboard-icons Web Font - built using nucleoapp.com -License - nucleoapp.com/license/ - --------------------------------- */ -@font-face { - font-family: 'NucleoIcons'; - src: url('../fonts/nucleo-icons.eot'); - src: url('../fonts/nucleo-icons.eot') format('embedded-opentype'), url('../fonts/nucleo-icons.woff2') format('woff2'), url('../fonts/nucleo-icons.woff') format('woff'), url('../fonts/nucleo-icons.ttf') format('truetype'), url('../fonts/nucleo-icons.svg') format('svg'); - font-weight: normal; - font-style: normal; -} -/*------------------------ - base class definition --------------------------*/ -.ni { - display: inline-block; - font: normal normal normal 14px/1 NucleoIcons; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/*------------------------ - change icon size --------------------------*/ -.ni-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.ni-2x { - font-size: 2em; -} -.ni-3x { - font-size: 3em; -} -.ni-4x { - font-size: 4em; -} -.ni-5x { - font-size: 5em; -} - -/*---------------------------------- - add a square/circle background ------------------------------------*/ -.ni.square, -.ni.circle { - padding: 0.33333333em; - vertical-align: -16%; - background-color: #eee; -} -.ni.circle { - border-radius: 50%; -} -/*------------------------ - list icons --------------------------*/ -.ni-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.ni-ul > li { - position: relative; -} -.ni-ul > li > .ni { - position: absolute; - left: -1.57142857em; - top: 0.14285714em; - text-align: center; -} -.ni-ul > li > .ni.lg { - top: 0; - left: -1.35714286em; -} -.ni-ul > li > .ni.circle, -.ni-ul > li > .ni.square { - top: -0.19047619em; - left: -1.9047619em; -} -/*------------------------ - spinning icons --------------------------*/ -.ni.spin { - -webkit-animation: nc-spin 2s infinite linear; - -moz-animation: nc-spin 2s infinite linear; - animation: nc-spin 2s infinite linear; -} -@-webkit-keyframes nc-spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} -@-moz-keyframes nc-spin { - 0% { - -moz-transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - } -} -@keyframes nc-spin { - 0% { - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -o-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - transform: rotate(360deg); - } -} -/*------------------------ - rotated/flipped icons --------------------------*/ -.ni.rotate-90 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); -} -.ni.rotate-180 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); -} -.ni.rotate-270 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); -} -.ni.flip-y { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0); - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.ni.flip-x { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} -/*------------------------ - font icons --------------------------*/ - -.ni-active-40::before { - content: "\ea02"; -} - -.ni-air-baloon::before { - content: "\ea03"; -} - -.ni-album-2::before { - content: "\ea04"; -} - -.ni-align-center::before { - content: "\ea05"; -} - -.ni-align-left-2::before { - content: "\ea06"; -} - -.ni-ambulance::before { - content: "\ea07"; -} - -.ni-app::before { - content: "\ea08"; -} - -.ni-archive-2::before { - content: "\ea09"; -} - -.ni-atom::before { - content: "\ea0a"; -} - -.ni-badge::before { - content: "\ea0b"; -} - -.ni-bag-17::before { - content: "\ea0c"; -} - -.ni-basket::before { - content: "\ea0d"; -} - -.ni-bell-55::before { - content: "\ea0e"; -} - -.ni-bold-down::before { - content: "\ea0f"; -} - -.ni-bold-left::before { - content: "\ea10"; -} - -.ni-bold-right::before { - content: "\ea11"; -} - -.ni-bold-up::before { - content: "\ea12"; -} - -.ni-bold::before { - content: "\ea13"; -} - -.ni-book-bookmark::before { - content: "\ea14"; -} - -.ni-books::before { - content: "\ea15"; -} - -.ni-box-2::before { - content: "\ea16"; -} - -.ni-briefcase-24::before { - content: "\ea17"; -} - -.ni-building::before { - content: "\ea18"; -} - -.ni-bulb-61::before { - content: "\ea19"; -} - -.ni-bullet-list-67::before { - content: "\ea1a"; -} - -.ni-bus-front-12::before { - content: "\ea1b"; -} - -.ni-button-pause::before { - content: "\ea1c"; -} - -.ni-button-play::before { - content: "\ea1d"; -} - -.ni-button-power::before { - content: "\ea1e"; -} - -.ni-calendar-grid-58::before { - content: "\ea1f"; -} - -.ni-camera-compact::before { - content: "\ea20"; -} - -.ni-caps-small::before { - content: "\ea21"; -} - -.ni-cart::before { - content: "\ea22"; -} - -.ni-chart-bar-32::before { - content: "\ea23"; -} - -.ni-chart-pie-35::before { - content: "\ea24"; -} - -.ni-chat-round::before { - content: "\ea25"; -} - -.ni-check-bold::before { - content: "\ea26"; -} - -.ni-circle-08::before { - content: "\ea27"; -} - -.ni-cloud-download-95::before { - content: "\ea28"; -} - -.ni-cloud-upload-96::before { - content: "\ea29"; -} - -.ni-compass-04::before { - content: "\ea2a"; -} - -.ni-controller::before { - content: "\ea2b"; -} - -.ni-credit-card::before { - content: "\ea2c"; -} - -.ni-curved-next::before { - content: "\ea2d"; -} - -.ni-delivery-fast::before { - content: "\ea2e"; -} - -.ni-diamond::before { - content: "\ea2f"; -} - -.ni-email-83::before { - content: "\ea30"; -} - -.ni-fat-add::before { - content: "\ea31"; -} - -.ni-fat-delete::before { - content: "\ea32"; -} - -.ni-fat-remove::before { - content: "\ea33"; -} - -.ni-favourite-28::before { - content: "\ea34"; -} - -.ni-folder-17::before { - content: "\ea35"; -} - -.ni-glasses-2::before { - content: "\ea36"; -} - -.ni-hat-3::before { - content: "\ea37"; -} - -.ni-headphones::before { - content: "\ea38"; -} - -.ni-html5::before { - content: "\ea39"; -} - -.ni-istanbul::before { - content: "\ea3a"; -} - -.ni-key-25::before { - content: "\ea3b"; -} - -.ni-laptop::before { - content: "\ea3c"; -} - -.ni-like-2::before { - content: "\ea3d"; -} - -.ni-lock-circle-open::before { - content: "\ea3e"; -} - -.ni-map-big::before { - content: "\ea3f"; -} - -.ni-mobile-button::before { - content: "\ea40"; -} - -.ni-money-coins::before { - content: "\ea41"; -} - -.ni-note-03::before { - content: "\ea42"; -} - -.ni-notification-70::before { - content: "\ea43"; -} - -.ni-palette::before { - content: "\ea44"; -} - -.ni-paper-diploma::before { - content: "\ea45"; -} - -.ni-pin-3::before { - content: "\ea46"; -} - -.ni-planet::before { - content: "\ea47"; -} - -.ni-ruler-pencil::before { - content: "\ea48"; -} - -.ni-satisfied::before { - content: "\ea49"; -} - -.ni-scissors::before { - content: "\ea4a"; -} - -.ni-send::before { - content: "\ea4b"; -} - -.ni-settings-gear-65::before { - content: "\ea4c"; -} - -.ni-settings::before { - content: "\ea4d"; -} - -.ni-single-02::before { - content: "\ea4e"; -} - -.ni-single-copy-04::before { - content: "\ea4f"; -} - -.ni-sound-wave::before { - content: "\ea50"; -} - -.ni-spaceship::before { - content: "\ea51"; -} - -.ni-square-pin::before { - content: "\ea52"; -} - -.ni-support-16::before { - content: "\ea53"; -} - -.ni-tablet-button::before { - content: "\ea54"; -} - -.ni-tag::before { - content: "\ea55"; -} - -.ni-tie-bow::before { - content: "\ea56"; -} - -.ni-time-alarm::before { - content: "\ea57"; -} - -.ni-trophy::before { - content: "\ea58"; -} - -.ni-tv-2::before { - content: "\ea59"; -} - -.ni-umbrella-13::before { - content: "\ea5a"; -} - -.ni-user-run::before { - content: "\ea5b"; -} - -.ni-vector::before { - content: "\ea5c"; -} - -.ni-watch-time::before { - content: "\ea5d"; -} - -.ni-world::before { - content: "\ea5e"; -} - -.ni-zoom-split-in::before { - content: "\ea5f"; -} - -.ni-collection::before { - content: "\ea60"; -} - -.ni-image::before { - content: "\ea61"; -} - -.ni-shop::before { - content: "\ea62"; -} - -.ni-ungroup::before { - content: "\ea63"; -} - -.ni-world-2::before { - content: "\ea64"; -} - -.ni-ui-04::before { - content: "\ea65"; -} - - -/* all icon font classes list here */ diff --git a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.eot b/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.eot deleted file mode 100644 index ab96810ad..000000000 Binary files a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.eot and /dev/null differ diff --git a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.svg b/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.svg deleted file mode 100644 index 6654c1a2d..000000000 --- a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.svg +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.ttf b/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.ttf deleted file mode 100644 index 1a5598505..000000000 Binary files a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.ttf and /dev/null differ diff --git a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.woff b/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.woff deleted file mode 100644 index cb1924708..000000000 Binary files a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.woff and /dev/null differ diff --git a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.woff2 b/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.woff2 deleted file mode 100644 index e294e0801..000000000 Binary files a/frontend/src/assets/vendor/nucleo/fonts/nucleo-icons.woff2 and /dev/null differ diff --git a/frontend/src/components/ClipboardCopy.vue b/frontend/src/components/ClipboardCopy.vue new file mode 100644 index 000000000..b952dbd8c --- /dev/null +++ b/frontend/src/components/ClipboardCopy.vue @@ -0,0 +1,37 @@ + + diff --git a/frontend/src/views/Layout/ContentFooter.spec.js b/frontend/src/components/ContentFooter.spec.js similarity index 92% rename from frontend/src/views/Layout/ContentFooter.spec.js rename to frontend/src/components/ContentFooter.spec.js index 4b360d581..f67560e44 100644 --- a/frontend/src/views/Layout/ContentFooter.spec.js +++ b/frontend/src/components/ContentFooter.spec.js @@ -11,7 +11,7 @@ describe('ContentFooter', () => { $i18n: { locale: 'en', }, - $t: jest.fn((t) => t), + $t: jest.fn((t, options) => (options ? [t, options] : t)), } const Wrapper = () => { @@ -33,11 +33,11 @@ describe('ContentFooter', () => { }) it('renders the copyright year', () => { - expect(wrapper.find('div.copyright').text()).toMatch(/©\s*2[0-9]{3,3}\s+/) + expect(mocks.$t).toBeCalledWith('footer.copyright.year', { year: 2022 }) }) it('renders a link to Gradido-Akademie', () => { - expect(wrapper.find('div.copyright').find('a').text()).toEqual('Gradido-Akademie') + expect(wrapper.find('div.copyright').find('a').text()).toEqual('footer.copyright.link') }) it('links to the login page when clicked on copyright', () => { @@ -51,7 +51,7 @@ describe('ContentFooter', () => { it('shows the current version', async () => { wrapper.setData({ version: 1.23 }) await wrapper.vm.$nextTick() - expect(wrapper.find('div.copyright').findAll('a').at(1).text()).toEqual('App version 1.23') + expect(mocks.$t).toBeCalledWith('footer.app_version', { version: 1.23 }) }) it('links to latest release on GitHub', () => { @@ -64,7 +64,7 @@ describe('ContentFooter', () => { wrapper.setData({ shortHash: 'ACCEDED' }) wrapper.setData({ hash: 'ACCEDEDC001D00DC001D00DC001D00DC001CAFA' }) await wrapper.vm.$nextTick() - expect(wrapper.find('div.copyright').findAll('a').at(2).text()).toEqual('(ACCEDED)') + expect(mocks.$t).toBeCalledWith('footer.short_hash', { shortHash: 'ACCEDED' }) }) it('links to last release commit', async () => { @@ -78,7 +78,7 @@ describe('ContentFooter', () => { describe('links to gradido.net', () => { it('has a link to the legal notice', () => { - expect(wrapper.findAll('a.nav-link').at(0).text()).toEqual('imprint') + expect(wrapper.findAll('a.nav-link').at(0).text()).toEqual('footer.imprint') }) it('links to the https://gradido.net/en/impressum when locale is en', () => { @@ -88,7 +88,7 @@ describe('ContentFooter', () => { }) it('has a link to the privacy policy', () => { - expect(wrapper.findAll('a.nav-link').at(1).text()).toEqual('privacy_policy') + expect(wrapper.findAll('a.nav-link').at(1).text()).toEqual('footer.privacy_policy') }) it('links to the https://gradido.net/en/datenschutz when locale is en', () => { @@ -98,7 +98,7 @@ describe('ContentFooter', () => { }) it('has a link to the members area', () => { - expect(wrapper.findAll('a.nav-link').at(2).text()).toEqual('members_area') + expect(wrapper.findAll('a.nav-link').at(2).text()).toEqual('navigation.members_area') }) it('links to the elopage', () => { diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/components/ContentFooter.vue similarity index 75% rename from frontend/src/views/Layout/ContentFooter.vue rename to frontend/src/components/ContentFooter.vue index 4350e3f55..bdcb5b1a9 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/components/ContentFooter.vue @@ -1,26 +1,26 @@ - diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue deleted file mode 100644 index 28af9b2b4..000000000 --- a/frontend/src/components/DecayInformation.vue +++ /dev/null @@ -1,141 +0,0 @@ - - diff --git a/frontend/src/components/DecayInformations/CollapseLinksList.spec.js b/frontend/src/components/DecayInformations/CollapseLinksList.spec.js new file mode 100644 index 000000000..b533c6aa1 --- /dev/null +++ b/frontend/src/components/DecayInformations/CollapseLinksList.spec.js @@ -0,0 +1,126 @@ +import { mount } from '@vue/test-utils' +import CollapseLinksList from './CollapseLinksList' + +const localVue = global.localVue + +const mocks = { + $i18n: { + locale: 'en', + }, + $tc: jest.fn((tc) => tc), + $t: jest.fn((t) => t), +} + +const propsData = { + transactionLinks: [ + { + amount: '5', + code: 'ce28664b5308c17f931c0367', + createdAt: '2022-03-16T14:22:40.000Z', + holdAvailableAmount: '5.13109484759482747111', + id: 87, + memo: 'Eene meene Siegerpreis, vor mir steht ein Schokoeis. Hex-hex!', + redeemedAt: null, + validUntil: '2022-03-30T14:22:40.000Z', + }, + { + amount: '6', + code: 'ce28664b5308c17f931c0367', + createdAt: '2022-03-16T14:22:40.000Z', + holdAvailableAmount: '5.13109484759482747111', + id: 86, + memo: 'Eene meene buntes Laub, auf dem Schrank da liegt kein Staub.', + redeemedAt: null, + validUntil: '2022-03-30T14:22:40.000Z', + }, + ], + transactionLinkCount: 3, + value: 1, + pending: false, + pageSize: 5, +} + +describe('CollapseLinksList', () => { + let wrapper + + const Wrapper = () => { + return mount(CollapseLinksList, { localVue, mocks, propsData }) + } + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders the component div.collapse-links-list', () => { + expect(wrapper.find('div.collapse-links-list').exists()).toBeTruthy() + }) + + describe('load more links', () => { + beforeEach(async () => { + await wrapper.find('button.test-button-load-more').trigger('click') + }) + + it('emits input', () => { + expect(wrapper.emitted('input')).toEqual([[2]]) + }) + }) + + describe('reset transaction link list', () => { + beforeEach(async () => { + await wrapper + .findComponent({ name: 'TransactionLink' }) + .vm.$emit('reset-transaction-link-list') + }) + + it('emits input ', () => { + expect(wrapper.emitted('input')).toEqual([[0]]) + }) + }) + + describe('button text', () => { + describe('one more link to load', () => { + beforeEach(async () => { + await wrapper.setProps({ + value: 1, + pending: false, + pageSize: 5, + }) + }) + + it('renders text in singular', () => { + expect(mocks.$tc).toBeCalledWith('link-load', 0) + }) + }) + + describe('less than pageSize links to load', () => { + beforeEach(async () => { + await wrapper.setProps({ + value: 1, + pending: false, + pageSize: 5, + transactionLinkCount: 6, + }) + }) + + it('renders text in plural and shows the correct count of links', () => { + expect(mocks.$tc).toBeCalledWith('link-load', 1, { n: 4 }) + }) + }) + + describe('more than pageSize links to load', () => { + beforeEach(async () => { + await wrapper.setProps({ + value: 1, + pending: false, + pageSize: 5, + transactionLinkCount: 16, + }) + }) + + it('renders text in plural with page size links to load', () => { + expect(mocks.$tc).toBeCalledWith('link-load', 2, { n: 5 }) + }) + }) + }) + }) +}) diff --git a/frontend/src/components/DecayInformations/CollapseLinksList.vue b/frontend/src/components/DecayInformations/CollapseLinksList.vue new file mode 100644 index 000000000..0c1db5f0a --- /dev/null +++ b/frontend/src/components/DecayInformations/CollapseLinksList.vue @@ -0,0 +1,66 @@ + + diff --git a/frontend/src/components/DecayInformations/DecayInformation-BeforeStartblock.vue b/frontend/src/components/DecayInformations/DecayInformation-BeforeStartblock.vue new file mode 100644 index 000000000..c0f34e24d --- /dev/null +++ b/frontend/src/components/DecayInformations/DecayInformation-BeforeStartblock.vue @@ -0,0 +1,12 @@ + + diff --git a/frontend/src/components/DecayInformations/DecayInformation-Decay.vue b/frontend/src/components/DecayInformations/DecayInformation-Decay.vue new file mode 100644 index 000000000..6abacd2b8 --- /dev/null +++ b/frontend/src/components/DecayInformations/DecayInformation-Decay.vue @@ -0,0 +1,38 @@ + + diff --git a/frontend/src/components/DecayInformations/DecayInformation-DecayStartblock.vue b/frontend/src/components/DecayInformations/DecayInformation-DecayStartblock.vue new file mode 100644 index 000000000..5802bfb4b --- /dev/null +++ b/frontend/src/components/DecayInformations/DecayInformation-DecayStartblock.vue @@ -0,0 +1,65 @@ + + diff --git a/frontend/src/components/DecayInformations/DecayInformation-Long.vue b/frontend/src/components/DecayInformations/DecayInformation-Long.vue new file mode 100644 index 000000000..50e3d6697 --- /dev/null +++ b/frontend/src/components/DecayInformations/DecayInformation-Long.vue @@ -0,0 +1,94 @@ + + diff --git a/frontend/src/components/DecayInformations/DecayInformation-Short.vue b/frontend/src/components/DecayInformations/DecayInformation-Short.vue new file mode 100644 index 000000000..ba1f16d72 --- /dev/null +++ b/frontend/src/components/DecayInformations/DecayInformation-Short.vue @@ -0,0 +1,16 @@ + + diff --git a/frontend/src/components/DecayInformations/DecayInformation.vue b/frontend/src/components/DecayInformations/DecayInformation.vue new file mode 100644 index 000000000..ae76a5bb4 --- /dev/null +++ b/frontend/src/components/DecayInformations/DecayInformation.vue @@ -0,0 +1,48 @@ + + diff --git a/frontend/src/views/Pages/SendOverview/GddSend.spec.js b/frontend/src/components/GddSend.spec.js similarity index 100% rename from frontend/src/views/Pages/SendOverview/GddSend.spec.js rename to frontend/src/components/GddSend.spec.js diff --git a/frontend/src/components/GddSend.vue b/frontend/src/components/GddSend.vue new file mode 100644 index 000000000..e0d7c6eba --- /dev/null +++ b/frontend/src/components/GddSend.vue @@ -0,0 +1,26 @@ + + diff --git a/frontend/src/views/Pages/SendOverview/GddSend/QrCode.spec.js b/frontend/src/components/GddSend/QrCode.spec.js similarity index 100% rename from frontend/src/views/Pages/SendOverview/GddSend/QrCode.spec.js rename to frontend/src/components/GddSend/QrCode.spec.js diff --git a/frontend/src/views/Pages/SendOverview/GddSend/QrCode.vue b/frontend/src/components/GddSend/QrCode.vue similarity index 92% rename from frontend/src/views/Pages/SendOverview/GddSend/QrCode.vue rename to frontend/src/components/GddSend/QrCode.vue index 0146621ed..32e527cfe 100644 --- a/frontend/src/views/Pages/SendOverview/GddSend/QrCode.vue +++ b/frontend/src/components/GddSend/QrCode.vue @@ -1,5 +1,6 @@ - diff --git a/frontend/src/views/Pages/Login.spec.js b/frontend/src/pages/Login.spec.js similarity index 82% rename from frontend/src/views/Pages/Login.spec.js rename to frontend/src/pages/Login.spec.js index f9fde0e1e..e26888d49 100644 --- a/frontend/src/views/Pages/Login.spec.js +++ b/frontend/src/pages/Login.spec.js @@ -2,6 +2,8 @@ import { RouterLinkStub, mount } from '@vue/test-utils' import flushPromises from 'flush-promises' import Login from './Login' +import { toastErrorSpy } from '@test/testSetup' + const localVue = global.localVue const apolloQueryMock = jest.fn().mockResolvedValue({ @@ -10,12 +12,11 @@ const apolloQueryMock = jest.fn().mockResolvedValue({ name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }, }, }) -const toastErrorMock = jest.fn() const mockStoreDispach = jest.fn() const mockStoreCommit = jest.fn() const mockRouterPush = jest.fn() @@ -51,10 +52,8 @@ describe('Login', () => { $router: { push: mockRouterPush, }, - $toasted: { - global: { - error: toastErrorMock, - }, + $route: { + params: {}, }, $apollo: { query: apolloQueryMock, @@ -79,7 +78,7 @@ describe('Login', () => { name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }) }) @@ -96,13 +95,13 @@ describe('Login', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('Failed to get communities') + expect(toastErrorSpy).toBeCalledWith('Failed to get communities') }) }) describe('Login header', () => { it('has a welcome message', () => { - expect(wrapper.find('div.header').text()).toBe('Gradido site.login.community') + expect(wrapper.find('div.header').text()).toBe('site.login.heading site.login.community') }) }) @@ -111,8 +110,8 @@ describe('Login', () => { jest.clearAllMocks() mocks.$store.state.community = { name: 'Gradido Entwicklung', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register', + url: 'http://localhost/', + registerUrl: 'http://localhost/register', description: 'Die lokale Entwicklungsumgebung von Gradido.', } wrapper = Wrapper() @@ -140,8 +139,8 @@ describe('Login', () => { ) }) - it('links to /password when clicking "Forgot Password"', () => { - expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/password') + it('links to /forgot-password when clicking "Forgot Password"', () => { + expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/forgot-password') }) it('has a link "Create new account"', () => { @@ -228,13 +227,33 @@ describe('Login', () => { expect(mockStoreDispach).toBeCalledWith('login', 'token') }) - it('redirects to overview page', () => { - expect(mockRouterPush).toBeCalledWith('/overview') - }) - it('hides the spinner', () => { expect(spinnerHideMock).toBeCalled() }) + + describe('without code parameter', () => { + it('redirects to overview page', () => { + expect(mockRouterPush).toBeCalledWith('/overview') + }) + }) + + describe('with code parameter', () => { + beforeEach(async () => { + mocks.$route.params = { + code: 'some-code', + } + wrapper = Wrapper() + await wrapper.find('input[placeholder="Email"]').setValue('user@example.org') + await wrapper.find('input[placeholder="form.password"]').setValue('1234') + await flushPromises() + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('redirects to overview page', () => { + expect(mockRouterPush).toBeCalledWith('/redeem/some-code') + }) + }) }) describe('login fails', () => { @@ -249,7 +268,7 @@ describe('Login', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('error.no-account') + expect(toastErrorSpy).toBeCalledWith('error.no-account') }) describe('login fails with "User email not validated"', () => { @@ -285,8 +304,8 @@ describe('Login', () => { await flushPromises() }) - it('redirects to /reset/login', () => { - expect(mockRouterPush).toBeCalledWith('/reset/login') + it('redirects to /reset-password/login', () => { + expect(mockRouterPush).toBeCalledWith('/reset-password/login') }) }) }) diff --git a/frontend/src/views/Pages/Login.vue b/frontend/src/pages/Login.vue similarity index 80% rename from frontend/src/views/Pages/Login.vue rename to frontend/src/pages/Login.vue index 4d2b75d2a..79532cb21 100755 --- a/frontend/src/views/Pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -6,7 +6,7 @@
    -

    Gradido

    +

    {{ $t('site.login.heading') }}

    {{ $t('site.login.community') }}

    @@ -16,7 +16,7 @@ - +
    {{ $store.state.community.name }} @@ -44,7 +44,7 @@ - + {{ $t('settings.password.forgot_pwd') }} @@ -60,13 +60,13 @@
    + diff --git a/frontend/src/pages/Profile.spec.js b/frontend/src/pages/Profile.spec.js new file mode 100644 index 000000000..fb4ee2d42 --- /dev/null +++ b/frontend/src/pages/Profile.spec.js @@ -0,0 +1,46 @@ +import { shallowMount } from '@vue/test-utils' +import Profile from './Profile' + +const localVue = global.localVue + +describe('Profile', () => { + let wrapper + + const mocks = { + $t: jest.fn((t) => t), + } + + const Wrapper = () => { + return shallowMount(Profile, { localVue, mocks }) + } + + describe('shallow Mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('has a user card', () => { + expect(wrapper.findComponent({ name: 'UserCard' }).exists()).toBeTruthy() + }) + + it('has a user first and last name form', () => { + expect(wrapper.findComponent({ name: 'UserData' }).exists()).toBeTruthy() + }) + + it('has a user change language form', () => { + expect(wrapper.findComponent({ name: 'UserLanguage' }).exists()).toBeTruthy() + }) + + it('has a user change password form', () => { + expect(wrapper.findComponent({ name: 'UserPassword' }).exists()).toBeTruthy() + }) + + it('has a user change newsletter form', () => { + expect(wrapper.findComponent({ name: 'UserNewsletter' }).exists()).toBeTruthy() + }) + + it('has a user change coin animation form', () => { + expect(wrapper.findComponent({ name: 'UserCoinAnimation' }).exists()).toBeTruthy() + }) + }) +}) diff --git a/frontend/src/pages/Profile.vue b/frontend/src/pages/Profile.vue new file mode 100644 index 000000000..01308b29a --- /dev/null +++ b/frontend/src/pages/Profile.vue @@ -0,0 +1,59 @@ + + + diff --git a/frontend/src/views/Pages/Register.spec.js b/frontend/src/pages/Register.spec.js similarity index 70% rename from frontend/src/views/Pages/Register.spec.js rename to frontend/src/pages/Register.spec.js index 820229a4a..446c97928 100644 --- a/frontend/src/views/Pages/Register.spec.js +++ b/frontend/src/pages/Register.spec.js @@ -1,8 +1,9 @@ import { mount, RouterLinkStub } from '@vue/test-utils' import flushPromises from 'flush-promises' - import Register from './Register' +import { toastErrorSpy } from '@test/testSetup' + const localVue = global.localVue const apolloQueryMock = jest.fn().mockResolvedValue({ @@ -11,12 +12,11 @@ const apolloQueryMock = jest.fn().mockResolvedValue({ name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }, }, }) -const toastErrorMock = jest.fn() const mockStoreCommit = jest.fn() const registerUserMutationMock = jest.fn() const routerPushMock = jest.fn() @@ -32,6 +32,9 @@ describe('Register', () => { $router: { push: routerPushMock, }, + $route: { + params: {}, + }, $apollo: { mutate: registerUserMutationMock, query: apolloQueryMock, @@ -48,11 +51,6 @@ describe('Register', () => { publisherId: 12345, }, }, - $toasted: { - global: { - error: toastErrorMock, - }, - }, } const stubs = { @@ -73,7 +71,7 @@ describe('Register', () => { name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }) }) @@ -96,7 +94,7 @@ describe('Register', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('Failed to get communities') + expect(toastErrorSpy).toBeCalledWith('Failed to get communities') }) }) @@ -105,8 +103,8 @@ describe('Register', () => { jest.clearAllMocks() mocks.$store.state.community = { name: 'Gradido Entwicklung', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register', + url: 'http://localhost/', + registerUrl: 'http://localhost/register', description: 'Die lokale Entwicklungsumgebung von Gradido.', } wrapper = Wrapper() @@ -214,21 +212,55 @@ describe('Register', () => { }) */ - describe('API calls', () => { + describe('API calls when form is missing input', () => { + beforeEach(() => { + wrapper.find('#registerFirstname').setValue('Max') + wrapper.find('#registerLastname').setValue('Mustermann') + wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() + wrapper.find('#publisherid').setValue('12345') + }) + it('has disabled submit button when missing input checked box', () => { + wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') + }) + + it('has disabled submit button when missing email input', () => { + wrapper.find('#registerCheckbox').setChecked() + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') + }) + }) + + describe('API calls when completely filled and missing publisherid', () => { + beforeEach(() => { + wrapper.find('#registerFirstname').setValue('Max') + wrapper.find('#registerLastname').setValue('Mustermann') + wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') + wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() + wrapper.find('#registerCheckbox').setChecked() + }) + it('has enabled submit button when completely filled', async () => { + await wrapper.vm.$nextTick() + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe(undefined) + }) + }) + + describe('API calls when completely filled', () => { beforeEach(() => { wrapper.find('#registerFirstname').setValue('Max') wrapper.find('#registerLastname').setValue('Mustermann') wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() wrapper.find('#publisherid').setValue('12345') + wrapper.find('#registerCheckbox').setChecked() }) it('commits publisherId to store', () => { expect(mockStoreCommit).toBeCalledWith('publisherId', 12345) }) - it('has enabled submit button when completely filled', () => { - expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') + it('has enabled submit button when completely filled', async () => { + await wrapper.vm.$nextTick() + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe(undefined) }) describe('server sends back error', () => { @@ -241,7 +273,7 @@ describe('Register', () => { it('shows error message', () => { expect(wrapper.find('span.alert-text').exists()).toBeTruthy() expect(wrapper.find('span.alert-text').text().length !== 0).toBeTruthy() - expect(wrapper.find('span.alert-text').text()).toContain('error.error!') + expect(wrapper.find('span.alert-text').text()).toContain('error.error') expect(wrapper.find('span.alert-text').text()).toContain('Ouch!') }) @@ -283,6 +315,45 @@ describe('Register', () => { }) }) }) - // TODO: line 157 + + describe('redeem code', () => { + describe('no redeem code', () => { + it('has no redeem code', () => { + expect(wrapper.vm.redeemCode).toBe(undefined) + }) + }) + }) + + describe('with redeem code', () => { + beforeEach(async () => { + jest.clearAllMocks() + mocks.$route.params = { + code: 'some-code', + } + wrapper = Wrapper() + wrapper.find('#registerFirstname').setValue('Max') + wrapper.find('#registerLastname').setValue('Mustermann') + wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') + wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() + wrapper.find('#registerCheckbox').setChecked() + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('sends the redeem code to the server', () => { + expect(registerUserMutationMock).toBeCalledWith( + expect.objectContaining({ + variables: { + email: 'max.mustermann@gradido.net', + firstName: 'Max', + lastName: 'Mustermann', + language: 'en', + publisherId: 12345, + redeemCode: 'some-code', + }, + }), + ) + }) + }) }) }) diff --git a/frontend/src/views/Pages/Register.vue b/frontend/src/pages/Register.vue similarity index 89% rename from frontend/src/views/Pages/Register.vue rename to frontend/src/pages/Register.vue index 070d80bb9..cadc0f34c 100755 --- a/frontend/src/views/Pages/Register.vue +++ b/frontend/src/pages/Register.vue @@ -20,7 +20,7 @@ - +
    {{ $store.state.community.name }} @@ -100,6 +100,7 @@ v-model="form.agree" :name="$t('site.signup.agree')" > + @@ -108,23 +109,23 @@ v-if="showError" show dismissible - variant="warning" + variant="danger" @dismissed="closeAlert" > - {{ $t('error.error') }}! + {{ $t('error.error') }} {{ messageError }} + - - {{ $t('publisher.publisherId') }} : {{ $store.state.publisherId }} - + {{ $t('publisher.publisherId') }} {{ $store.state.publisherId }} + @@ -137,7 +138,7 @@ type="text" placeholder="Publisher ID" v-model="publisherId" - @input="commitStore(publisherId)" + @input="commitStorePublisherId(publisherId)" >
    {{ $t('publisher.infoText') }} - {{ $t('publisher.infoNoRegister') }}
    @@ -162,9 +162,9 @@ {{ $t('signup') }} @@ -189,15 +189,14 @@
    - diff --git a/frontend/src/views/Pages/RegisterCommunity.spec.js b/frontend/src/pages/RegisterCommunity.spec.js similarity index 89% rename from frontend/src/views/Pages/RegisterCommunity.spec.js rename to frontend/src/pages/RegisterCommunity.spec.js index 477e5e08e..deb1d999d 100644 --- a/frontend/src/views/Pages/RegisterCommunity.spec.js +++ b/frontend/src/pages/RegisterCommunity.spec.js @@ -1,6 +1,8 @@ import { mount, RouterLinkStub } from '@vue/test-utils' import RegisterCommunity from './RegisterCommunity' +import { toastErrorSpy } from '@test/testSetup' + const localVue = global.localVue const apolloQueryMock = jest.fn().mockResolvedValue({ @@ -9,11 +11,11 @@ const apolloQueryMock = jest.fn().mockResolvedValue({ name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }, }, }) -const toastErrorMock = jest.fn() + const mockStoreCommit = jest.fn() describe('RegisterCommunity', () => { @@ -36,11 +38,6 @@ describe('RegisterCommunity', () => { }, }, }, - $toasted: { - global: { - error: toastErrorMock, - }, - }, } const stubs = { @@ -61,7 +58,7 @@ describe('RegisterCommunity', () => { name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }) }) @@ -78,7 +75,7 @@ describe('RegisterCommunity', () => { }) it('toasts an error message', () => { - expect(toastErrorMock).toBeCalledWith('Failed to get communities') + expect(toastErrorSpy).toBeCalledWith('Failed to get communities') }) }) @@ -87,8 +84,8 @@ describe('RegisterCommunity', () => { jest.clearAllMocks() mocks.$store.state.community = { name: 'Gradido Entwicklung', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register', + url: 'http://localhost/', + registerUrl: 'http://localhost/register', description: 'Die lokale Entwicklungsumgebung von Gradido.', } wrapper = Wrapper() diff --git a/frontend/src/views/Pages/RegisterCommunity.vue b/frontend/src/pages/RegisterCommunity.vue similarity index 93% rename from frontend/src/views/Pages/RegisterCommunity.vue rename to frontend/src/pages/RegisterCommunity.vue index 594c69571..736a4282f 100644 --- a/frontend/src/views/Pages/RegisterCommunity.vue +++ b/frontend/src/pages/RegisterCommunity.vue @@ -49,11 +49,10 @@
    - diff --git a/frontend/src/pages/ResetPassword.spec.js b/frontend/src/pages/ResetPassword.spec.js new file mode 100644 index 000000000..c43f71932 --- /dev/null +++ b/frontend/src/pages/ResetPassword.spec.js @@ -0,0 +1,255 @@ +import { mount, RouterLinkStub } from '@vue/test-utils' +import ResetPassword from './ResetPassword' +import flushPromises from 'flush-promises' + +import { toastErrorSpy } from '@test/testSetup' + +// validation is tested in src/components/UserSettings/UserPassword.spec.js + +const localVue = global.localVue + +const apolloMutationMock = jest.fn() +const apolloQueryMock = jest.fn().mockResolvedValue() + +const routerPushMock = jest.fn() + +const stubs = { + RouterLink: RouterLinkStub, +} + +const mocks = { + $i18n: { + locale: 'en', + }, + $t: jest.fn((t) => t), + $route: { + params: { + optin: '123', + }, + path: { + mock: 'checkEmail', + includes: jest.fn((t) => t === mocks.$route.path.mock), + }, + }, + $router: { + push: routerPushMock, + }, + $loading: { + show: jest.fn(() => { + return { hide: jest.fn() } + }), + }, + $apollo: { + mutate: apolloMutationMock, + query: apolloQueryMock, + }, +} + +describe('ResetPassword', () => { + let wrapper + + const Wrapper = () => { + return mount(ResetPassword, { localVue, mocks, stubs }) + } + + describe('mount', () => { + beforeEach(() => { + jest.clearAllMocks() + wrapper = Wrapper() + }) + + describe('no valid optin', () => { + beforeEach(() => { + jest.clearAllMocks() + apolloQueryMock.mockRejectedValue({ message: 'Your time is up!' }) + wrapper = Wrapper() + }) + + it('toasts an error when no valid optin is given', () => { + expect(toastErrorSpy).toHaveBeenCalledWith('Your time is up!') + }) + + it('redirects to /forgot-password/resetPassword', () => { + expect(routerPushMock).toBeCalledWith('/forgot-password/resetPassword') + }) + }) + + describe('valid optin', () => { + it('renders the Reset Password form when authenticated', () => { + expect(wrapper.find('div.resetpwd-form').exists()).toBeTruthy() + }) + + describe('Register header', () => { + describe('from reset', () => { + beforeEach(() => { + mocks.$route.path.mock = 'reset-password' + wrapper = Wrapper() + }) + + it('has a welcome message', async () => { + expect(wrapper.find('div.header').text()).toContain('settings.password.reset') + expect(wrapper.find('div.header').text()).toContain( + 'settings.password.reset-password.text', + ) + }) + }) + + describe('from checkEmail', () => { + beforeEach(() => { + mocks.$route.path.mock = 'checkEmail' + wrapper = Wrapper() + }) + + it('has a welcome message', async () => { + expect(wrapper.find('div.header').text()).toContain('settings.password.set') + expect(wrapper.find('div.header').text()).toContain( + 'settings.password.set-password.text', + ) + }) + }) + }) + + describe('links', () => { + it('has a link "Back"', async () => { + expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual('back') + }) + + it('links to /login when clicking "Back"', async () => { + expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/login') + }) + }) + + describe('reset password form', () => { + it('has a register form', async () => { + expect(wrapper.find('form').exists()).toBeTruthy() + }) + + it('has 2 password input fields', async () => { + expect(wrapper.findAll('input[type="password"]').length).toBe(2) + }) + + it('toggles the first input field to text when eye icon is clicked', async () => { + await wrapper.findAll('button').at(0).trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.findAll('input').at(0).attributes('type')).toBe('text') + }) + + it('toggles the second input field to text when eye icon is clicked', async () => { + wrapper.findAll('button').at(1).trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.findAll('input').at(1).attributes('type')).toBe('text') + }) + }) + + describe('submit form', () => { + beforeEach(async () => { + await wrapper.findAll('input').at(0).setValue('Aa123456_') + await wrapper.findAll('input').at(1).setValue('Aa123456_') + await flushPromises() + }) + + describe('server response with error code > 10min', () => { + beforeEach(async () => { + apolloMutationMock.mockRejectedValue({ message: '...Code is older than 10 minutes' }) + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('toasts an error message', () => { + expect(toastErrorSpy).toHaveBeenCalledWith('...Code is older than 10 minutes') + }) + + it('router pushes to /forgot-password/resetPassword', () => { + expect(routerPushMock).toHaveBeenCalledWith('/forgot-password/resetPassword') + }) + }) + + describe('server response with error', () => { + beforeEach(async () => { + jest.clearAllMocks() + apolloMutationMock.mockRejectedValueOnce({ message: 'Error' }) + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('toasts an error message', () => { + expect(toastErrorSpy).toHaveBeenCalledWith('Error') + }) + }) + + describe('server response with success on /checkEmail', () => { + beforeEach(async () => { + jest.clearAllMocks() + mocks.$route.path.mock = 'checkEmail' + apolloMutationMock.mockResolvedValue({ + data: { + resetPassword: 'success', + }, + }) + await wrapper.findAll('input').at(0).setValue('Aa123456_') + await wrapper.findAll('input').at(1).setValue('Aa123456_') + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('calls the API', () => { + expect(apolloMutationMock).toBeCalledWith( + expect.objectContaining({ + variables: { + code: '123', + password: 'Aa123456_', + }, + }), + ) + }) + + it('redirects to "/thx/checkEmail"', () => { + expect(routerPushMock).toHaveBeenCalledWith('/thx/checkEmail') + }) + + describe('with param code', () => { + beforeEach(async () => { + mocks.$route.params.code = 'the-most-secret-code-ever' + apolloMutationMock.mockResolvedValue({ + data: { + resetPassword: 'success', + }, + }) + wrapper = Wrapper() + await wrapper.findAll('input').at(0).setValue('Aa123456_') + await wrapper.findAll('input').at(1).setValue('Aa123456_') + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('redirects to "/thx/checkEmail/the-most-secret-code-ever"', () => { + expect(routerPushMock).toHaveBeenCalledWith( + '/thx/checkEmail/the-most-secret-code-ever', + ) + }) + }) + }) + + describe('server response with success on /reset-password', () => { + beforeEach(async () => { + mocks.$route.path.mock = 'reset-password' + wrapper = Wrapper() + apolloMutationMock.mockResolvedValue({ + data: { + resetPassword: 'success', + }, + }) + await wrapper.findAll('input').at(0).setValue('Aa123456_') + await wrapper.findAll('input').at(1).setValue('Aa123456_') + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('redirects to "/thx/resetPassword"', () => { + expect(routerPushMock).toHaveBeenCalledWith('/thx/resetPassword') + }) + }) + }) + }) + }) +}) diff --git a/frontend/src/views/Pages/ResetPassword.vue b/frontend/src/pages/ResetPassword.vue similarity index 58% rename from frontend/src/views/Pages/ResetPassword.vue rename to frontend/src/pages/ResetPassword.vue index 3e6aef339..7771be5f6 100644 --- a/frontend/src/views/Pages/ResetPassword.vue +++ b/frontend/src/pages/ResetPassword.vue @@ -5,10 +5,12 @@
    -

    {{ $t('settings.password.reset') }}

    + +

    {{ $t(displaySetup.title) }}

    - {{ $t('settings.password.reset-password.text') }} + + {{ $t(displaySetup.text) }}
    @@ -19,13 +21,14 @@ - +
    + {{ $t(displaySetup.button) }}
    @@ -44,19 +47,20 @@
    - diff --git a/frontend/src/views/Pages/RegisterSelectCommunity.spec.js b/frontend/src/pages/SelectCommunity.spec.js similarity index 80% rename from frontend/src/views/Pages/RegisterSelectCommunity.spec.js rename to frontend/src/pages/SelectCommunity.spec.js index ad80c7e38..f8896ae15 100644 --- a/frontend/src/views/Pages/RegisterSelectCommunity.spec.js +++ b/frontend/src/pages/SelectCommunity.spec.js @@ -1,6 +1,8 @@ import { mount, RouterLinkStub } from '@vue/test-utils' -import { communities, communityInfo } from '../../graphql/queries' -import RegisterSelectCommunity from './RegisterSelectCommunity' +import { communities, communityInfo } from '@/graphql/queries' +import SelectCommunity from './SelectCommunity' + +import { toastErrorSpy } from '@test/testSetup' const localVue = global.localVue @@ -20,7 +22,7 @@ const apolloQueryMock = jest name: 'test12', description: 'test community 12', url: 'http://test12.test12/', - registerUrl: 'http://test12.test12/vue/register', + registerUrl: 'http://test12.test12/register', }, }, }) @@ -31,31 +33,30 @@ const apolloQueryMock = jest id: 1, name: 'Gradido Entwicklung', description: 'Die lokale Entwicklungsumgebung von Gradido.', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register-community', + url: 'http://localhost/', + registerUrl: 'http://localhost/register-community', }, { id: 2, name: 'Gradido Staging', description: 'Der Testserver der Gradido-Akademie.', - url: 'https://stage1.gradido.net/vue/', - registerUrl: 'https://stage1.gradido.net/vue/register-community', + url: 'https://stage1.gradido.net/', + registerUrl: 'https://stage1.gradido.net/register-community', }, { id: 3, name: 'Gradido-Akademie', description: 'Freies Institut für Wirtschaftsbionik.', url: 'https://gradido.net', - registerUrl: 'https://gdd1.gradido.com/vue/register-community', + registerUrl: 'https://gdd1.gradido.com/register-community', }, ], }, }) -const toasterMock = jest.fn() const mockStoreCommit = jest.fn() -describe('RegisterSelectCommunity', () => { +describe('SelectCommunity', () => { let wrapper const mocks = { @@ -78,11 +79,6 @@ describe('RegisterSelectCommunity', () => { $loading: { show: spinnerMock, }, - $toasted: { - global: { - error: toasterMock, - }, - }, } const stubs = { @@ -90,7 +86,7 @@ describe('RegisterSelectCommunity', () => { } const Wrapper = () => { - return mount(RegisterSelectCommunity, { localVue, mocks, stubs }) + return mount(SelectCommunity, { localVue, mocks, stubs }) } describe('mount', () => { @@ -129,7 +125,7 @@ describe('RegisterSelectCommunity', () => { }) it('toasts an error message', () => { - expect(toasterMock).toBeCalledWith('Failed to get communities') + expect(toastErrorSpy).toBeCalledWith('Failed to get communities') }) }) @@ -139,8 +135,8 @@ describe('RegisterSelectCommunity', () => { mocks.$store.state.community = { name: 'Gradido Entwicklung', description: 'Die lokale Entwicklungsumgebung von Gradido.', - url: 'http://localhost/vue/', - registerUrl: 'http://localhost/vue/register-community', + url: 'http://localhost/', + registerUrl: 'http://localhost/register-community', } wrapper = Wrapper() }) @@ -172,15 +168,15 @@ describe('RegisterSelectCommunity', () => { id: 2, name: 'Gradido Staging', description: 'Der Testserver der Gradido-Akademie.', - url: 'https://stage1.gradido.net/vue/', - registerUrl: 'https://stage1.gradido.net/vue/register-community', + url: 'https://stage1.gradido.net/', + registerUrl: 'https://stage1.gradido.net/register-community', }, { id: 3, name: 'Gradido-Akademie', description: 'Freies Institut für Wirtschaftsbionik.', url: 'https://gradido.net', - registerUrl: 'https://gdd1.gradido.com/vue/register-community', + registerUrl: 'https://gdd1.gradido.com/register-community', }, ], }) @@ -208,7 +204,7 @@ describe('RegisterSelectCommunity', () => { }) it('toast an error', () => { - expect(toasterMock).toBeCalledWith('Wrong thing') + expect(toastErrorSpy).toBeCalledWith('Wrong thing') }) it('hides the spinner', () => { diff --git a/frontend/src/views/Pages/RegisterSelectCommunity.vue b/frontend/src/pages/SelectCommunity.vue similarity index 92% rename from frontend/src/views/Pages/RegisterSelectCommunity.vue rename to frontend/src/pages/SelectCommunity.vue index ab46da03f..0535e4fe7 100644 --- a/frontend/src/views/Pages/RegisterSelectCommunity.vue +++ b/frontend/src/pages/SelectCommunity.vue @@ -48,11 +48,11 @@
    diff --git a/frontend/src/pages/TransactionLink.spec.js b/frontend/src/pages/TransactionLink.spec.js new file mode 100644 index 000000000..8c41d0a92 --- /dev/null +++ b/frontend/src/pages/TransactionLink.spec.js @@ -0,0 +1,360 @@ +import { mount } from '@vue/test-utils' +import TransactionLink from './TransactionLink' +import { queryTransactionLink } from '@/graphql/queries' +import { redeemTransactionLink } from '@/graphql/mutations' +import { toastSuccessSpy, toastErrorSpy } from '@test/testSetup' + +const localVue = global.localVue + +const apolloQueryMock = jest.fn() +const apolloMutateMock = jest.fn() +const routerPushMock = jest.fn() + +const now = new Date().toISOString() + +const transactionLinkValidExpireDate = () => { + const validUntil = new Date() + return new Date(validUntil.setDate(new Date().getDate() + 14)).toISOString() +} + +apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: transactionLinkValidExpireDate(), + redeemedAt: '2022-03-18T10:08:43.000Z', + deletedAt: null, + user: { firstName: 'Bibi', publisherId: 0, email: 'bibi@bloxberg.de' }, + }, + }, +}) + +const mocks = { + $t: jest.fn((t, obj = null) => (obj ? [t, obj.date].join('; ') : t)), + $store: { + state: { + token: null, + email: 'bibi@bloxberg.de', + }, + }, + $apollo: { + query: apolloQueryMock, + mutate: apolloMutateMock, + }, + $route: { + params: { + code: 'some-code', + }, + }, + $router: { + push: routerPushMock, + }, +} + +describe('TransactionLink', () => { + let wrapper + + const Wrapper = () => { + return mount(TransactionLink, { localVue, mocks }) + } + + describe('mount', () => { + beforeEach(() => { + jest.clearAllMocks() + wrapper = Wrapper() + }) + + it('renders the component', () => { + expect(wrapper.find('div.show-transaction-link-informations').exists()).toBe(true) + }) + + it('calls the queryTransactionLink query', () => { + expect(apolloQueryMock).toBeCalledWith({ + query: queryTransactionLink, + variables: { + code: 'some-code', + }, + }) + }) + + describe('deleted link', () => { + beforeEach(() => { + apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: transactionLinkValidExpireDate(), + redeemedAt: '2022-03-18T10:08:43.000Z', + deletedAt: now, + user: { firstName: 'Bibi', publisherId: 0, email: 'bibi@bloxberg.de' }, + }, + }, + }) + wrapper = Wrapper() + }) + + it('has a component RedeemedTextBox', () => { + expect(wrapper.findComponent({ name: 'RedeemedTextBox' }).exists()).toBe(true) + }) + + it('has a link deleted text in text box', () => { + expect(wrapper.findComponent({ name: 'RedeemedTextBox' }).text()).toContain( + 'gdd_per_link.link-deleted; ' + now, + ) + }) + }) + + describe('expired link', () => { + beforeEach(() => { + apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: '2020-03-18T10:08:43.000Z', + redeemedAt: '2022-03-18T10:08:43.000Z', + deletedAt: null, + user: { firstName: 'Bibi', publisherId: 0, email: 'bibi@bloxberg.de' }, + }, + }, + }) + wrapper = Wrapper() + }) + + it('has a component RedeemedTextBox', () => { + expect(wrapper.findComponent({ name: 'RedeemedTextBox' }).exists()).toBe(true) + }) + + it('has a link deleted text in text box', () => { + expect(wrapper.findComponent({ name: 'RedeemedTextBox' }).text()).toContain( + 'gdd_per_link.link-expired; 2020-03-18T10:08:43.000Z', + ) + }) + }) + + describe('redeemed link', () => { + beforeEach(() => { + apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: transactionLinkValidExpireDate(), + redeemedAt: '2022-03-18T10:08:43.000Z', + deletedAt: null, + user: { firstName: 'Bibi', publisherId: 0, email: 'bibi@bloxberg.de' }, + }, + }, + }) + wrapper = Wrapper() + }) + + it('has a component RedeemedTextBox', () => { + expect(wrapper.findComponent({ name: 'RedeemedTextBox' }).exists()).toBe(true) + }) + + it('has a link deleted text in text box', () => { + expect(wrapper.findComponent({ name: 'RedeemedTextBox' }).text()).toContain( + 'gdd_per_link.redeemed-at; 2022-03-18T10:08:43.000Z', + ) + }) + }) + + describe('no token in store', () => { + beforeEach(() => { + apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: transactionLinkValidExpireDate(), + redeemedAt: null, + deletedAt: null, + user: { firstName: 'Bibi', publisherId: 0, email: 'bibi@bloxberg.de' }, + }, + }, + }) + wrapper = Wrapper() + }) + + it('has a RedeemLoggedOut component', () => { + expect(wrapper.findComponent({ name: 'RedeemLoggedOut' }).exists()).toBe(true) + }) + + it('has a link to register with code', () => { + expect(wrapper.find('a[href="/register/some-code"]').exists()).toBe(true) + }) + + it('has a link to login with code', () => { + expect(wrapper.find('a[href="/login/some-code"]').exists()).toBe(true) + }) + }) + + describe('token in store and own link', () => { + beforeEach(() => { + mocks.$store.state.token = 'token' + apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: transactionLinkValidExpireDate(), + redeemedAt: null, + deletedAt: null, + user: { firstName: 'Bibi', publisherId: 0, email: 'bibi@bloxberg.de' }, + }, + }, + }) + wrapper = Wrapper() + }) + + it('has a RedeemSelfCreator component', () => { + expect(wrapper.findComponent({ name: 'RedeemSelfCreator' }).exists()).toBe(true) + }) + + it('has a no redeem text', () => { + expect(wrapper.findComponent({ name: 'RedeemSelfCreator' }).text()).toContain( + 'gdd_per_link.no-redeem', + ) + }) + + it('has a link to transaction page', () => { + expect(wrapper.find('a[to="/transactions"]').exists()).toBe(true) + }) + }) + + describe('valid link', () => { + beforeEach(() => { + mocks.$store.state.token = 'token' + apolloQueryMock.mockResolvedValue({ + data: { + queryTransactionLink: { + id: 92, + amount: '22', + memo: 'Abrakadabra drei, vier, fünf, sechs, hier steht jetzt ein Memotext! Hex hex ', + createdAt: '2022-03-17T16:10:28.000Z', + validUntil: transactionLinkValidExpireDate(), + redeemedAt: null, + deletedAt: null, + user: { firstName: 'Peter', publisherId: 0, email: 'peter@listig.de' }, + }, + }, + }) + wrapper = Wrapper() + }) + + it('has a RedeemValid component', () => { + expect(wrapper.findComponent({ name: 'RedeemValid' }).exists()).toBe(true) + }) + + it('has a button with redeem text', () => { + expect(wrapper.findComponent({ name: 'RedeemValid' }).find('button').text()).toBe( + 'gdd_per_link.redeem', + ) + }) + + describe('redeem link with success', () => { + let spy + + beforeEach(async () => { + spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') + apolloMutateMock.mockResolvedValue() + spy.mockImplementation(() => Promise.resolve(true)) + await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') + }) + + it('opens the modal', () => { + expect(spy).toBeCalledWith('gdd_per_link.redeem-text') + }) + + it('calls the API', () => { + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + mutation: redeemTransactionLink, + variables: { + code: 'some-code', + }, + }), + ) + }) + + it('toasts a success message', () => { + expect(mocks.$t).toBeCalledWith('gdd_per_link.redeemed', { n: '22' }) + expect(toastSuccessSpy).toBeCalledWith('gdd_per_link.redeemed; ') + }) + + it('pushes the route to overview', () => { + expect(routerPushMock).toBeCalledWith('/overview') + }) + }) + + describe('cancel redeem link', () => { + let spy + + beforeEach(async () => { + spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') + apolloMutateMock.mockResolvedValue() + spy.mockImplementation(() => Promise.resolve(false)) + await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') + }) + + it('does not call the API', () => { + expect(apolloMutateMock).not.toBeCalled() + }) + + it('does not toasts a success message', () => { + expect(mocks.$t).not.toBeCalledWith('gdd_per_link.redeemed', { n: '22' }) + expect(toastSuccessSpy).not.toBeCalled() + }) + + it('does not push the route', () => { + expect(routerPushMock).not.toBeCalled() + }) + }) + + describe('redeem link with error', () => { + let spy + + beforeEach(async () => { + spy = jest.spyOn(wrapper.vm.$bvModal, 'msgBoxConfirm') + apolloMutateMock.mockRejectedValue({ message: 'Oh Noo!' }) + spy.mockImplementation(() => Promise.resolve(true)) + await wrapper.findComponent({ name: 'RedeemValid' }).find('button').trigger('click') + }) + + it('toasts an error message', () => { + expect(toastErrorSpy).toBeCalledWith('Oh Noo!') + }) + + it('pushes the route to overview', () => { + expect(routerPushMock).toBeCalledWith('/overview') + }) + }) + }) + + describe('error on transaction link query', () => { + beforeEach(() => { + apolloQueryMock.mockRejectedValue({ message: 'Ouchh!' }) + wrapper = Wrapper() + }) + + it('toasts an error message', () => { + expect(toastErrorSpy).toBeCalledWith('Ouchh!') + }) + }) + }) +}) diff --git a/frontend/src/pages/TransactionLink.vue b/frontend/src/pages/TransactionLink.vue new file mode 100644 index 000000000..def8e2e7c --- /dev/null +++ b/frontend/src/pages/TransactionLink.vue @@ -0,0 +1,148 @@ + + diff --git a/frontend/src/views/Pages/UserProfileTransactionList.spec.js b/frontend/src/pages/Transactions.spec.js similarity index 93% rename from frontend/src/views/Pages/UserProfileTransactionList.spec.js rename to frontend/src/pages/Transactions.spec.js index a9ab48a19..25bc05985 100644 --- a/frontend/src/views/Pages/UserProfileTransactionList.spec.js +++ b/frontend/src/pages/Transactions.spec.js @@ -1,11 +1,11 @@ import { mount } from '@vue/test-utils' -import UserProfileTransactionList from './UserProfileTransactionList' +import Transactions from './Transactions' const localVue = global.localVue window.scrollTo = jest.fn() -describe('UserProfileTransactionList', () => { +describe('Transactions', () => { let wrapper const mocks = { @@ -22,7 +22,7 @@ describe('UserProfileTransactionList', () => { } const Wrapper = () => { - return mount(UserProfileTransactionList, { localVue, mocks, stubs }) + return mount(Transactions, { localVue, mocks, stubs }) } describe('mount', () => { diff --git a/frontend/src/views/Pages/UserProfileTransactionList.vue b/frontend/src/pages/Transactions.vue similarity index 52% rename from frontend/src/views/Pages/UserProfileTransactionList.vue rename to frontend/src/pages/Transactions.vue index f9240008d..9b2ad6fdf 100644 --- a/frontend/src/views/Pages/UserProfileTransactionList.vue +++ b/frontend/src/pages/Transactions.vue @@ -1,19 +1,25 @@ diff --git a/frontend/src/views/Pages/thx.spec.js b/frontend/src/pages/thx.spec.js similarity index 68% rename from frontend/src/views/Pages/thx.spec.js rename to frontend/src/pages/thx.spec.js index f1bc59b80..0ba19bf03 100644 --- a/frontend/src/views/Pages/thx.spec.js +++ b/frontend/src/pages/thx.spec.js @@ -23,7 +23,7 @@ describe('Thx', () => { describe('mount', () => { beforeEach(() => { - wrapper = Wrapper(createMockObject('password')) + wrapper = Wrapper(createMockObject('forgotPassword')) }) it('renders the thx page', () => { @@ -35,9 +35,9 @@ describe('Thx', () => { }) }) - describe('coming from /password', () => { + describe('coming from /forgot-password', () => { beforeEach(() => { - wrapper = Wrapper(createMockObject('password')) + wrapper = Wrapper(createMockObject('forgotPassword')) }) it('renders the thanks text', () => { @@ -53,9 +53,9 @@ describe('Thx', () => { }) }) - describe('coming from /reset', () => { + describe('coming from /reset-password', () => { beforeEach(() => { - wrapper = Wrapper(createMockObject('reset')) + wrapper = Wrapper(createMockObject('resetPassword')) }) it('renders the thanks text', () => { @@ -85,7 +85,25 @@ describe('Thx', () => { }) it('links the redirect button to /login', () => { - expect(wrapper.find('a.btn').attributes('href')).toBe('/overview') + expect(wrapper.find('a.btn').attributes('href')).toBe('/login') + }) + }) + + describe('coming from /login', () => { + beforeEach(() => { + wrapper = Wrapper(createMockObject('login')) + }) + + it('renders the thanks text', () => { + expect(wrapper.find('p.h4').text()).toBe('site.thx.activateEmail') + }) + + it('renders the thanks redirect button', () => { + expect(wrapper.find('a.btn').text()).toBe('settings.password.reset') + }) + + it('links the redirect button to /forgot-password', () => { + expect(wrapper.find('a.btn').attributes('href')).toBe('/forgot-password') }) }) }) diff --git a/frontend/src/views/Pages/thx.vue b/frontend/src/pages/thx.vue similarity index 67% rename from frontend/src/views/Pages/thx.vue rename to frontend/src/pages/thx.vue index 5884cc61c..736e0c70e 100644 --- a/frontend/src/views/Pages/thx.vue +++ b/frontend/src/pages/thx.vue @@ -4,10 +4,17 @@
    +

    {{ $t(displaySetup.headline) }}

    +

    {{ $t(displaySetup.subtitle) }}


    - + + + {{ $t(displaySetup.button) }} + + + {{ $t(displaySetup.button) }}
    @@ -18,13 +25,13 @@ - diff --git a/frontend/src/views/Pages/ResetPassword.spec.js b/frontend/src/views/Pages/ResetPassword.spec.js deleted file mode 100644 index f3bbc7334..000000000 --- a/frontend/src/views/Pages/ResetPassword.spec.js +++ /dev/null @@ -1,196 +0,0 @@ -import { mount, RouterLinkStub } from '@vue/test-utils' -import ResetPassword from './ResetPassword' -import flushPromises from 'flush-promises' - -// validation is tested in src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js - -const localVue = global.localVue - -const apolloMutationMock = jest.fn() - -const toasterMock = jest.fn() -const routerPushMock = jest.fn() - -const stubs = { - RouterLink: RouterLinkStub, -} - -const createMockObject = (comingFrom) => { - return { - localVue, - mocks: { - $i18n: { - locale: 'en', - }, - $t: jest.fn((t) => t), - $route: { - params: { - optin: '123', - comingFrom, - }, - }, - $toasted: { - global: { - error: toasterMock, - }, - }, - $router: { - push: routerPushMock, - }, - $loading: { - show: jest.fn(() => { - return { hide: jest.fn() } - }), - }, - $apollo: { - mutate: apolloMutationMock, - }, - }, - stubs, - } -} - -describe('ResetPassword', () => { - let wrapper - - const Wrapper = (functionName) => { - return mount(ResetPassword, functionName) - } - - describe('mount', () => { - beforeEach(() => { - wrapper = Wrapper(createMockObject()) - }) - - describe('No valid optin', () => { - it.skip('does not render the Reset Password form when not authenticated', () => { - expect(wrapper.find('form').exists()).toBeFalsy() - }) - - it.skip('toasts an error when no valid optin is given', () => { - expect(toasterMock).toHaveBeenCalledWith('error') - }) - - it.skip('has a message suggesting to contact the support', () => { - expect(wrapper.find('div.header').text()).toContain('settings.password.reset') - expect(wrapper.find('div.header').text()).toContain('settings.password.not-authenticated') - }) - }) - - describe('is authenticated', () => { - it('renders the Reset Password form when authenticated', () => { - expect(wrapper.find('div.resetpwd-form').exists()).toBeTruthy() - }) - - describe('Register header', () => { - it('has a welcome message', async () => { - expect(wrapper.find('div.header').text()).toContain('settings.password.reset') - expect(wrapper.find('div.header').text()).toContain( - 'settings.password.reset-password.text', - ) - }) - }) - - describe('links', () => { - it('has a link "Back"', async () => { - expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual('back') - }) - - it('links to /login when clicking "Back"', async () => { - expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/login') - }) - }) - - describe('reset password form', () => { - it('has a register form', async () => { - expect(wrapper.find('form').exists()).toBeTruthy() - }) - - it('has 2 password input fields', async () => { - expect(wrapper.findAll('input[type="password"]').length).toBe(2) - }) - - it('toggles the first input field to text when eye icon is clicked', async () => { - await wrapper.findAll('button').at(0).trigger('click') - await wrapper.vm.$nextTick() - expect(wrapper.findAll('input').at(0).attributes('type')).toBe('text') - }) - - it('toggles the second input field to text when eye icon is clicked', async () => { - wrapper.findAll('button').at(1).trigger('click') - await wrapper.vm.$nextTick() - expect(wrapper.findAll('input').at(1).attributes('type')).toBe('text') - }) - }) - - describe('submit form', () => { - beforeEach(async () => { - // wrapper = Wrapper(createMockObject()) - await wrapper.findAll('input').at(0).setValue('Aa123456_') - await wrapper.findAll('input').at(1).setValue('Aa123456_') - await flushPromises() - }) - - describe('server response with error code > 10min', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutationMock.mockRejectedValue({ message: '...Code is older than 10 minutes' }) - await wrapper.find('form').trigger('submit') - await flushPromises() - }) - - it('toasts an error message', () => { - expect(toasterMock).toHaveBeenCalledWith('...Code is older than 10 minutes') - }) - - it('router pushes to /password/reset', () => { - expect(routerPushMock).toHaveBeenCalledWith('/password/reset') - }) - }) - - describe('server response with error code > 10min', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutationMock.mockRejectedValueOnce({ message: 'Error' }) - await wrapper.find('form').trigger('submit') - await flushPromises() - }) - - it('toasts an error message', () => { - expect(toasterMock).toHaveBeenCalledWith('Error') - }) - }) - - describe('server response with success', () => { - beforeEach(async () => { - apolloMutationMock.mockResolvedValue({ - data: { - resetPassword: 'success', - }, - }) - wrapper = Wrapper(createMockObject('checkEmail')) - await wrapper.findAll('input').at(0).setValue('Aa123456_') - await wrapper.findAll('input').at(1).setValue('Aa123456_') - await wrapper.find('form').trigger('submit') - await flushPromises() - }) - - it('calls the API', () => { - expect(apolloMutationMock).toBeCalledWith( - expect.objectContaining({ - variables: { - code: '123', - password: 'Aa123456_', - }, - }), - ) - }) - - it('redirects to "/thx/reset"', () => { - expect(routerPushMock).toHaveBeenCalledWith('/thx/reset') - }) - }) - }) - }) - }) -}) diff --git a/frontend/src/views/Pages/SendOverview.spec.js b/frontend/src/views/Pages/SendOverview.spec.js deleted file mode 100644 index 429b12baf..000000000 --- a/frontend/src/views/Pages/SendOverview.spec.js +++ /dev/null @@ -1,135 +0,0 @@ -import { mount } from '@vue/test-utils' -import SendOverview from './SendOverview' - -const sendMock = jest.fn() -sendMock.mockResolvedValue('success') - -const localVue = global.localVue - -// window.scrollTo = jest.fn() - -describe('SendOverview', () => { - let wrapper - - const propsData = { - balance: 123.45, - GdtBalance: 1234.56, - transactions: [{ balance: 0.1 }], - pending: true, - } - - const mocks = { - $t: jest.fn((t) => t), - $n: jest.fn((n) => String(n)), - $store: { - state: { - email: 'sender@example.org', - }, - }, - $apollo: { - mutate: sendMock, - }, - } - - const Wrapper = () => { - return mount(SendOverview, { localVue, mocks, propsData }) - } - - describe('mount', () => { - beforeEach(() => { - wrapper = Wrapper() - }) - - it('has a send field', () => { - expect(wrapper.find('div.gdd-send').exists()).toBeTruthy() - }) - - describe('transaction form', () => { - beforeEach(async () => { - wrapper.findComponent({ name: 'TransactionForm' }).vm.$emit('set-transaction', { - email: 'user@example.org', - amount: 23.45, - memo: 'Make the best of it!', - }) - }) - it('steps forward in the dialog', () => { - expect(wrapper.findComponent({ name: 'TransactionConfirmation' }).exists()).toBe(true) - }) - }) - - describe('confirm transaction', () => { - beforeEach(() => { - wrapper.setData({ - currentTransactionStep: 1, - transactionData: { - email: 'user@example.org', - amount: 23.45, - memo: 'Make the best of it!', - }, - }) - }) - - it('resets the transaction process when on-reset is emitted', async () => { - await wrapper.findComponent({ name: 'TransactionConfirmation' }).vm.$emit('on-reset') - expect(wrapper.findComponent({ name: 'TransactionForm' }).exists()).toBeTruthy() - expect(wrapper.vm.transactionData).toEqual({ - email: 'user@example.org', - amount: 23.45, - memo: 'Make the best of it!', - }) - }) - - describe('transaction is confirmed and server response is success', () => { - beforeEach(async () => { - jest.clearAllMocks() - await wrapper - .findComponent({ name: 'TransactionConfirmation' }) - .vm.$emit('send-transaction') - }) - - it('calls the API when send-transaction is emitted', async () => { - expect(sendMock).toBeCalledWith( - expect.objectContaining({ - variables: { - email: 'user@example.org', - amount: 23.45, - memo: 'Make the best of it!', - }, - }), - ) - }) - - it('emits update-balance', () => { - expect(wrapper.emitted('update-balance')).toBeTruthy() - expect(wrapper.emitted('update-balance')).toEqual([[23.45]]) - }) - - it('shows the succes page', () => { - expect(wrapper.find('div.card-body').text()).toContain('form.send_transaction_success') - }) - }) - - describe('transaction is confirmed and server response is error', () => { - beforeEach(async () => { - jest.clearAllMocks() - sendMock.mockRejectedValue({ message: 'recipiant not known' }) - await wrapper - .findComponent({ name: 'TransactionConfirmation' }) - .vm.$emit('send-transaction') - }) - - it('shows the error page', () => { - expect(wrapper.find('.test-send_transaction_error').text()).toContain( - 'form.send_transaction_error', - ) - }) - - it('shows recipient not found', () => { - expect(wrapper.find('.test-receiver-not-found').text()).toContain( - 'transaction.receiverNotFound', - ) - }) - }) - }) - }) -}) diff --git a/frontend/src/views/Pages/SendOverview.vue b/frontend/src/views/Pages/SendOverview.vue deleted file mode 100644 index 08f2f0159..000000000 --- a/frontend/src/views/Pages/SendOverview.vue +++ /dev/null @@ -1,102 +0,0 @@ - - diff --git a/frontend/src/views/Pages/SendOverview/GddSend.vue b/frontend/src/views/Pages/SendOverview/GddSend.vue deleted file mode 100644 index cfab0899a..000000000 --- a/frontend/src/views/Pages/SendOverview/GddSend.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/frontend/src/views/Pages/SendOverview/GddSend/TransactionForm.spec.js b/frontend/src/views/Pages/SendOverview/GddSend/TransactionForm.spec.js deleted file mode 100644 index 463613449..000000000 --- a/frontend/src/views/Pages/SendOverview/GddSend/TransactionForm.spec.js +++ /dev/null @@ -1,198 +0,0 @@ -import { mount } from '@vue/test-utils' -import TransactionForm from './TransactionForm' -import flushPromises from 'flush-promises' - -const localVue = global.localVue - -describe('GddSend', () => { - let wrapper - - const mocks = { - $t: jest.fn((t) => t), - $i18n: { - locale: jest.fn(() => 'en'), - }, - $n: jest.fn((n) => String(n)), - $store: { - state: { - email: 'user@example.org', - }, - }, - } - - const propsData = { - balance: 100.0, - } - - const Wrapper = () => { - return mount(TransactionForm, { localVue, mocks, propsData }) - } - - describe('mount', () => { - beforeEach(() => { - wrapper = Wrapper() - }) - - it('renders the component', () => { - expect(wrapper.find('div.transaction-form').exists()).toBeTruthy() - }) - - describe('transaction form', () => { - describe('email field', () => { - it('has an input field of type email', () => { - expect(wrapper.find('#input-group-1').find('input').attributes('type')).toBe('email') - }) - - it('has an envelope icon', () => { - expect(wrapper.find('#input-group-1').find('svg').attributes('aria-label')).toBe( - 'envelope', - ) - }) - - it('has a label form.receiver', () => { - expect(wrapper.find('label.input-1').text()).toBe('form.recipient') - }) - - it('has a placeholder "E-Mail"', () => { - expect(wrapper.find('#input-group-1').find('input').attributes('placeholder')).toBe( - 'E-Mail', - ) - }) - - it('flushes an error message when no valid email is given', async () => { - await wrapper.find('#input-group-1').find('input').setValue('a') - await flushPromises() - expect(wrapper.find('span.errors').text()).toBe('validations.messages.email') - }) - - it('trims the email after blur', async () => { - await wrapper.find('#input-group-1').find('input').setValue(' valid@email.com ') - await wrapper.find('#input-group-1').find('input').trigger('blur') - await flushPromises() - expect(wrapper.vm.form.email).toBe('valid@email.com') - }) - }) - - describe('amount field', () => { - it('has an input field of type text', () => { - expect(wrapper.find('#input-group-2').find('input').attributes('type')).toBe('text') - }) - - it('has an GDD text icon', () => { - expect(wrapper.find('#input-group-2').find('div.m-1').text()).toBe('GDD') - }) - - it('has a label form.amount', () => { - expect(wrapper.find('label.input-2').text()).toBe('form.amount') - }) - - it('has a placeholder "0.01"', () => { - expect(wrapper.find('#input-group-2').find('input').attributes('placeholder')).toBe( - '0.01', - ) - }) - - it('does not update form amount when invalid', async () => { - await wrapper.find('#input-group-2').find('input').setValue('invalid') - await wrapper.find('#input-group-2').find('input').trigger('blur') - await flushPromises() - expect(wrapper.vm.form.amountValue).toBe(0) - }) - - it('flushes an error message when no valid amount is given', async () => { - await wrapper.find('#input-group-2').find('input').setValue('a') - await flushPromises() - expect(wrapper.find('span.errors').text()).toBe('form.validation.gddSendAmount') - }) - - it('flushes an error message when amount is too high', async () => { - await wrapper.find('#input-group-2').find('input').setValue('123.34') - await flushPromises() - expect(wrapper.find('span.errors').text()).toBe('form.validation.gddSendAmount') - }) - - it('flushes no errors when amount is valid', async () => { - await wrapper.find('#input-group-2').find('input').setValue('87.34') - await flushPromises() - expect(wrapper.find('span.errors').exists()).toBeFalsy() - }) - }) - - describe('message text box', () => { - it('has an textarea field', () => { - expect(wrapper.find('#input-group-3').find('textarea').exists()).toBeTruthy() - }) - - it('has an chat-right-text icon', () => { - expect(wrapper.find('#input-group-3').find('svg').attributes('aria-label')).toBe( - 'chat right text', - ) - }) - - it('has a label form.message', () => { - expect(wrapper.find('label.input-3').text()).toBe('form.message') - }) - - it('flushes an error message when memo is less than 5 characters', async () => { - await wrapper.find('#input-group-3').find('textarea').setValue('a') - await flushPromises() - expect(wrapper.find('span.errors').text()).toBe('validations.messages.min') - }) - - it('flushes no error message when memo is valid', async () => { - await wrapper.find('#input-group-3').find('textarea').setValue('Long enough') - await flushPromises() - expect(wrapper.find('span.errors').exists()).toBeFalsy() - }) - }) - - describe('cancel button', () => { - it('has a cancel button', () => { - expect(wrapper.find('button[type="reset"]').exists()).toBeTruthy() - }) - - it('has the text "form.cancel"', () => { - expect(wrapper.find('button[type="reset"]').text()).toBe('form.reset') - }) - - it('clears all fields on click', async () => { - await wrapper.find('#input-group-1').find('input').setValue('someone@watches.tv') - await wrapper.find('#input-group-2').find('input').setValue('87.23') - await wrapper.find('#input-group-3').find('textarea').setValue('Long enough') - await flushPromises() - expect(wrapper.vm.form.email).toBe('someone@watches.tv') - expect(wrapper.vm.form.amount).toBe('87.23') - expect(wrapper.vm.form.memo).toBe('Long enough') - await wrapper.find('button[type="reset"]').trigger('click') - await flushPromises() - expect(wrapper.vm.form.email).toBe('') - expect(wrapper.vm.form.amount).toBe('') - expect(wrapper.vm.form.memo).toBe('') - }) - }) - - describe('submit', () => { - beforeEach(async () => { - await wrapper.find('#input-group-1').find('input').setValue('someone@watches.tv') - await wrapper.find('#input-group-2').find('input').setValue('87.23') - await wrapper.find('#input-group-3').find('textarea').setValue('Long enough') - await wrapper.find('form').trigger('submit') - await flushPromises() - }) - - it('emits set-transaction', async () => { - expect(wrapper.emitted('set-transaction')).toBeTruthy() - expect(wrapper.emitted('set-transaction')).toEqual([ - [ - { - email: 'someone@watches.tv', - amount: 87.23, - memo: 'Long enough', - }, - ], - ]) - }) - }) - }) - }) -}) diff --git a/frontend/src/views/Pages/SendOverview/GddSend/TransactionResult.vue b/frontend/src/views/Pages/SendOverview/GddSend/TransactionResult.vue deleted file mode 100644 index 7d036bef2..000000000 --- a/frontend/src/views/Pages/SendOverview/GddSend/TransactionResult.vue +++ /dev/null @@ -1,46 +0,0 @@ - - diff --git a/frontend/src/views/Pages/UserProfile/UserCard.vue b/frontend/src/views/Pages/UserProfile/UserCard.vue deleted file mode 100755 index 4ddbb2726..000000000 --- a/frontend/src/views/Pages/UserProfile/UserCard.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/frontend/src/views/Pages/UserProfileOverview.spec.js b/frontend/src/views/Pages/UserProfileOverview.spec.js deleted file mode 100644 index 7b75b0dd2..000000000 --- a/frontend/src/views/Pages/UserProfileOverview.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import { shallowMount } from '@vue/test-utils' -import UserProfileOverview from './UserProfileOverview' - -const localVue = global.localVue - -describe('UserProfileOverview', () => { - let wrapper - - const mocks = { - $t: jest.fn((t) => t), - } - - const Wrapper = () => { - return shallowMount(UserProfileOverview, { localVue, mocks }) - } - - describe('shallow Mount', () => { - beforeEach(() => { - wrapper = Wrapper() - }) - - it('has a user card', () => { - expect(wrapper.findComponent({ name: 'UserCard' }).exists()).toBeTruthy() - }) - - it('has a user first and last name form', () => { - expect(wrapper.findComponent({ name: 'FormUserData' }).exists()).toBeTruthy() - }) - - it('has a user change password form', () => { - expect(wrapper.findComponent({ name: 'FormUserPasswort' }).exists()).toBeTruthy() - }) - - it('has a user change language form', () => { - expect(wrapper.findComponent({ name: 'FormUserLanguage' }).exists()).toBeTruthy() - }) - }) -}) diff --git a/frontend/src/views/Pages/UserProfileOverview.vue b/frontend/src/views/Pages/UserProfileOverview.vue deleted file mode 100644 index e92e23e7b..000000000 --- a/frontend/src/views/Pages/UserProfileOverview.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/frontend/test/testSetup.js b/frontend/test/testSetup.js index cb50ccdb6..0ceb5affd 100644 --- a/frontend/test/testSetup.js +++ b/frontend/test/testSetup.js @@ -17,6 +17,12 @@ import { focus } from 'vue-focus' import { loadAllRules } from '../src/validation-rules' +import { loadFilters } from '@/filters/amount' + +import { toasters } from '@/mixins/toaster' +export const toastErrorSpy = jest.spyOn(toasters.methods, 'toastError') +export const toastSuccessSpy = jest.spyOn(toasters.methods, 'toastSuccess') + Object.keys(rules).forEach((rule) => { extend(rule, { ...rules[rule], // copies rule configuration @@ -47,6 +53,22 @@ global.localVue.component('validation-observer', ValidationObserver) // global.localVue.directive('click-outside', clickOutside) global.localVue.directive('focus', focus) +global.localVue.mixin(toasters) + +const filters = loadFilters(i18nMock) +global.localVue.filter('amount', filters.amount) +global.localVue.filter('GDD', filters.GDD) + +// Filter the warnings for portal vue +// https://github.com/BeniRupp/bug_portal-vue-target-already-exists +const consoleWarn = global.console.warn +// eslint-disable-next-line no-console +delete console.warn +// eslint-disable-next-line no-console +console.warn = (m) => { + if (!m.match(/^\[portal-vue\]: Target .+ already exists$/)) consoleWarn(m) +} + // throw errors for vue warnings to force the programmers to take care about warnings Vue.config.warnHandler = (w) => { throw new Error(w) diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 88dae8c4c..573f2a70b 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -2,11 +2,13 @@ const path = require('path') const webpack = require('webpack') const Dotenv = require('dotenv-webpack') const StatsPlugin = require('stats-webpack-plugin') +const HtmlWebpackPlugin = require('vue-html-webpack-plugin') +const CONFIG = require('./src/config') // vue.config.js module.exports = { devServer: { - port: process.env.PORT || 3000, + port: CONFIG.PORT, }, pluginOptions: { i18n: { @@ -14,10 +16,11 @@ module.exports = { fallbackLocale: 'de', localeDir: 'locales', enableInSFC: false, + enableLegacy: false, }, }, lintOnSave: true, - publicPath: '/vue', + publicPath: '/', configureWebpack: { // Set up all the aliases we use in our app. resolve: { @@ -33,11 +36,25 @@ module.exports = { // 'process.env.DOCKER_WORKDIR': JSON.stringify(process.env.DOCKER_WORKDIR), // 'process.env.BUILD_DATE': JSON.stringify(process.env.BUILD_DATE), // 'process.env.BUILD_VERSION': JSON.stringify(process.env.BUILD_VERSION), - 'process.env.BUILD_COMMIT': JSON.stringify(process.env.BUILD_COMMIT), + 'process.env.BUILD_COMMIT': JSON.stringify(CONFIG.BUILD_COMMIT), // 'process.env.PORT': JSON.stringify(process.env.PORT), }), // generate webpack stats to allow analysis of the bundlesize new StatsPlugin('webpack.stats.json'), + new HtmlWebpackPlugin({ + vue: true, + template: 'public/index.html', + meta: { + title_de: CONFIG.META_TITLE_DE, + title_en: CONFIG.META_TITLE_EN, + description_de: CONFIG.META_DESCRIPTION_DE, + description_en: CONFIG.META_DESCRIPTION_EN, + keywords_de: CONFIG.META_KEYWORDS_DE, + keywords_en: CONFIG.META_KEYWORDS_EN, + author: CONFIG.META_AUTHOR, + url: CONFIG.META_URL, + }, + }), ], infrastructureLogging: { level: 'warn', // 'none' | 'error' | 'warn' | 'info' | 'log' | 'verbose' @@ -45,7 +62,7 @@ module.exports = { }, css: { // Enable CSS source maps. - sourceMap: process.env.NODE_ENV !== 'production', + sourceMap: CONFIG.NODE_ENV !== 'production', }, outputDir: path.resolve(__dirname, './dist'), } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 2bc1361be..cd833a3df 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -23,17 +23,29 @@ dependencies: "@babel/highlight" "^7.16.0" +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + "@babel/compat-data@^7.13.0": version "7.13.6" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.6.tgz#11972d07db4c2317afdbf41d6feb3a730301ef4e" integrity sha512-VhgqKOWYVm7lQXlvbJnWOzwfAQATd2nV52koT0HZ/LdDH0m4DUDwkKYsH+IwpXb+bKPyBJzawA4I6nBKqZcpQw== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + "@babel/compat-data@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1" integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== -"@babel/compat-data@^7.13.8", "@babel/compat-data@^7.16.0": +"@babel/compat-data@^7.16.0": version "7.16.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== @@ -81,7 +93,28 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.11.0", "@babel/core@^7.13.13": +"@babel/core@^7.11.0": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/core@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.13.tgz#bc44c4a2be2288ec4ddf56b66fc718019c76ac29" integrity sha512-1xEs9jZAyKIouOoCmpsgk/I26PoKyvzQ2ixdRpRzfbcp1fL+ozw7TUgdDgwonbTovqRaTfRh50IXuw4QrWO0GA== @@ -112,12 +145,12 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.4.0": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== +"@babel/generator@^7.16.8", "@babel/generator@^7.4.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.16.8" jsesc "^2.5.1" source-map "^0.5.0" @@ -128,6 +161,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" @@ -136,6 +176,14 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-compilation-targets@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.0.tgz#c9cf29b82a76fd637f0faa35544c4ace60a155a1" @@ -146,7 +194,17 @@ browserslist "^4.14.5" semver "7.0.0" -"@babel/helper-compilation-targets@^7.13.10", "@babel/helper-compilation-targets@^7.16.0": +"@babel/helper-compilation-targets@^7.13.13": + version "7.13.13" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" + integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ== + dependencies: + "@babel/compat-data" "^7.13.12" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.16.0": version "7.16.3" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== @@ -156,14 +214,14 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" - integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ== +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/compat-data" "^7.13.12" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.13.0": @@ -177,6 +235,19 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" + integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -185,6 +256,14 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^4.7.1" + "@babel/helper-define-polyfill-provider@^0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.2.tgz#619f01afe1deda460676c25c463b42eaefdb71a2" @@ -199,6 +278,27 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -206,6 +306,13 @@ dependencies: "@babel/types" "^7.13.0" +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" @@ -215,6 +322,15 @@ "@babel/template" "^7.16.0" "@babel/types" "^7.16.0" +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-get-function-arity@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" @@ -222,7 +338,14 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-hoist-variables@^7.12.13", "@babel/helper-hoist-variables@^7.13.0": +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== @@ -237,6 +360,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" @@ -251,6 +381,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-imports@7.0.0-beta.35": version "7.0.0-beta.35" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz#308e350e731752cdb4d0f058df1d704925c64e0a" @@ -280,6 +417,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-transforms@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" @@ -323,6 +467,20 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-optimise-call-expression@^7.12.13", "@babel/helper-optimise-call-expression@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" @@ -330,16 +488,28 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -349,6 +519,15 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helper-replace-supers@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" @@ -379,6 +558,17 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" @@ -393,6 +583,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -400,6 +597,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" @@ -407,6 +611,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" @@ -417,11 +628,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + "@babel/helper-validator-option@^7.12.17", "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -432,6 +653,16 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helpers@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" @@ -450,6 +681,15 @@ "@babel/traverse" "^7.16.3" "@babel/types" "^7.16.0" +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/highlight@^7.10.4": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" @@ -468,49 +708,70 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/node@^7.13.13": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.13.13.tgz#9201214dab4ae41c1e1596b7d2e27098395b1509" - integrity sha512-gElSPunpriXoBGQxDkd5h9L13SVTyzFLTPv9jN1aXJNLR10iNs+MsfhYL/WGJGCJQFddHAdThY7CkmGVz2KPag== +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== dependencies: - "@babel/register" "^7.13.8" + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/node@^7.13.13": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.16.8.tgz#57ba1dfa63dbcc72d477f05597ce07f1c4f8b558" + integrity sha512-V2dopEtPUL4LD+e8UtMIZB6BbsmMsS/7E1ZAvWNINzBfi7Cf3X9MLCpzHVZT4HeeF1lQl72IRtqqVt2RUImwyA== + dependencies: + "@babel/register" "^7.16.8" commander "^4.0.1" - core-js "^3.2.1" + core-js "^3.20.2" node-environment-flags "^1.0.5" regenerator-runtime "^0.13.4" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3": +"@babel/parser@^7.1.0", "@babel/parser@^7.13.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3": version "7.16.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== -"@babel/parser@^7.13.13", "@babel/parser@^7.4.3": +"@babel/parser@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df" integrity sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw== +"@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7", "@babel/parser@^7.4.3": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== + "@babel/parser@^7.7.0": version "7.13.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.4.tgz#340211b0da94a351a6f10e63671fa727333d13ab" integrity sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-async-generator-functions@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1" - integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-async-generator-functions@^7.2.0": @@ -522,7 +783,7 @@ "@babel/helper-remap-async-to-generator" "^7.13.0" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0": +"@babel/plugin-proposal-class-properties@^7.0.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== @@ -530,6 +791,23 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-proposal-decorators@^7.1.0": version "7.13.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" @@ -539,28 +817,28 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-proposal-json-strings@^7.2.0": @@ -571,40 +849,40 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.16.7" "@babel/plugin-proposal-object-rest-spread@^7.3.4": version "7.13.0" @@ -615,12 +893,12 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.13.0" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-catch-binding@^7.2.0": @@ -631,24 +909,42 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.2.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== @@ -677,6 +973,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -761,28 +1064,44 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.13.0", "@babel/plugin-transform-arrow-functions@^7.2.0": +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-arrow-functions@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-async-to-generator@^7.13.0", "@babel/plugin-transform-async-to-generator@^7.3.4": +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-async-to-generator@^7.3.4": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== @@ -791,21 +1110,49 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" -"@babel/plugin-transform-block-scoped-functions@^7.12.13", "@babel/plugin-transform-block-scoped-functions@^7.2.0": +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.3.4": +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.3.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-classes@^7.13.0", "@babel/plugin-transform-classes@^7.3.4": +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-classes@^7.3.4": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== @@ -818,21 +1165,43 @@ "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.13.0", "@babel/plugin-transform-computed-properties@^7.2.0": +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-computed-properties@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.13.0", "@babel/plugin-transform-destructuring@^7.2.0": +"@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== @@ -840,14 +1209,29 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.12.13", "@babel/plugin-transform-duplicate-keys@^7.2.0": +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.12.13", "@babel/plugin-transform-exponentiation-operator@^7.2.0": +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== @@ -855,14 +1239,30 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-for-of@^7.13.0", "@babel/plugin-transform-for-of@^7.2.0": +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-function-name@^7.12.13", "@babel/plugin-transform-function-name@^7.2.0": +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== @@ -870,21 +1270,37 @@ "@babel/helper-function-name" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.12.13", "@babel/plugin-transform-literals@^7.2.0": +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.2.0": +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-amd@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== @@ -893,14 +1309,14 @@ "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.9.6": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.2.0": @@ -913,15 +1329,15 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.3.4": @@ -935,7 +1351,15 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.13.0", "@babel/plugin-transform-modules-umd@^7.2.0": +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-umd@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== @@ -943,21 +1367,43 @@ "@babel/helper-module-transforms" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13", "@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.12.13": +"@babel/plugin-transform-new-target@^7.0.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-object-super@^7.12.13", "@babel/plugin-transform-object-super@^7.2.0": +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== @@ -972,26 +1418,40 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.12.13", "@babel/plugin-transform-regenerator@^7.3.4": +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-regenerator@^7.3.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-transform-runtime@^7.4.0": version "7.13.7" @@ -1005,14 +1465,29 @@ babel-plugin-polyfill-regenerator "^0.1.2" semver "7.0.0" -"@babel/plugin-transform-shorthand-properties@^7.12.13", "@babel/plugin-transform-shorthand-properties@^7.2.0": +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-spread@^7.13.0", "@babel/plugin-transform-spread@^7.2.0": +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-spread@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== @@ -1020,35 +1495,64 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-sticky-regex@^7.12.13", "@babel/plugin-transform-sticky-regex@^7.2.0": +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-sticky-regex@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-template-literals@^7.13.0", "@babel/plugin-transform-template-literals@^7.2.0": +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.2.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-typeof-symbol@^7.12.13", "@babel/plugin-transform-typeof-symbol@^7.2.0": +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-unicode-regex@^7.12.13", "@babel/plugin-transform-unicode-regex@^7.2.0": +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== @@ -1106,30 +1610,34 @@ semver "^5.3.0" "@babel/preset-env@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.12.tgz#6dff470478290582ac282fb77780eadf32480237" - integrity sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA== + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== dependencies: - "@babel/compat-data" "^7.13.12" - "@babel/helper-compilation-targets" "^7.13.10" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.8" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -1139,51 +1647,52 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.12" - babel-plugin-polyfill-corejs2 "^0.1.4" - babel-plugin-polyfill-corejs3 "^0.1.3" - babel-plugin-polyfill-regenerator "^0.1.2" - core-js-compat "^3.9.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" semver "^6.3.0" -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1191,13 +1700,13 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/register@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.8.tgz#d9051dc6820cb4e86375cc0e2d55a4862b31184f" - integrity sha512-yCVtABcmvQjRsX2elcZFUV5Q5kDDpHdtXKKku22hNDma60lYuhKmtp1ykZ/okRCPLT2bR5S+cA1kvtBdAFlDTQ== +"@babel/register@^7.16.8": + version "7.16.9" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.16.9.tgz#fcfb23cfdd9ad95c9771e58183de83b513857806" + integrity sha512-jJ72wcghdRIlENfvALcyODhNoGE5j75cYHdC+aQMh6cU/P86tiiXTp9XYZct1UxUMo/4+BgQRyNZEGx0KWGS+g== dependencies: + clone-deep "^4.0.1" find-cache-dir "^2.0.0" - lodash "^4.17.19" make-dir "^2.1.0" pirates "^4.0.0" source-map-support "^0.5.16" @@ -1217,6 +1726,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.14.0": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" + integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@7", "@babel/template@^7.12.13", "@babel/template@^7.16.0", "@babel/template@^7.3.3": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" @@ -1226,14 +1742,14 @@ "@babel/parser" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/template@^7.4.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== +"@babel/template@^7.16.7", "@babel/template@^7.4.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" "@babel/traverse@^7.1.0", "@babel/traverse@^7.7.0": version "7.13.0" @@ -1265,7 +1781,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.13.13", "@babel/traverse@^7.4.3": +"@babel/traverse@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d" integrity sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg== @@ -1279,6 +1795,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.4.3": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@7.0.0-beta.35": version "7.0.0-beta.35" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.35.tgz#cf933a9a9a38484ca724b335b88d83726d5ab960" @@ -1305,7 +1837,7 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.4.0", "@babel/types@^7.4.4": +"@babel/types@^7.13.12", "@babel/types@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.13.tgz#dcd8b815b38f537a3697ce84c8e3cc62197df96f" integrity sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w== @@ -1314,6 +1846,14 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1342,6 +1882,21 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" + integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.1" + globals "^13.9.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1383,6 +1938,83 @@ cssnano-preset-default "^4.0.0" postcss "^7.0.0" +"@intlify/core-base@^9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.1.9.tgz#e4e8c951010728e4af3a0d13d74cf3f9e7add7f6" + integrity sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw== + dependencies: + "@intlify/devtools-if" "9.1.9" + "@intlify/message-compiler" "9.1.9" + "@intlify/message-resolver" "9.1.9" + "@intlify/runtime" "9.1.9" + "@intlify/shared" "9.1.9" + "@intlify/vue-devtools" "9.1.9" + +"@intlify/devtools-if@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/devtools-if/-/devtools-if-9.1.9.tgz#a30e1dd1256ff2c5c98d8d75d075384fba898e5d" + integrity sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ== + dependencies: + "@intlify/shared" "9.1.9" + +"@intlify/eslint-plugin-vue-i18n@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@intlify/eslint-plugin-vue-i18n/-/eslint-plugin-vue-i18n-1.4.0.tgz#f8fe791892c2dce7d189a364b6a908c87e1c3ac9" + integrity sha512-anB1eBf6rpxpWyW883gi6O1hozQy4Q02VyzyodOUnohOqT07GATVSxnr2J9/qQSV47xWukV+9LiRErJcU7d/uA== + dependencies: + "@eslint/eslintrc" "^1.2.0" + "@intlify/core-base" "^9.1.9" + "@intlify/message-compiler" "^9.1.9" + debug "^4.3.1" + glob "^7.1.3" + ignore "^5.0.5" + is-language-code "^3.1.0" + js-yaml "^4.0.0" + json5 "^2.1.3" + jsonc-eslint-parser "^2.0.0" + lodash "^4.17.11" + parse5 "^6.0.0" + semver "^7.3.4" + vue-eslint-parser "^8.0.0" + yaml-eslint-parser "^0.5.0" + +"@intlify/message-compiler@9.1.9", "@intlify/message-compiler@^9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.1.9.tgz#1193cbd224a71c2fb981455b8534a3c766d2948d" + integrity sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ== + dependencies: + "@intlify/message-resolver" "9.1.9" + "@intlify/shared" "9.1.9" + source-map "0.6.1" + +"@intlify/message-resolver@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/message-resolver/-/message-resolver-9.1.9.tgz#3155ccd2f5e6d0dc16cad8b7f1d8e97fcda05bfc" + integrity sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA== + +"@intlify/runtime@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/runtime/-/runtime-9.1.9.tgz#2c12ce29518a075629efed0a8ed293ee740cb285" + integrity sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg== + dependencies: + "@intlify/message-compiler" "9.1.9" + "@intlify/message-resolver" "9.1.9" + "@intlify/shared" "9.1.9" + +"@intlify/shared@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.1.9.tgz#0baaf96128b85560666bec784ffb01f6623cc17a" + integrity sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw== + +"@intlify/vue-devtools@9.1.9": + version "9.1.9" + resolved "https://registry.yarnpkg.com/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz#2be8f4dbe7f7ed4115676eb32348141d411e426b" + integrity sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og== + dependencies: + "@intlify/message-resolver" "9.1.9" + "@intlify/runtime" "9.1.9" + "@intlify/shared" "9.1.9" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1860,9 +2492,9 @@ "@types/babel__traverse" "*" "@types/babel__core@^7.1.0": - version "7.1.14" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1899,11 +2531,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/d3@3.5.38": - version "3.5.38" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-3.5.38.tgz#76f8f2e9159ae562965b2fa0e6fbee1aa643a1bc" - integrity sha1-dvjy6RWa5WKWWy+g5vvuGqZDobw= - "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -1993,6 +2620,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^2.0.0": version "2.2.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" @@ -2029,9 +2661,9 @@ integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^13.0.0": - version "13.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" - integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== dependencies: "@types/yargs-parser" "*" @@ -2231,14 +2863,14 @@ eslint-plugin-vue "^4.7.1" "@vue/cli-plugin-unit-jest@^4.5.12": - version "4.5.12" - resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.5.12.tgz#883d43f9a4bb6088a3b8125bd492511d05e1073e" - integrity sha512-hZibVfMDGTANN7QENbE7eEAlk8adTW8fEpuGXA4IV+eDqLDPUPVUOwcw8f9d7Rx3KVHES3GyFQ9yVK/KeI9NGw== + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.5.15.tgz#7be914ca1507ca344487eb377ed925c9db0b772a" + integrity sha512-oE3RDMerb21P6ALg70Zh2zU+RYYjoe09/7ZXYUj03uTb2obqUbcINpFfeVwM0B/J6H1YmqWJpnNBxWURhrqQHg== dependencies: "@babel/core" "^7.11.0" "@babel/plugin-transform-modules-commonjs" "^7.9.6" "@types/jest" "^24.0.19" - "@vue/cli-shared-utils" "^4.5.12" + "@vue/cli-shared-utils" "^4.5.15" babel-core "^7.0.0-bridge.0" babel-jest "^24.9.0" babel-plugin-transform-es2015-modules-commonjs "^6.26.2" @@ -2331,10 +2963,10 @@ semver "^6.0.0" string.prototype.padstart "^3.0.0" -"@vue/cli-shared-utils@^4.5.12": - version "4.5.12" - resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.12.tgz#0e0693d488336d284ffa658ff33b1ea22927d065" - integrity sha512-qnIQPJ4XckMoqYh9fJ0Y91QKMIb4Hiibrm9+k4E15QHpk5RaokuOpf10SsOr2NLPCXSWsHOLo3hduZSwHPGY/Q== +"@vue/cli-shared-utils@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz#dba3858165dbe3465755f256a4890e69084532d6" + integrity sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q== dependencies: "@hapi/joi" "^15.0.1" chalk "^2.4.2" @@ -2659,6 +3291,11 @@ acorn@^8.2.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== +acorn@^8.5.0, acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + address@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -2721,11 +3358,6 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -2773,6 +3405,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2805,7 +3442,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -2916,7 +3553,7 @@ apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: ts-invariant "^0.4.0" tslib "^1.10.0" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== @@ -2926,14 +3563,6 @@ arch@^2.1.1: resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2941,6 +3570,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -3068,11 +3702,6 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -3118,13 +3747,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -3310,6 +3932,15 @@ babel-plugin-polyfill-corejs2@^0.1.4: "@babel/helper-define-polyfill-provider" "^0.1.2" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.4.tgz#2ae290200e953bade30907b7a3bebcb696e6c59d" @@ -3318,6 +3949,14 @@ babel-plugin-polyfill-corejs3@^0.1.3: "@babel/helper-define-polyfill-provider" "^0.1.2" core-js-compat "^3.8.1" +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" + integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.20.0" + babel-plugin-polyfill-regenerator@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.3.tgz#350f857225fc640ae1ec78d1536afcbb457db841" @@ -3325,6 +3964,13 @@ babel-plugin-polyfill-regenerator@^0.1.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.1.2" +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" @@ -3469,6 +4115,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3584,7 +4235,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bootstrap-vue@^2.5.0: +bootstrap-vue@^2.21.2: version "2.21.2" resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.21.2.tgz#ec38f66c3a2205becccddb6158a991d96509ed0b" integrity sha512-0Exe+4MZysqhZNXIKf4TzkvXaupxh9EHsoCRez0o5Dc0J7rlafayOEwql63qXv74CgZO8E4U8ugRNJko1vMvNw== @@ -3595,15 +4246,10 @@ bootstrap-vue@^2.5.0: portal-vue "^2.1.7" vue-functional-data-merge "^3.1.0" -bootstrap@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" - integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== - -"bootstrap@>=4.5.3 <5.0.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" - integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== +"bootstrap@>=4.5.3 <5.0.0", bootstrap@^4.5.3: + version "4.6.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.1.tgz#bc25380c2c14192374e8dec07cf01b2742d222a2" + integrity sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og== brace-expansion@^1.1.7: version "1.1.11" @@ -3636,16 +4282,6 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brfs@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" - integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== - dependencies: - quote-stream "^1.0.1" - resolve "^1.1.5" - static-module "^2.2.0" - through2 "^2.0.0" - brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -3746,6 +4382,17 @@ browserslist@^4.14.5, browserslist@^4.17.5: node-releases "^2.0.1" picocolors "^1.0.0" +browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -3773,17 +4420,17 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= - buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.1: +buffer-from@1.x: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -4002,6 +4649,11 @@ caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001280: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001285.tgz#fe1e52229187e11d6670590790d669b9e03315b7" integrity sha512-KAOkuUtcQ901MtmvxfKD+ODHH9YVDYnBt+TGYSz2KIfnq22CiArbUxXPN9067gNbgMlnNYRSwho8OPXZPALB9Q== +caniuse-lite@^1.0.30001286: + version "1.0.30001303" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz#9b168e4f43ccfc372b86f4bc5a551d9b909c95c9" + integrity sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -4019,7 +4671,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -4078,6 +4730,21 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -4117,11 +4784,6 @@ chownr@^1.0.1, chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" @@ -4218,15 +4880,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -clipboard@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" - integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - clipboardy@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" @@ -4263,7 +4916,23 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone@2.x, clone@^2.1.1: +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== + dependencies: + is-regexp "^2.0.0" + +clone@2.x: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= @@ -4287,11 +4956,6 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -4345,6 +5009,11 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.4" +colord@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== + colorette@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" @@ -4362,16 +5031,16 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@^2.18.0, commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -4422,7 +5091,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4464,11 +5133,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - consolidate@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" @@ -4505,7 +5169,7 @@ convert-source-map@^1.4.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.5.1, convert-source-map@^1.6.0: +convert-source-map@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -4553,6 +5217,14 @@ copy-webpack-plugin@^4.6.0: p-limit "^1.0.0" serialize-javascript "^1.4.0" +core-js-compat@^3.20.0, core-js-compat@^3.20.2: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" + integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + core-js-compat@^3.8.1: version "3.9.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" @@ -4561,23 +5233,15 @@ core-js-compat@^3.8.1: browserslist "^4.16.3" semver "7.0.0" -core-js-compat@^3.9.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" - integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== - dependencies: - browserslist "^4.16.3" - semver "7.0.0" - core-js@^2.4.0, core-js@^2.5.7, core-js@^2.6.5: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.2.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae" - integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg== +core-js@^3.20.2: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" + integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== core-js@^3.6.5: version "3.9.0" @@ -4599,6 +5263,17 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -4650,7 +5325,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4689,6 +5364,11 @@ css-declaration-sorter@^4.0.1: postcss "^7.0.1" timsort "^0.3.0" +css-functions-list@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.0.1.tgz#1460df7fb584d1692c30b105151dbb988c8094f9" + integrity sha512-PriDuifDt4u4rkDgnqRCLnjfMatufLmWNfQnGCq34xZwpY3oabwhB9SqRBmuvWUgndbemCFlKqg+nO7C2q0SBw== + css-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe" @@ -4880,276 +5560,6 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -d3-axis@1: - version "1.0.12" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" - integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== - -d3-brush@1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" - integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-chord@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" - integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== - dependencies: - d3-array "1" - d3-path "1" - -d3-collection@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -d3-contour@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" - integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== - dependencies: - d3-array "^1.1.1" - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - -d3-drag@1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" - integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== - dependencies: - d3-dispatch "1" - d3-selection "1" - -d3-dsv@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" - integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - -d3-ease@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== - -d3-fetch@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" - integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== - dependencies: - d3-dsv "1" - -d3-force@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - -d3-format@1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" - integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== - -d3-geo-projection@0.2: - version "0.2.16" - resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-0.2.16.tgz#4994ecd1033ddb1533b6c4c5528a1c81dcc29427" - integrity sha1-SZTs0QM92xUztsTFUoocgdzClCc= - dependencies: - brfs "^1.3.0" - -d3-geo@1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" - integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== - dependencies: - d3-array "1" - -d3-hierarchy@1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-interpolate@1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -d3-polygon@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== - -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== - -d3-queue@1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/d3-queue/-/d3-queue-1.2.3.tgz#143a701cfa65fe021292f321c10d14e98abd491b" - integrity sha1-FDpwHPpl/gISkvMhwQ0U6Yq9SRs= - -d3-queue@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/d3-queue/-/d3-queue-2.0.3.tgz#07fbda3acae5358a9c5299aaf880adf0953ed2c2" - integrity sha1-B/vaOsrlNYqcUpmq+ICt8JU+0sI= - -d3-random@1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" - integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== - -d3-scale-chromatic@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" - integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== - dependencies: - d3-color "1" - d3-interpolate "1" - -d3-scale@2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" - integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== - dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" - -d3-selection@1, d3-selection@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" - integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== - -d3-shape@1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -d3-time-format@2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" - integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== - dependencies: - d3-time "1" - -d3-time@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" - integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== - -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -d3-transition@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - -d3-voronoi@1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== - -d3-zoom@1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" - integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3@3, d3@^3.5.6: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" - integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= - -d3@^5.7.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" - integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== - dependencies: - d3-array "1" - d3-axis "1" - d3-brush "1" - d3-chord "1" - d3-collection "1" - d3-color "1" - d3-contour "1" - d3-dispatch "1" - d3-drag "1" - d3-dsv "1" - d3-ease "1" - d3-fetch "1" - d3-force "1" - d3-format "1" - d3-geo "1" - d3-hierarchy "1" - d3-interpolate "1" - d3-path "1" - d3-polygon "1" - d3-quadtree "1" - d3-random "1" - d3-scale "2" - d3-scale-chromatic "1" - d3-selection "1" - d3-shape "1" - d3-time "1" - d3-time-format "2" - d3-timer "1" - d3-transition "1" - d3-voronoi "1" - d3-zoom "1" - d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -5183,25 +5593,6 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -datamaps@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/datamaps/-/datamaps-0.5.9.tgz#2a775473aaab29b55025208b2245e840ecfd4fe1" - integrity sha512-GUXpO713URNzaExVUgBtqA5fr2UuxUG/fVitI04zEFHVL2FHSjd672alHq8E16oQqRNzF0m1bmx8WlTnDrGSqQ== - dependencies: - "@types/d3" "3.5.38" - d3 "^3.5.6" - topojson "^1.6.19" - -date-fns@^1.30.1: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== - -date-fns@^2.0.0-beta.4: - version "2.17.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.17.0.tgz#afa55daea539239db0a64e236ce716ef3d681ba1" - integrity sha512-ZEhqxUtEZeGgg9eHNSOAJ8O9xqSgiJdrL0lzSSfMF54x6KXWJiOH/xntSJ9YomJPrYH/p08t6gWjGWq1SDJlSA== - de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" @@ -5222,7 +5613,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0: +debug@4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -5362,16 +5753,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -5405,11 +5786,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diacriticless@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/diacriticless/-/diacriticless-1.0.1.tgz#e7dda978c2919609bb48aee1efc5de6a337bd4c3" - integrity sha1-592peMKRlgm7SK7h78XeajN71MM= - diff-sequences@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" @@ -5510,6 +5886,15 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -5525,6 +5910,11 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== +domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -5546,6 +5936,13 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domhandler@^4.2.0, domhandler@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -5554,6 +5951,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dot-object@^1.7.1: version "1.9.0" resolved "https://registry.yarnpkg.com/dot-object/-/dot-object-1.9.0.tgz#6e3d6d8379f794c5174599ddf05528f5990f076e" @@ -5598,18 +6004,6 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== -dropzone@^5.5.1: - version "5.7.6" - resolved "https://registry.yarnpkg.com/dropzone/-/dropzone-5.7.6.tgz#a5ebb603ea2aaf630118c37a7be59bb3444ad6e1" - integrity sha512-z38j+PZsH38rFGOK2rQ877t6c0cPos053fPp3RKaDvCDjAw4KflQQGn7BhCWeFq9Zl1hinB8khPrQdJ6cIBryQ== - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - duplexer@^0.1.1, duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -5663,6 +6057,11 @@ electron-to-chromium@^1.3.649, electron-to-chromium@^1.3.896: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.12.tgz#5f73d1278c6205fc41d7a0ebd75563046b77c5d8" integrity sha512-zjfhG9Us/hIy8AlQ5OzfbR/C4aBv1Dg/ak4GX35CELYlJ4tDAtoEcQivXvyBdqdNQ+R6PhlgQqV8UNPJmhkJog== +electron-to-chromium@^1.4.17: + version "1.4.56" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz#f660fd2c6739b341d8922fe3a441a5a2804911a1" + integrity sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g== + elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -5739,10 +6138,10 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== errno@^0.1.3, errno@~0.1.7: version "0.1.8" @@ -5824,6 +6223,32 @@ es-abstract@^1.18.0-next.2: string.prototype.trimend "^1.0.3" string.prototype.trimstart "^1.0.3" +es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5939,18 +6364,6 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -escodegen@~1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-prettier@^3.3.0: version "3.6.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz#8ca3ffac4bd6eeef623a0651f9d754900e3ec217" @@ -6105,6 +6518,14 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -6122,6 +6543,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + eslint@^4.19.1: version "4.19.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" @@ -6240,10 +6666,14 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= +espree@^9.0.0, espree@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" + integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -6297,11 +6727,6 @@ event-pubsub@4.3.0: resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== -eventemitter3@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" - integrity sha1-teEHm1n7XhuidxwKmTvgYKWMmbo= - eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -6389,6 +6814,13 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== + dependencies: + clone-regexp "^2.1.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -6489,7 +6921,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.2, extend@~3.0.2: +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -6534,16 +6966,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -falafel@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" - integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== - dependencies: - acorn "^7.1.1" - foreach "^2.0.5" - isarray "^2.0.1" - object-keys "^1.0.6" - fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" @@ -6554,11 +6976,6 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" - integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== - fast-diff@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" @@ -6588,6 +7005,17 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -6598,6 +7026,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" @@ -6819,7 +7252,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.10.0: +follow-redirects@^1.0.0: version "1.13.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== @@ -6836,11 +7269,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -6907,13 +7335,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -6937,7 +7358,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.1: +fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -6952,32 +7373,6 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -fuse.js@^3.2.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" - integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6988,7 +7383,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -7002,16 +7397,16 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -7031,6 +7426,14 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -7051,7 +7454,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -7070,7 +7473,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -7094,6 +7497,22 @@ glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.0.1, globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -7113,6 +7532,13 @@ globals@^13.6.0: dependencies: type-fest "^0.20.2" +globals@^13.9.0: + version "13.12.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" + integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw== + dependencies: + type-fest "^0.20.2" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -7130,6 +7556,18 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -7167,33 +7605,17 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" -globule@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - -google-maps@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/google-maps/-/google-maps-3.3.0.tgz#4432b4715406bc15268ad35b1dd1b04d974956a6" - integrity sha512-pj4En0cWKG+lcBvC7qrzu5ItiMsYNTgjG2capsPzAbAM/O8ftugGpUUftTTwdGL8KlNvB4CEZ6IBWwpWYzUEpw== +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -graceful-fs@^4.2.3, graceful-fs@^4.2.4: +graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -7254,9 +7676,9 @@ hard-rejection@^2.1.0: integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== harmony-reflect@^1.4.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" - integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== has-ansi@^2.0.0: version "2.0.0" @@ -7265,7 +7687,7 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.0: +has-bigints@^1.0.0, has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== @@ -7290,10 +7712,12 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" has-value@^0.3.1: version "0.3.1" @@ -7326,7 +7750,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.1, has@^1.0.3: +has@^1.0.0, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -7470,6 +7894,11 @@ html-tags@^2.0.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + html-webpack-plugin@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" @@ -7495,6 +7924,16 @@ htmlparser2@^3.10.1: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^7.1.2: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -7592,12 +8031,7 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -iconv-lite@0.2: - version "0.2.11" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" - integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= - -iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17: +iconv-lite@0.4.24, iconv-lite@^0.4.17: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7643,6 +8077,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.0.5, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + ignore@^5.1.1, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" @@ -7678,6 +8117,11 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -7737,7 +8181,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4: +ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7770,6 +8214,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -7864,7 +8317,12 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2, is-callable@^1.2.3: +is-callable@^1.1.3, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-callable@^1.1.4, is-callable@^1.2.2, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== @@ -7909,6 +8367,13 @@ is-core-module@^2.5.0: dependencies: has "^1.0.3" +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -7973,13 +8438,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -8009,6 +8467,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-language-code@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-language-code/-/is-language-code-3.1.0.tgz#b2386b49227e7010636f16d0c2c681ca40136ab5" + integrity sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA== + dependencies: + "@babel/runtime" "^7.14.0" + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -8067,6 +8532,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" @@ -8085,11 +8555,29 @@ is-regex@^1.0.4, is-regex@^1.1.1, is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.1" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -8105,6 +8593,13 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -8129,6 +8624,13 @@ is-valid-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-whitespace@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" @@ -9148,11 +9650,6 @@ jest@^26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" -js-base64@^2.1.8: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== - js-beautify@^1.6.12, js-beautify@^1.6.14: version "1.13.5" resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.5.tgz#a08a97890cae55daf1d758d3f6577bd4a64d7014" @@ -9199,6 +9696,13 @@ js-yaml@^3.13.1, js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.0.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -9388,7 +9892,7 @@ json3@^3.3.3: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== -json5@2.x, json5@^2.1.2: +json5@2.x, json5@^2.1.2, json5@^2.1.3: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== @@ -9407,6 +9911,16 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonc-eslint-parser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.1.0.tgz#4c126b530aa583d85308d0b3041ff81ce402bbb2" + integrity sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g== + dependencies: + acorn "^8.5.0" + eslint-visitor-keys "^3.0.0" + espree "^9.0.0" + semver "^7.3.5" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -9463,6 +9977,11 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== +known-css-properties@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.24.0.tgz#19aefd85003ae5698a5560d2b55135bf5432155c" + integrity sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA== + launch-editor-middleware@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" @@ -9593,11 +10112,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -9613,21 +10127,6 @@ lodash.defaultsdeep@^4.6.1: resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== -lodash.filter@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= - -lodash.foreach@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -9663,7 +10162,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.7.0, lodash@~4.17.10: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9721,13 +10220,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -magic-string@^0.22.4: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== - dependencies: - vlq "^0.2.2" - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -9784,6 +10276,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -9847,13 +10344,6 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-source-map@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" - integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= - dependencies: - source-map "^0.5.6" - merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" @@ -9866,7 +10356,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -9968,7 +10458,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -9984,26 +10474,11 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^3.0.0: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" - integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -10051,7 +10526,7 @@ mkdirp@0.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -10127,11 +10602,16 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.12.1, nan@^2.13.2: +nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nanoid@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -10203,31 +10683,17 @@ node-environment-flags@^1.0.5: semver "^5.7.0" node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-gyp@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" - which "^2.0.2" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -10309,27 +10775,6 @@ node-releases@^2.0.1: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== -node-sass@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.1.tgz#cad1ccd0ce63e35c7181f545d8b986f3a9a887fe" - integrity sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^7.0.3" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - lodash "^4.17.15" - meow "^9.0.0" - nan "^2.13.2" - node-gyp "^7.1.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -10379,6 +10824,11 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= + normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -10394,11 +10844,6 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -nouislider@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/nouislider/-/nouislider-12.1.0.tgz#a4416b4b3357e77e52217f8ecf060eb14a855f59" - integrity sha512-SAOabF6hBm8201c6LDbkVOVhgwY49+/ms72ZLUF2qkN5RCf7FfUvEh/hGZ7XcwZHU+I/grlicPmcSk1/rrMnOw== - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -10413,16 +10858,6 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -npmlog@^4.0.0, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -10435,11 +10870,6 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - nwsapi@^2.0.7, nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -10474,16 +10904,16 @@ object-hash@^2.0.3: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.1.1.tgz#9447d0279b4fcf80cff3259bf66a1dc73afabe09" integrity sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ== +object-inspect@^1.11.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + object-inspect@^1.8.0, object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== -object-inspect@~1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" - integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== - object-is@^1.0.1: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" @@ -10492,7 +10922,7 @@ object-is@^1.0.1: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -10514,7 +10944,7 @@ object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== @@ -10523,6 +10953,15 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0 define-properties "^1.1.3" es-abstract "^1.18.0-next.2" +object.getownpropertydescriptors@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -10604,13 +11043,6 @@ optimism@^0.10.0: dependencies: "@wry/context" "^0.4.0" -optimist@0.3: - version "0.3.7" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" - integrity sha1-yQlBrVnkJzMokjB00s8ufLxuwNk= - dependencies: - wordwrap "~0.0.2" - optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -10769,11 +11201,6 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" -parchment@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5" - integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -10839,7 +11266,7 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== -parse5@6.0.1, parse5@^6.0.1: +parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -10920,6 +11347,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10955,11 +11387,6 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -perfect-scrollbar@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz#821d224ed8ff61990c23f26db63048cdc75b6b83" - integrity sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA== - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -11008,11 +11435,9 @@ pinkie@^2.0.0: integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pirates@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== pirates@^4.0.1: version "4.0.3" @@ -11151,6 +11576,15 @@ postcss-discard-overridden@^4.0.1: dependencies: postcss "^7.0.0" +postcss-html@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-1.3.0.tgz#5b28b44a9cc8351cdba6ae1f26017c2303bd7642" + integrity sha512-ewbwd7OGW4dLsErtvZH9HpVMEcXnlhYSzKsr7MepGlOT8imHTIZ/+pdfEruLS+hTYapLTQAWDnoQcJpsYU4uRw== + dependencies: + htmlparser2 "^7.1.2" + postcss "^8.4.0" + postcss-safe-parser "^6.0.0" + postcss-load-config@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -11169,6 +11603,11 @@ postcss-loader@^3.0.0: postcss-load-config "^2.0.0" schema-utils "^1.0.0" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= + postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -11372,6 +11811,21 @@ postcss-reduce-transforms@^4.0.2: postcss "^7.0.0" postcss-value-parser "^3.0.0" +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= + +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-scss@^4.0.2, postcss-scss@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.3.tgz#36c23c19a804274e722e83a54d20b838ab4767ac" + integrity sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA== + postcss-selector-parser@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" @@ -11391,6 +11845,14 @@ postcss-selector-parser@^6.0.2: uniq "^1.0.1" util-deprecate "^1.0.2" +postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-svgo@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" @@ -11420,6 +11882,11 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + postcss@^6.0.1, postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" @@ -11438,6 +11905,15 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.3 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.4.0, postcss@^8.4.6, postcss@^8.4.8: + version "8.4.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.8.tgz#dad963a76e82c081a0657d3a2f3602ce10c2e032" + integrity sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ== + dependencies: + nanoid "^3.3.1" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -11681,36 +12157,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quill-delta@^3.6.2: - version "3.6.3" - resolved "https://registry.yarnpkg.com/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032" - integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg== - dependencies: - deep-equal "^1.0.1" - extend "^3.0.2" - fast-diff "1.1.2" - -quill@^1.3.6: - version "1.3.7" - resolved "https://registry.yarnpkg.com/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8" - integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g== - dependencies: - clone "^2.1.1" - deep-equal "^1.0.1" - eventemitter3 "^2.0.3" - extend "^3.0.2" - parchment "^1.1.4" - quill-delta "^3.6.2" - -quote-stream@^1.0.1, quote-stream@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" - integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= - dependencies: - buffer-equal "0.0.1" - minimist "^1.1.3" - through2 "^2.0.0" - raf-manager@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/raf-manager/-/raf-manager-0.3.0.tgz#ec9a659e8a50534e4d64200b7a39ce9905f10e9c" @@ -11812,7 +12258,7 @@ read-pkg@^5.0.0, read-pkg@^5.1.1, read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11850,6 +12296,13 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" @@ -12050,11 +12503,6 @@ reselect@^3.0.1: resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= -resize-observer-polyfill@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -12099,7 +12547,16 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.1.5, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.4.0: +resolve@1.x: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.4.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -12200,11 +12657,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= - rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -12254,16 +12706,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - sass-loader@^10: version "10.2.0" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" @@ -12275,6 +12717,13 @@ sass-loader@^10: schema-utils "^3.0.0" semver "^7.3.2" +sass@1.32.13: + version "1.32.13" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.13.tgz#8d29c849e625a415bce71609c7cf95e15f74ed00" + integrity sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -12321,14 +12770,6 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - sdp@^2.12.0, sdp@^2.6.0: version "2.12.0" resolved "https://registry.yarnpkg.com/sdp/-/sdp-2.12.0.tgz#338a106af7560c86e4523f858349680350d53b22" @@ -12339,11 +12780,6 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - selfsigned@^1.10.8: version "1.10.8" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" @@ -12366,7 +12802,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.4: +semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -12434,7 +12870,7 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -12472,19 +12908,12 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallow-copy@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= - -shapefile@0.3: - version "0.3.1" - resolved "https://registry.yarnpkg.com/shapefile/-/shapefile-0.3.1.tgz#9bb9a429bd6086a0cfb03962d14cfdf420ffba12" - integrity sha1-m7mkKb1ghqDPsDli0Uz99CD/uhI= +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: - d3-queue "1" - iconv-lite "0.2" - optimist "0.3" + kind-of "^6.0.2" shebang-command@^1.2.0: version "1.2.0" @@ -12525,6 +12954,15 @@ shvl@^2.0.2: resolved "https://registry.yarnpkg.com/shvl/-/shvl-2.0.3.tgz#eb4bd37644f5684bba1fc52c3010c96fb5e6afd1" integrity sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + sigmund@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -12535,6 +12973,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -12650,6 +13093,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -12661,7 +13109,15 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@^0.5.16: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -12674,23 +13130,16 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -12745,6 +13194,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -12810,13 +13264,6 @@ stackframe@^1.1.1: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== -static-eval@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" - integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== - dependencies: - escodegen "^1.11.1" - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -12825,26 +13272,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -static-module@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" - integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== - dependencies: - concat-stream "~1.6.0" - convert-source-map "^1.5.1" - duplexer2 "~0.1.4" - escodegen "~1.9.0" - falafel "^2.1.0" - has "^1.0.1" - magic-string "^0.22.4" - merge-source-map "1.0.4" - object-inspect "~1.4.0" - quote-stream "~1.0.2" - readable-stream "~2.3.3" - shallow-copy "~0.0.1" - static-eval "^2.0.0" - through2 "~2.0.3" - stats-webpack-plugin@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz#ccffe9b745de8bbb155571e063f8263fc0e2bc06" @@ -12857,13 +13284,6 @@ stats-webpack-plugin@^0.7.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -12930,16 +13350,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -12965,6 +13376,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.padend@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz#6858ca4f35c5268ebd5e8615e1327d55f59ee311" @@ -13041,6 +13461,13 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -13083,6 +13510,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -13092,6 +13524,112 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +stylelint-config-html@>=1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-html/-/stylelint-config-html-1.0.0.tgz#172acb996ee4c854e8c670fcff77ff0d98d3bec2" + integrity sha512-rKQUUWDpaYC7ybsS6tLxddjn6DxhjSIXybElSmcTyVQj3ExhmU3q+l41ktrlwHRyY0M5SkTkZiwngvYPYmsgSQ== + +stylelint-config-recommended-scss@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.2.tgz#193f483861c76a36ece24c52eb6baca4838f4a48" + integrity sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg== + dependencies: + postcss-scss "^4.0.2" + stylelint-config-recommended "^6.0.0" + stylelint-scss "^4.0.0" + +stylelint-config-recommended-vue@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.3.0.tgz#a40f1efa5bff8bd3e2c1c58c3faacbe73b5b69ec" + integrity sha512-UEY/MZlBO2yiQdZoJm33trtqJ1MEDzBADhIAM0pTvfYbyXe5KwdbTtmALHETG1cXfDxuuUbJTvL9uENMy2Rjug== + dependencies: + semver "^7.3.5" + stylelint-config-html ">=1.0.0" + stylelint-config-recommended ">=6.0.0" + +stylelint-config-recommended@>=6.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz#7497372ae83ab7a6fffc18d7d7b424c6480ae15e" + integrity sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q== + +stylelint-config-recommended@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz#fd2523a322836005ad9bf473d3e5534719c09f9d" + integrity sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw== + +stylelint-config-standard-scss@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-3.0.0.tgz#dafc4fa5538d0ed833bf0a7d391e075683ffd96c" + integrity sha512-zt3ZbzIbllN1iCmc94e4pDxqpkzeR6CJo5DDXzltshuXr+82B8ylHyMMARNnUYrZH80B7wgY7UkKTYCFM0UUyw== + dependencies: + stylelint-config-recommended-scss "^5.0.2" + stylelint-config-standard "^24.0.0" + +stylelint-config-standard@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-24.0.0.tgz#6823f207ab997ae0b641f9a636d007cc44d77541" + integrity sha512-+RtU7fbNT+VlNbdXJvnjc3USNPZRiRVp/d2DxOF/vBDDTi0kH5RX2Ny6errdtZJH3boO+bmqIYEllEmok4jiuw== + dependencies: + stylelint-config-recommended "^6.0.0" + +stylelint-scss@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-4.1.0.tgz#39b808696f8152081163d970449257ff80b5c041" + integrity sha512-BNYTo7MMamhFOlcaAWp2dMpjg6hPyM/FFqfDIYzmYVLMmQJqc8lWRIiTqP4UX5bresj9Vo0dKC6odSh43VP2NA== + dependencies: + lodash "^4.17.21" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.0.6" + postcss-value-parser "^4.1.0" + +stylelint@^14.5.3: + version "14.5.3" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.5.3.tgz#103b6670128ba3dea69fe3a1a07c4a5d3e0e3450" + integrity sha512-omHETL+kGHR+fCXFK1SkZD/A+emCP9esggAdWEl8GPjTNeyRYj+H6uetRDcU+7E451zwWiUYGVAX+lApsAZgsQ== + dependencies: + balanced-match "^2.0.0" + colord "^2.9.2" + cosmiconfig "^7.0.1" + css-functions-list "^3.0.1" + debug "^4.3.3" + execall "^2.0.0" + fast-glob "^3.2.11" + fastest-levenshtein "^1.0.12" + file-entry-cache "^6.0.1" + get-stdin "^8.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.1.0" + ignore "^5.2.0" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.24.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.4" + normalize-path "^3.0.0" + normalize-selector "^0.2.0" + picocolors "^1.0.0" + postcss "^8.4.6" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + specificity "^0.4.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + style-search "^0.1.0" + supports-hyperlinks "^2.2.0" + svg-tags "^1.0.0" + table "^6.8.0" + v8-compile-cache "^2.3.0" + write-file-atomic "^4.0.1" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -13133,6 +13671,19 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-hyperlinks@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" @@ -13157,11 +13708,6 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" -sweetalert2@^9.5.4: - version "9.17.2" - resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-9.17.2.tgz#7f33ce157a64c303d2ca98863c9a3f437e5f1187" - integrity sha512-HkpPZVMYsnhFUBLdy/LvkU9snggKP3VAuSVnPhVXjxdg02lWbFx0W8H3m7A+WMWw2diXZS1wIa4m67XkNxdvew== - symbol-observable@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -13196,23 +13742,22 @@ table@^6.0.4: string-width "^4.2.0" strip-ansi "^6.0.0" +table@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -13307,7 +13852,7 @@ throttle-debounce@^2.1.0: resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== -through2@^2.0.0, through2@~2.0.3: +through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -13337,11 +13882,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -13406,18 +13946,6 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -topojson@^1.6.19: - version "1.6.27" - resolved "https://registry.yarnpkg.com/topojson/-/topojson-1.6.27.tgz#adbe33a67e2f1673d338df12644ad20fc20b42ed" - integrity sha1-rb4zpn4vFnPTON8SZErSD8ILQu0= - dependencies: - d3 "3" - d3-geo-projection "0.2" - d3-queue "2" - optimist "0.3" - rw "1" - shapefile "0.3" - toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" @@ -13475,18 +14003,16 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -13661,6 +14187,16 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.0" which-boxed-primitive "^1.0.1" +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -13861,7 +14397,7 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -13914,11 +14450,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vlq@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -13933,14 +14464,6 @@ vue-apollo@^3.0.7: serialize-javascript "^4.0.0" throttle-debounce "^2.1.0" -vue-bootstrap-typeahead@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/vue-bootstrap-typeahead/-/vue-bootstrap-typeahead-0.2.6.tgz#8c1999a00bf4bf9fc906bae3a462482482cbc297" - integrity sha512-BcUAnvfN+PS0StL6E3endd37P7HUt9otk+8m7tsa2gkt2I2KY8O2Dma49oR8ie8iletvJAlAqpN+klF6ktPULQ== - dependencies: - resize-observer-polyfill "^1.5.0" - vue "^2.5.17" - vue-cli-plugin-i18n@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vue-cli-plugin-i18n/-/vue-cli-plugin-i18n-1.0.1.tgz#5a3077de5d62c9b4068e486db1fc97fce9fa0072" @@ -13955,20 +14478,6 @@ vue-cli-plugin-i18n@^1.0.1: vue-i18n "^8.17.0" vue-i18n-extract "1.0.2" -vue-clickaway@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/vue-clickaway/-/vue-clickaway-2.2.2.tgz#cecf6839575e8b2afc5d3edb3efb616d293dbb44" - integrity sha512-25SpjXKetL06GLYoLoC8pqAV6Cur9cQ//2g35GRFBV4FgoljbZZjTINR8g2NuVXXDMLSUXaKx5dutgO4PaDE7A== - dependencies: - loose-envify "^1.2.0" - -vue-clipboard2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/vue-clipboard2/-/vue-clipboard2-0.3.1.tgz#6e551fb7bd384889b28b0da3b12289ed6bca4894" - integrity sha512-H5S/agEDj0kXjUb5GP2c0hCzIXWRBygaWLN3NEFsaI9I3uWin778SFEMt8QRXiPG+7anyjqWiw2lqcxWUSfkYg== - dependencies: - clipboard "^2.0.0" - vue-eslint-parser@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" @@ -13993,6 +14502,19 @@ vue-eslint-parser@^7.6.0: esquery "^1.4.0" lodash "^4.17.15" +vue-eslint-parser@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d" + integrity sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g== + dependencies: + debug "^4.3.2" + eslint-scope "^7.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.0.0" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.5" + vue-flatpickr-component@^8.1.2: version "8.1.6" resolved "https://registry.yarnpkg.com/vue-flatpickr-component/-/vue-flatpickr-component-8.1.6.tgz#8fb25dc72946ceb1ab005b871a8151461c0883f6" @@ -14012,24 +14534,24 @@ vue-functional-data-merge@^3.1.0: resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz#08a7797583b7f35680587f8a1d51d729aa1dc657" integrity sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA== -vue-good-table@^2.21.3: - version "2.21.4" - resolved "https://registry.yarnpkg.com/vue-good-table/-/vue-good-table-2.21.4.tgz#0f223dc2d067cccfc1bcb6ed00e904d58df336d3" - integrity sha512-LIIErTCiYXYQPJsf66JUjanRqBwA8ZwYwUCW1PMPleyX+g5OUegPIKcEQ/9Is3/Y9wXY6SfUfbmCKq8vxfRuDw== - dependencies: - date-fns "^2.0.0-beta.4" - diacriticless "1.0.1" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.5.0" - lodash.filter "^4.6.0" - lodash.foreach "^4.5.0" - lodash.isequal "^4.5.0" - vue-hot-reload-api@^2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== +vue-html-webpack-plugin@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vue-html-webpack-plugin/-/vue-html-webpack-plugin-3.2.2.tgz#df1499f05bcdf22c2e7040fa760fb0f5de66beea" + integrity sha512-C1qz9hxxrzvPSkpr59GHY8oh0U6TUuKYkhRg47pcYoq8D7JQKDGON8xsI6LYudVKGowcPj8GulfdHsp0Cc1gJA== + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + vue-i18n-extract@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/vue-i18n-extract/-/vue-i18n-extract-1.0.2.tgz#0a136e12d1634d6799e187aad81a7003d02f67a5" @@ -14128,17 +14650,12 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue-toasted@^1.1.28: - version "1.1.28" - resolved "https://registry.yarnpkg.com/vue-toasted/-/vue-toasted-1.1.28.tgz#dbabb83acc89f7a9e8765815e491d79f0dc65c26" - integrity sha512-UUzr5LX51UbbiROSGZ49GOgSzFxaMHK6L00JV8fir/CYNJCpIIvNZ5YmS4Qc8Y2+Z/4VVYRpeQL2UO0G800Raw== - vue2-transitions@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/vue2-transitions/-/vue2-transitions-0.2.3.tgz#69c9d75b1db05f231b80980c03459d68490ba27d" integrity sha512-Ou5x74AOQbM8JjZV8pIssFFqavvj53QzrEEUr5QnElUYb1ZizPwaUJo0ZqmLPqjwPae7ON4SG8U2cSTI4tHKLg== -vue@^2.2.6, vue@^2.5.17, vue@^2.6.11: +vue@2.6.12, vue@^2.2.6, vue@^2.6.11: version "2.6.12" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== @@ -14218,6 +14735,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -14411,6 +14933,14 @@ whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" @@ -14447,7 +14977,7 @@ whatwg-url@^8.5.0: tr46 "^2.1.0" webidl-conversions "^6.1.0" -which-boxed-primitive@^1.0.1: +which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== @@ -14463,7 +14993,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -14477,23 +15007,11 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -14552,6 +15070,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -14560,9 +15086,9 @@ write@^0.2.1: mkdirp "^0.5.1" ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" @@ -14573,20 +15099,20 @@ ws@^6.0.0, ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.0.0, ws@^7.4.4: - version "7.4.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" - integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +ws@^7.0.0, ws@^7.4.6: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== ws@^7.3.1: version "7.5.5" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== -ws@^7.4.6: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== +ws@^7.4.4: + version "7.4.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" + integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== xml-name-validator@^3.0.0: version "3.0.0" @@ -14628,6 +15154,20 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml-eslint-parser@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/yaml-eslint-parser/-/yaml-eslint-parser-0.5.0.tgz#01d4e4d992a820769ea85ef5fd526dfc20ebc6f5" + integrity sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g== + dependencies: + eslint-visitor-keys "^3.0.0" + lodash "^4.17.21" + yaml "^1.10.2" + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@10.x: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" diff --git a/gn b/gn deleted file mode 160000 index 5437e2f88..000000000 --- a/gn +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5437e2f882c54efe4f501f7cd0d97f53806d0b74 diff --git a/login_server/.gitignore b/login_server/.gitignore deleted file mode 100644 index ca7f5f440..000000000 --- a/login_server/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -src/cpsp/lib* -src/cpsp/cpspc -src/cpsp/compile_unix.sh -src/cpsp/*.h -src/cpsp/*.cpp -src/cpp/proto/ -build*/ - -src/LOCALE/messages.pot diff --git a/login_server/.gitmodules b/login_server/.gitmodules deleted file mode 100644 index 392836d92..000000000 --- a/login_server/.gitmodules +++ /dev/null @@ -1,24 +0,0 @@ -[submodule "dependencies/tinf"] - path = dependencies/tinf - url = https://github.com/jibsen/tinf.git -[submodule "dependencies/mariadb-connector-c"] - path = dependencies/mariadb-connector-c - url = https://github.com/MariaDB/mariadb-connector-c.git -[submodule "src/proto"] - path = src/proto - url = https://github.com/gradido/gradido_protocol.git -[submodule "dependencies/iroha-ed25519"] - path = dependencies/iroha-ed25519 - url = https://github.com/gradido/iroha-ed25519.git -[submodule "dependencies/spirit-po"] - path = dependencies/spirit-po - url = https://github.com/cbeck88/spirit-po.git -[submodule "dependencies/grpc"] - path = dependencies/grpc - url = https://github.com/grpc/grpc.git -[submodule "dependencies/poco"] - path = dependencies/poco - url = https://github.com/pocoproject/poco.git -[submodule "dependencies/cmake-modules"] - path = dependencies/cmake-modules - url = https://github.com/viaduck/cmake-modules.git diff --git a/login_server/CMakeLists.txt b/login_server/CMakeLists.txt deleted file mode 100644 index 91f7f1734..000000000 --- a/login_server/CMakeLists.txt +++ /dev/null @@ -1,354 +0,0 @@ -cmake_minimum_required(VERSION 3.18.2) -project(Gradido_LoginServer C CXX) -SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin" ) - -SET(CMAKE_CXX_FLAGS "-std=c++17" ) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -IF(WIN32) - set(CMAKE_CXX_FLAGS "/MP /EHsc") -ENDIF() - -set(INSTALL_BINDIR "bin") -set(INSTALL_PLUGINDIR "bin") - -include_directories( - "dependencies" - "dependencies/tinf/src/" - "dependencies/mariadb-connector-c/include" - "dependencies/mariadb-connector-c/build/include" - "dependencies/spirit-po/include" - "dependencies/protobuf/src" - "build" - "build/proto" - "build/http_pages" - "src/cpp" -) - -IF(UNIX) - include_directories( - "dependencies/poco/Crypto/include" - "dependencies/poco/Data/include" - "dependencies/poco/Util/include" - "dependencies/poco/Foundation/include" - "dependencies/poco/JSON/include" - "dependencies/poco/Net/include" - "dependencies/poco/NetSSL_OpenSSL/include" - ) -ENDIF() - -############################## find protobuf ######################################### -add_subdirectory(dependencies/protobuf/cmake) - -############################## parse protobuf files ################################### - -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/proto GRADIDO_PROTO_MODEL_PATH) -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/proto PROTOBINDING_PATH) -file(MAKE_DIRECTORY ${PROTOBINDING_PATH}) -file(MAKE_DIRECTORY ${PROTOBINDING_PATH}/gradido) - -FILE(GLOB DATAMODEL_GRADIDO_PROTOS "${GRADIDO_PROTO_MODEL_PATH}/gradido/*.proto") - -IF(WIN32) - set(PROTOC_BIN_PATH "build/dependencies/protobuf/cmake/bin") - find_program(PROTOBUF_PROTOC_EXECUTABLE protoc PATHS "${PROTOC_BIN_PATH}/Debug" ) - find_program(PROTOBUF_PROTOC_EXECUTABLE protoc PATHS "${PROTOC_BIN_PATH}/Release" ) -ELSE() - find_program(PROTOBUF_PROTOC_EXECUTABLE protoc PATHS "build/dependencies/protobuf/cmake/bin" ) -ENDIF() -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/protobuf/src GOOGLE_PROTOBUF_INCLUDES) -MESSAGE("protoc: ${PROTOBUF_PROTOC_EXECUTABLE} in build/dependencies/protobuf/bin/${CMAKE_BUILD_TYPE}") -FOREACH(proto ${DATAMODEL_GRADIDO_PROTOS}) - FILE(TO_NATIVE_PATH ${proto} proto_native) - get_filename_component(proto_parsed ${proto} NAME_WLE) - FILE(TO_NATIVE_PATH ${PROTOBINDING_PATH}/gradido/${proto_parsed}.pb.h proto_parsed_native) - - IF(${proto_native} IS_NEWER_THAN ${proto_parsed_native}) - EXECUTE_PROCESS( - COMMAND - ${PROTOBUF_PROTOC_EXECUTABLE} - --proto_path=${GRADIDO_PROTO_MODEL_PATH} - --cpp_out=${PROTOBINDING_PATH} - ${proto_native} - RESULT_VARIABLE rv - ) - # Optional, but that can show the user if something have gone wrong with the proto generation - IF(${rv}) - MESSAGE("Generation of data model returned ${rv} for proto ${proto_native}") - ELSE() - MESSAGE("Parsed: src/proto/gradido/${proto_parsed}.proto") - ENDIF() - ENDIF() - -ENDFOREACH(proto) - - -############################## parse cpsp Files #################################### - -IF(WIN32) - include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) - conan_basic_setup() - #add_compile_definitions(POCO_NETSSL_WIN) -ENDIF() - -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/cpsp GRADIDO_CPSP_PAGE_SRC_PATH) -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/http_pages GRADIDO_HTTP_PAGES_PATH) -file(MAKE_DIRECTORY ${GRADIDO_HTTP_PAGES_PATH}) - -FILE(GLOB GRADIDO_HTTP_PAGES_SRC "${GRADIDO_CPSP_PAGE_SRC_PATH}/*.cpsp") -IF(WIN32) - string(REGEX REPLACE "(.*)package/([a-f0-9]*)" "\\1build/\\2/build/bin" POCO_BUILD_BIN "${CONAN_POCO_ROOT}") - find_program(POCO_PAGE_COMPILER cpspc.exe PATHS "${CONAN_POCO_ROOT}") - find_program(POCO_PAGE_COMPILER cpspc.exe PATHS "${POCO_BUILD_BIN}") -ELSE() - find_program(POCO_PAGE_COMPILER cpspc PATHS "${CMAKE_CURRENT_SOURCE_DIR}/build/bin") -ENDIF() - -MESSAGE("Poco Page Compiler: ${POCO_PAGE_COMPILER}") - -FOREACH(cpsp_file ${GRADIDO_HTTP_PAGES_SRC}) - FILE(TO_NATIVE_PATH ${cpsp_file} cpsp_file_native) - get_filename_component(cpsp_file_parsed ${cpsp_file} NAME_WLE) - - FILE(TO_NATIVE_PATH ${GRADIDO_HTTP_PAGES_PATH}/${cpsp_file_parsed}Page.cpp cpsp_file_parsed_native) - - IF(${cpsp_file_native} IS_NEWER_THAN ${cpsp_file_parsed_native}) - IF(WIN32) - EXECUTE_PROCESS( - COMMAND - ${POCO_PAGE_COMPILER} - /output-dir=${GRADIDO_HTTP_PAGES_PATH} - /header-output-dir=${GRADIDO_HTTP_PAGES_PATH} - /noline - ${cpsp_file_native} - RESULT_VARIABLE rv - ) - ELSE() - EXECUTE_PROCESS( - COMMAND - ${POCO_PAGE_COMPILER} - --output-dir=${GRADIDO_HTTP_PAGES_PATH} - --header-output-dir=${GRADIDO_HTTP_PAGES_PATH} - --noline - ${cpsp_file_native} - RESULT_VARIABLE rv - ) - ENDIF() - # Optional, but that can show the user if something have gone wrong with the proto generation - IF(${rv}) - MESSAGE("Generation of HTTP Page return ${rv} for cpsp ${cpsp_file_native}") - ELSE() - MESSAGE("Parsed: src/cpsp/${cpsp_file_parsed}.cpsp") - ENDIF() - ENDIF() - -ENDFOREACH(cpsp_file) - -############################## bind source files ################################### - -FILE(GLOB CONTROLLER "src/cpp/controller/*.cpp" "src/cpp/controller/*.h") -FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h") -FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp") -FILE(GLOB COMPILED_PAGES "build/http_pages/*.h" "build/http_pages/*.cpp") -FILE(GLOB JSONInterface "src/cpp/JSONInterface/*.h" "src/cpp/JSONInterface/*.cpp") -FILE(GLOB TASKS "src/cpp/tasks/*.cpp" "src/cpp/tasks/*.h") -FILE(GLOB SINGLETON_MANAGER "src/cpp/SingletonManager/*.h" "src/cpp/SingletonManager/*.cpp") -FILE(GLOB LIB_SRC "src/cpp/lib/*.h" "src/cpp/lib/*.cpp") -FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp") -FILE(GLOB MODEL_TABLE "src/cpp/model/table/*.h" "src/cpp/model/table/*.cpp") -FILE(GLOB MODEL_EMAIL "src/cpp/model/email/*.h" "src/cpp/model/email/*.cpp") -FILE(GLOB MODEL_GRADIDO "src/cpp/model/gradido/*.h" "src/cpp/model/gradido/*.cpp") -FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp") -FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h") -FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/*.h" "src/cpp/MySQL/Poco/*.h") -FILE(GLOB PROTO_GRADIDO "build/proto/gradido/*.cc" "build/proto/gradido/*.h") - -# used only for test project -FILE(GLOB TEST "src/cpp/test/*.cpp" "src/cpp/test/*.h") -FILE(GLOB TEST_CRYPTO "src/cpp/test/crypto/*.cpp" "src/cpp/test/crypto/*.h") -FILE(GLOB TEST_MODEL "src/cpp/test/model/*.cpp" "src/cpp/test/model/*.h") -FILE(GLOB TEST_MODEL_TABLE "src/cpp/test/model/table/*.cpp" "src/cpp/test/model/table/*.h") -FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controller/*.h") -FILE(GLOB TEST_JSON_INTERFACE "src/cpp/test/JSONInterface/*.cpp" "src/cpp/test/JSONInterface/*.h") - -SET(LOCAL_SRCS - ${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface} ${COMPILED_PAGES} - ${JSONInterface} ${CRYPTO} - ${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL} ${MODEL_GRADIDO} - ${SINGLETON_MANAGER} ${LIB_SRC} ${MYSQL} ${TASKS} - ${PROTO_GRADIDO} -) -SET(LOCAL_TEST_SRC - ${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER} ${TEST_JSON_INTERFACE} -) -aux_source_directory("src/cpp" LOCAL_SRCS) - -if(MSVC) - # src - source_group("controller" FILES ${CONTROLLER}) - source_group("proto\\gradido" FILES ${PROTO_GRADIDO}) - source_group("tinf" FILES ${TINF}) - source_group("Crypto" FILES ${CRYPTO}) - source_group("tasks" FILES ${TASKS}) - source_group("model\\table" FILES ${MODEL_TABLE}) - source_group("model\\email" FILES ${MODEL_EMAIL}) - source_group("model\\gradido" FILES ${MODEL_GRADIDO}) - source_group("model" FILES ${MODEL}) - source_group("mysql" FILES ${MYSQL}) - source_group("SingletonManager" FILES ${SINGLETON_MANAGER}) - source_group("lib" FILES ${LIB_SRC}) - source_group("HTTP-Interface\\pages" FILES ${COMPILED_PAGES}) - source_group("HTTP-Interface" FILES ${HTTPInterface}) - source_group("Json-Interface" FILES ${JSONInterface}) - source_group("Test\\crypto" FILES ${TEST_CRYPTO}) - source_group("Test\\model\\table" FILES ${TEST_MODEL_TABLE}) - source_group("Test\\model" FILES ${TEST_MODEL}) - source_group("Test\\controller" FILES ${TEST_CONTROLLER}) - source_group("Test\\Json-Interface" FILES ${TEST_JSON_INTERFACE}) - source_group("Test" FILES ${TEST}) -endif() - - -add_executable(Gradido_LoginServer ${LOCAL_SRCS}) - -############################## config and add mariadb ################################### -set(CLIENT_PLUGIN_DIALOG OFF) -set(CLIENT_PLUGIN_MYSQL_CLEAR_PASSWORD OFF) -set(CLIENT_PLUGIN_REMOTE_IO OFF) -IF(WIN32) -#set(CLIENT_PLUGIN_caching_sha2_password OFF) -set(CLIENT_PLUGIN_CACHING_SHA2_PASSWORD OFF) -set(CLIENT_PLUGIN_SHA256_PASSWORD OFF) -set(CLIENT_PLUGIN_AUTH_GSSAPI_CLIENT OFF) -set(CLIENT_PLUGIN_PVIO_NPIPE STATIC) -set(CLIENT_PLUGIN_PVIO_SHMEM STATIC) -set(CLIENT_PLUGIN_CLIENT_ED25519 OFF) -ELSEIF() -set(CLIENT_PLUGIN_client_ed25519 OFF) -ENDIF() - -set(WITH_SSL OFF) -add_subdirectory("dependencies/mariadb-connector-c") - -set(DEP_PATH "dependencies") -set(MARIADB_CONNECTOR_PATH "${DEP_PATH}/mariadb-connector-c/build/libmariadb") - -#if(WIN32) - #find_library(MYSQL_LIBRARIES mariadbclient PATHS "${MARIADB_CONNECTOR_PATH}/Release" REQUIRED) - #find_library(COMPILED_MARIADB_CLIENT_DEBUG mariadbclient PATHS "${MARIADB_CONNECTOR_PATH}/Debug" REQUIRED) -#endif() - -############################## config and add poco ################################### -#SET(SOME_EXPAT_OPTION OFF CACHE BOOL "Use some expat option") -IF(UNIX) - SET(ENABLE_MONGODB OFF CACHE BOOL "" FORCE) - SET(ENABLE_DATA_SQLITE OFF CACHE BOOL "" FORCE) - SET(ENABLE_REDIS OFF CACHE BOOL "" FORCE) - SET(ENABLE_PAGECOMPILER_FILE2PAGE OFF CACHE BOOL "" FORCE) - add_subdirectory("dependencies/poco") - - set(POCO_LIBS PocoFoundation PocoUtil PocoNet PocoNetSSL PocoData) -ENDIF() - - -############################## build login server ################################### - -target_link_libraries(Gradido_LoginServer ${GRPC_LIBS}) - -if(WIN32) - target_link_libraries(Gradido_LoginServer mariadbclient libprotobuf ${CONAN_LIBS}) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer optimized ${MYSQL_LIBRARIES} Shlwapi) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) -else() # unix - target_link_libraries(Gradido_LoginServer ${POCO_LIBS} libmariadb sodium libprotobuf) -endif() - -# install -if(UNIX) -install(TARGETS Gradido_LoginServer RUNTIME DESTINATION /usr/local/bin) -#install(LIBRARYS DESTINATION /usr/local/lib) -#install(FILES lib/libmariadb /usr/local/lib) -install(FILES DESTINATION lib COMPONENT libmariadb) -install(DIRECTORY src/LOCALE DESTINATION /etc/grd_login/ - FILES_MATCHING PATTERN "*.po(t)") - - -endif(UNIX) - -# ---------------------- Test ----------------------------------------- - -enable_testing() - -option(COLLECT_COVERAGE_DATA "Use cov to collect coverage informations" OFF) -set(COVERAGE_TOOL "Coverage Tool (gcovr|lcov|fastcov)" CACHE STRING "gcovr") - -if(COLLECT_COVERAGE_DATA) - - include(cmake/CodeCoverage.cmake) - append_coverage_compiler_flags() - set(EXCLUDE_FOR_HTML_COV - "${CMAKE_CURRENT_SOURCE_DIR}/build/proto/*" - "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/*" - "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/test/*" - "${CMAKE_CURRENT_SOURCE_DIR}/googletest/googletest/include/gtest/internal/*" - "${CMAKE_CURRENT_SOURCE_DIR}/googletest/googletest/src/" - ) - if("${COVERAGE_TOOL}" STREQUAL "gcovr") - setup_target_for_coverage_gcovr_html( - NAME coverage - EXECUTABLE Gradido_LoginServer_Test - EXCLUDE ${EXCLUDE_FOR_HTML_COV} - GCOVR_ADDITIONAL_ARGS "--txt " - #DEPENDENCIES lib/libmariadb.so.3 - ) - endif() - - set(EXCLUDE_FOR_COV - ${EXCLUDE_FOR_HTML_COV} - "/usr/include/*" - ) - if("${COVERAGE_TOOL}" STREQUAL "lcov") - setup_target_for_coverage_lcov( - NAME coverage - EXECUTABLE Gradido_LoginServer_Test - EXCLUDE "${EXCLUDE_FOR_COV}" - #DEPENDENCIES lib/libmariadb.so.3 - ) - endif() - - if("${COVERAGE_TOOL}" STREQUAL "fastcov") - setup_target_for_coverage_fastcov( - NAME coverage # New target name - EXECUTABLE Gradido_LoginServer_Test -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR - #BASE_DIRECTORY "../" # Base directory for report - # (defaults to PROJECT_SOURCE_DIR) - EXCLUDE "${EXCLUDE_FOR_COV}" # Patterns to exclude. - NO_DEMANGLE # Don't demangle C++ symbols - # even if c++filt is found - SKIP_HTML # Don't create html report - ) - endif() - -endif() - -project(Gradido_LoginServer_Test C CXX) -#_TEST_BUILD -#find_package(GTest CONFIG REQUIRED) -#add_subdirectory("dependencies/protobuf/third_party/googletest") - -add_executable(Gradido_LoginServer_Test ${LOCAL_SRCS} ${LOCAL_TEST_SRC}) -target_compile_definitions(Gradido_LoginServer_Test PUBLIC "_TEST_BUILD") - -target_link_libraries(Gradido_LoginServer_Test ${GRPC_LIBS} ) - -if(WIN32) - target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} libmariadb libprotobuf) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test optimized ${MYSQL_LIBRARIES} Shlwapi) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${GRPC_LIBS} ${PROTOBUF_DEBUG_LIBS}) -else() - target_link_libraries(Gradido_LoginServer_Test ${POCO_LIBS} libmariadb sodium gtest) -endif() - -add_test(NAME main COMMAND Gradido_LoginServer_Test) diff --git a/login_server/CMakeLists.txt.lib b/login_server/CMakeLists.txt.lib deleted file mode 100644 index 7f5f10e39..000000000 --- a/login_server/CMakeLists.txt.lib +++ /dev/null @@ -1,255 +0,0 @@ -cmake_minimum_required(VERSION 3.18.2) -project(Gradido_LoginServer C CXX) -SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin" ) - -SET ( CMAKE_CXX_FLAGS "-std=c++17" ) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -if(WIN32) - set(CMAKE_CXX_FLAGS "/MP /EHsc") - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") - set(CMAKE_CXX_FLAGS_RELEASE "-O3") -else() - set(INSTALL_BINDIR "bin") - set(INSTALL_PLUGINDIR "bin") -endif() - -include_directories( - "dependencies" - "dependencies/tinf/src" - "dependencies/spirit-po/include" - "/usr/local/include/mariadb" - "build" - "build/proto" - "build/http_pages" - "src/cpp" -) - -############################## config and add grpc ################################### -find_package(Protobuf REQUIRED) -include_directories(${Protobuf_INCLUDE_DIRS}) - -set(PROTOBUF_LIBS protobuf::libprotobuf protobuf::libprotobuf-lite protobuf::libprotoc) - -############################## parse proto files ################################### - -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/proto GRADIDO_PROTO_MODEL_PATH) -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/proto PROTOBINDING_PATH) -file(MAKE_DIRECTORY ${PROTOBINDING_PATH}) -file(MAKE_DIRECTORY ${PROTOBINDING_PATH}/gradido) - -FILE(GLOB DATAMODEL_GRADIDO_PROTOS "${GRADIDO_PROTO_MODEL_PATH}/gradido/*.proto") - -FOREACH(proto ${DATAMODEL_GRADIDO_PROTOS}) - FILE(TO_NATIVE_PATH ${proto} proto_native) - get_filename_component(proto_parsed ${proto} NAME_WLE) - FILE(TO_NATIVE_PATH ${PROTOBINDING_PATH}/gradido/${proto_parsed}.pb.h proto_parsed_native) - - IF(${proto_native} IS_NEWER_THAN ${proto_parsed_native}) - EXECUTE_PROCESS( - COMMAND - ${PROTOBUF_PROTOC_EXECUTABLE} - --proto_path=${GRADIDO_PROTO_MODEL_PATH} - --cpp_out=${PROTOBINDING_PATH} - ${proto_native} - RESULT_VARIABLE rv - ) - # Optional, but that can show the user if something have gone wrong with the proto generation - IF(${rv}) - MESSAGE("Generation of data model returned ${rv} for proto ${proto_native}") - ELSE() - MESSAGE("Parsed: src/proto/gradido/${proto_parsed}.proto") - ENDIF() - ENDIF() - -ENDFOREACH(proto) - -############################## parse cpsp Files #################################### -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/cpsp GRADIDO_CPSP_PAGE_SRC_PATH) -FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/http_pages GRADIDO_HTTP_PAGES_PATH) -file(MAKE_DIRECTORY ${GRADIDO_HTTP_PAGES_PATH}) - -FILE(GLOB GRADIDO_HTTP_PAGES_SRC "${GRADIDO_CPSP_PAGE_SRC_PATH}/*.cpsp") - -find_program(POCO_PAGE_COMPILER cpspc) - -MESSAGE("Poco Page Compiler: ${POCO_PAGE_COMPILER}") - -FOREACH(cpsp_file ${GRADIDO_HTTP_PAGES_SRC}) - FILE(TO_NATIVE_PATH ${cpsp_file} cpsp_file_native) - get_filename_component(cpsp_file_parsed ${cpsp_file} NAME_WLE) - - FILE(TO_NATIVE_PATH ${GRADIDO_HTTP_PAGES_PATH}/${cpsp_file_parsed}Page.cpp cpsp_file_parsed_native) - - IF(${cpsp_file_native} IS_NEWER_THAN ${cpsp_file_parsed_native}) - EXECUTE_PROCESS( - COMMAND - ${POCO_PAGE_COMPILER} - --output-dir=${GRADIDO_HTTP_PAGES_PATH} - --header-output-dir=${GRADIDO_HTTP_PAGES_PATH} - --noline - ${cpsp_file_native} - RESULT_VARIABLE rv - ) - # Optional, but that can show the user if something have gone wrong with the proto generation - IF(${rv}) - MESSAGE("Generation of HTTP Page return ${rv} for cpsp ${cpsp_file_native}") - ELSE() - MESSAGE("Parsed: src/cpsp/${cpsp_file_parsed}.cpsp") - ENDIF() - ENDIF() - -ENDFOREACH(cpsp_file) - -############################## include src files ################################### -#set(MYSQL_INCLUDE_DIR "dependencies/mariadb-connector-c/include") - -FILE(GLOB CONTROLLER "src/cpp/controller/*.cpp" "src/cpp/controller/*.h") -FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h") -FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp") -FILE(GLOB COMPILED_PAGES "build/http_pages/*.h" "build/http_pages/*.cpp") -FILE(GLOB JSONInterface "src/cpp/JSONInterface/*.h" "src/cpp/JSONInterface/*.cpp") -FILE(GLOB TASKS "src/cpp/tasks/*.cpp" "src/cpp/tasks/*.h") -FILE(GLOB SINGLETON_MANAGER "src/cpp/SingletonManager/*.h" "src/cpp/SingletonManager/*.cpp") -FILE(GLOB LIB_SRC "src/cpp/lib/*.h" "src/cpp/lib/*.cpp") -FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp") -FILE(GLOB MODEL_TABLE "src/cpp/model/table/*.h" "src/cpp/model/table/*.cpp") -FILE(GLOB MODEL_EMAIL "src/cpp/model/email/*.h" "src/cpp/model/email/*.cpp") -FILE(GLOB MODEL_HEDERA "src/cpp/model/hedera/*.h" "src/cpp/model/hedera/*.cpp") -FILE(GLOB MODEL_GRADIDO "src/cpp/model/gradido/*.h" "src/cpp/model/gradido/*.cpp") -FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp") -FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h") -FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/*.h" "src/cpp/MySQL/Poco/*.h") -FILE(GLOB PROTO_GRADIDO "${PROTOBINDING_PATH}/gradido/*.cc" "${PROTOBINDING_PATH}/gradido/*.h") - -# used only for test project -FILE(GLOB TEST "src/cpp/test/*.cpp" "src/cpp/test/*.h") -FILE(GLOB TEST_CRYPTO "src/cpp/test/crypto/*.cpp" "src/cpp/test/crypto/*.h") -FILE(GLOB TEST_MODEL "src/cpp/test/model/*.cpp" "src/cpp/test/model/*.h") -FILE(GLOB TEST_MODEL_TABLE "src/cpp/test/model/table/*.cpp" "src/cpp/test/model/table/*.h") -FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controller/*.h") -FILE(GLOB TEST_JSON_INTERFACE "src/cpp/test/JSONInterface/*.cpp" "src/cpp/test/JSONInterface/*.h") - -SET(LOCAL_SRCS - ${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface} ${COMPILED_PAGES} - ${JSONInterface} ${CRYPTO} - ${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL} ${MODEL_HEDERA} ${MODEL_GRADIDO} - ${SINGLETON_MANAGER} ${LIB_SRC} ${MYSQL} ${TASKS} - ${PROTO_GRADIDO} ${PROTO_HEDERA} -) -SET(LOCAL_TEST_SRC - ${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER} ${TEST_JSON_INTERFACE} -) -aux_source_directory("src/cpp" LOCAL_SRCS) - -add_executable(Gradido_LoginServer ${LOCAL_SRCS}) - -############################## find mariadb ################################### -find_library(MYSQL_LIBRARIES mariadb PATHS "/usr/local/lib/mariadb" REQUIRED) -############################## config and add poco ################################### -set(BUILD_LIB_PATH "(/usr/local/lib") - -IF(CMAKE_BUILD_TYPE MATCHES Debug) - find_library(POCO_FOUNDATION_LIB PocoFoundationd PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_UTIL_LIB PocoUtild PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_NET_SSL_LIB PocoNetSSLd PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_DATA_LIB PocoDatad PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_JSON_LIB PocoJSONd PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_NET_LIB PocoNetd PATHS ${BUILD_LIB_PATH} REQUIRED) - message("use Poco Debug libs") -ELSE() - find_library(POCO_FOUNDATION_LIB PocoFoundation PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_UTIL_LIB PocoUtil PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_NET_SSL_LIB PocoNetSSL PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_DATA_LIB PocoData PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_JSON_LIB PocoJSON PATHS ${BUILD_LIB_PATH} REQUIRED) - find_library(POCO_NET_LIB PocoNet PATHS ${BUILD_LIB_PATH} REQUIRED) - message("use Poco Release libs") -ENDIF() - -set(POCO_LIBS ${POCO_FOUNDATION_LIB} ${POCO_UTIL_LIB} ${POCO_NET_SSL_LIB} ${POCO_DATA_LIB} ${POCO_JSON_LIB} ${POCO_NET_LIB}) - - -############################## build login server ################################### - -target_link_libraries(Gradido_LoginServer ${PROTOBUF_LIBS} ${MYSQL_LIBRARIES} ${POCO_LIBS} sodium pthread) - -############################## build login server test ################################### -IF(CMAKE_BUILD_TYPE STREQUAL "Debug") - project(Gradido_LoginServer_Test C CXX) - - enable_testing() - - option(COLLECT_COVERAGE_DATA "Use cov to collect coverage informations" OFF) - set(COVERAGE_TOOL "Coverage Tool (gcovr|lcov|fastcov)" CACHE STRING "gcovr") - - - if(COLLECT_COVERAGE_DATA) - - include(cmake/CodeCoverage.cmake) - append_coverage_compiler_flags() - set(EXCLUDE_FOR_HTML_COV - "${CMAKE_CURRENT_SOURCE_DIR}/build/proto/*" - "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/*" - "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/test/*" - "${CMAKE_CURRENT_SOURCE_DIR}/googletest/googletest/include/gtest/internal/*" - "${CMAKE_CURRENT_SOURCE_DIR}/googletest/googletest/src/" - ) - if("${COVERAGE_TOOL}" STREQUAL "gcovr") - setup_target_for_coverage_gcovr_html( - NAME coverage - EXECUTABLE Gradido_LoginServer_Test - EXCLUDE ${EXCLUDE_FOR_HTML_COV} - GCOVR_ADDITIONAL_ARGS "--txt " - #DEPENDENCIES lib/libmariadb.so.3 - ) - endif() - - set(EXCLUDE_FOR_COV - ${EXCLUDE_FOR_HTML_COV} - "/usr/include/*" - ) - if("${COVERAGE_TOOL}" STREQUAL "lcov") - setup_target_for_coverage_lcov( - NAME coverage - EXECUTABLE Gradido_LoginServer_Test - EXCLUDE "${EXCLUDE_FOR_COV}" - #DEPENDENCIES lib/libmariadb.so.3 - ) - endif() - - if("${COVERAGE_TOOL}" STREQUAL "fastcov") - setup_target_for_coverage_fastcov( - NAME coverage # New target name - EXECUTABLE Gradido_LoginServer_Test -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR - #BASE_DIRECTORY "coverage" # Base directory for report - # (defaults to PROJECT_SOURCE_DIR) - EXCLUDE "${EXCLUDE_FOR_COV}" # Patterns to exclude. - NO_DEMANGLE # Don't demangle C++ symbols - # even if c++filt is found - SKIP_HTML # Don't create html report - ) - endif() - - endif() - #_TEST_BUILD - - add_subdirectory("googletest") - - add_executable(Gradido_LoginServer_Test ${LOCAL_SRCS} ${LOCAL_TEST_SRC}) - target_compile_definitions(Gradido_LoginServer_Test PUBLIC "_TEST_BUILD") - - target_link_libraries(Gradido_LoginServer_Test ${GRPC_LIBS} ) - - if(WIN32) - target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} ) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test optimized ${MYSQL_LIBRARIES} Shlwapi) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) - #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${GRPC_LIBS} ${PROTOBUF_DEBUG_LIBS}) - else() - target_link_libraries(Gradido_LoginServer_Test ${PROTOBUF_LIBS} ${MYSQL_LIBRARIES} ${POCO_LIBS} sodium pthread gtest) - endif() - - add_test(NAME main COMMAND Gradido_LoginServer_Test) -ENDIF() \ No newline at end of file diff --git a/login_server/Dockerfile b/login_server/Dockerfile deleted file mode 100644 index 313cdeca6..000000000 --- a/login_server/Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ - -######################################################################################################### -# Build release -######################################################################################################### -FROM gradido/login_dependencies:alpine-release-3 as release - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -COPY ./CMakeLists.txt.lib ./CMakeLists.txt -COPY ./src ./src -RUN ln -s /usr/local/googletest ./googletest -COPY ./dependencies/cmake-modules ./dependencies/cmake-modules -COPY ./dependencies/spirit-po ./dependencies/spirit-po -COPY ./dependencies/tinf ./dependencies/tinf -COPY ./scripts ./scripts - -RUN mkdir build && \ - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && \ - make -j$(nproc) Gradido_LoginServer - -RUN cd scripts && \ - chmod +x compile_pot.sh && \ - ./compile_pot.sh - - -######################################################################################################### -# run release -######################################################################################################### -#From alpine:latest as login_server -FROM alpine:3.13.5 as login_server - -USER root -WORKDIR "/usr/bin" - -COPY --from=release /code/build/bin/Gradido_LoginServer /usr/bin/ - -COPY --from=release /usr/local/lib/mariadb/libmariadb.so.3 /usr/local/lib/ -COPY --from=release /usr/local/lib/libPoco* /usr/local/lib/ -COPY --from=release /usr/local/lib/libproto* /usr/local/lib/ -COPY --from=release /usr/lib/libsodium.so.23 /usr/lib/ -COPY --from=release /usr/lib/libstdc++.so.6 /usr/lib/ -COPY --from=release /usr/lib/libgcc_s.so.1 /usr/lib/ - - -RUN chmod +x /usr/bin/Gradido_LoginServer -ENTRYPOINT ["/usr/bin/Gradido_LoginServer"] -#CMD Gradido_LoginServer diff --git a/login_server/Dockerfiles/alpine/Dockerfile.debug b/login_server/Dockerfiles/alpine/Dockerfile.debug deleted file mode 100644 index e1f168586..000000000 --- a/login_server/Dockerfiles/alpine/Dockerfile.debug +++ /dev/null @@ -1,16 +0,0 @@ -FROM gradido/login_dependencies:alpine-debug-3 as login_server_alpine_debug - -ENV DOCKER_WORKDIR="/code" - - -EXPOSE 1200 -EXPOSE 1201 -WORKDIR ${DOCKER_WORKDIR} - -COPY ./CMakeLists.txt.lib ./CMakeLists.txt -COPY ./scripts ./scripts -COPY ./cmake ./cmake -RUN ln -s /usr/local/googletest ./googletest - -CMD cd scripts; ./build_debug.sh; cd ..; ./build/bin/Gradido_LoginServer - diff --git a/login_server/Dockerfiles/alpine/Dockerfile.dependencies b/login_server/Dockerfiles/alpine/Dockerfile.dependencies deleted file mode 100644 index 098c7a8d7..000000000 --- a/login_server/Dockerfiles/alpine/Dockerfile.dependencies +++ /dev/null @@ -1,95 +0,0 @@ -# Login-Server Build dependencies for alpine -# Uploaded to hub.docker.com with the tag: -# gradido/login_dependencies:alpine-debug-3 for debug build -# and -# gradido/login_dependencies:alpine-release-3 for release build -# Update tag when dependencies are added or removed - -# Control Build Type with ARG BUILD_TYPE -# Valid values do you find here: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html -# Default is set to Debug - - -##### BUILD-ENV ##### -FROM alpine:3.13.5 as alpine-build - -RUN apk add --update --no-cache icu-dev -RUN apk add --no-cache git openssl-dev make gcc musl-dev g++ linux-headers libintl gettext-dev boost-dev libsodium-dev - - -##### CMAKE ##### -FROM alpine-build as alpine-gxx-cmake - -RUN git clone https://github.com/Kitware/CMake.git --branch=v3.19.8 && \ - cd CMake && \ - ./bootstrap --parallel=$(nproc) && \ - make -j$(nproc) && \ - make install - -######### BUILD grpc ############## -FROM alpine-gxx-cmake as alpine-gxx-protobuf - -ARG BUILD_TYPE=Debug - -RUN apk add --no-cache autoconf automake libtool curl unzip - -RUN git clone https://github.com/protocolbuffers/protobuf.git --recursive -j4 && \ - cd protobuf && \ - ./autogen.sh && \ - ./configure && \ - make -j$(nproc) && \ - make install - -# protobuf libs missing after make install -#RUN cp grpc/build/third_party/protobuf/*.a /usr/local/lib/ - -######### BUILD poco ############## -FROM alpine-gxx-cmake as alpine-gxx-poco - -ARG BUILD_TYPE=Debug - -RUN git clone https://github.com/pocoproject/poco.git --recursive && \ - cd poco && \ - git checkout poco-1.9.4-release && \ - mkdir cmake-build && cd cmake-build && \ - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. && make -j$(nproc) && \ - make install - -######### BUILD mariadb ########### -FROM alpine-gxx-cmake as alpine-gxx-mariadb-connector - -ARG BUILD_TYPE=Debug - -RUN git clone https://github.com/mariadb-corporation/mariadb-connector-c.git && \ - cd mariadb-connector-c && \ - git checkout 159540f && \ - mkdir build && cd build && \ - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. && make -j$(nproc) && \ - make install - -######################################################################################################### -# builded libs and binaries -######################################################################################################### -FROM alpine-build as alpine-libs - -# copy CMake from cmake stage -COPY --from=alpine-gxx-cmake /usr/local/bin/cmake /usr/local/bin/cmake -COPY --from=alpine-gxx-cmake /usr/local/share/cmake-3.19/Modules /usr/local/share/cmake-3.19/Modules -COPY --from=alpine-gxx-cmake /usr/local/share/cmake-3.19/Templates /usr/local/share/cmake-3.19/Templates - -# copy from grpc -COPY --from=alpine-gxx-protobuf /usr/local /usr/local - -# COPY from poco -COPY --from=alpine-gxx-poco /usr/local /usr/local - -# COPY from mariadb -COPY --from=alpine-gxx-mariadb-connector /usr/local /usr/local - -######################################################################################################### -# COPY Things only needed for testing -######################################################################################################### -FROM alpine-libs as alpine-libs-test - -COPY --from=alpine-gxx-protobuf /protobuf/third_party/googletest /usr/local/googletest - diff --git a/login_server/Dockerfiles/alpine/Dockerfile.release b/login_server/Dockerfiles/alpine/Dockerfile.release deleted file mode 100644 index 313cdeca6..000000000 --- a/login_server/Dockerfiles/alpine/Dockerfile.release +++ /dev/null @@ -1,49 +0,0 @@ - -######################################################################################################### -# Build release -######################################################################################################### -FROM gradido/login_dependencies:alpine-release-3 as release - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -COPY ./CMakeLists.txt.lib ./CMakeLists.txt -COPY ./src ./src -RUN ln -s /usr/local/googletest ./googletest -COPY ./dependencies/cmake-modules ./dependencies/cmake-modules -COPY ./dependencies/spirit-po ./dependencies/spirit-po -COPY ./dependencies/tinf ./dependencies/tinf -COPY ./scripts ./scripts - -RUN mkdir build && \ - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && \ - make -j$(nproc) Gradido_LoginServer - -RUN cd scripts && \ - chmod +x compile_pot.sh && \ - ./compile_pot.sh - - -######################################################################################################### -# run release -######################################################################################################### -#From alpine:latest as login_server -FROM alpine:3.13.5 as login_server - -USER root -WORKDIR "/usr/bin" - -COPY --from=release /code/build/bin/Gradido_LoginServer /usr/bin/ - -COPY --from=release /usr/local/lib/mariadb/libmariadb.so.3 /usr/local/lib/ -COPY --from=release /usr/local/lib/libPoco* /usr/local/lib/ -COPY --from=release /usr/local/lib/libproto* /usr/local/lib/ -COPY --from=release /usr/lib/libsodium.so.23 /usr/lib/ -COPY --from=release /usr/lib/libstdc++.so.6 /usr/lib/ -COPY --from=release /usr/lib/libgcc_s.so.1 /usr/lib/ - - -RUN chmod +x /usr/bin/Gradido_LoginServer -ENTRYPOINT ["/usr/bin/Gradido_LoginServer"] -#CMD Gradido_LoginServer diff --git a/login_server/Dockerfiles/alpine/Dockerfile.with_config b/login_server/Dockerfiles/alpine/Dockerfile.with_config deleted file mode 100644 index f17be7040..000000000 --- a/login_server/Dockerfiles/alpine/Dockerfile.with_config +++ /dev/null @@ -1,63 +0,0 @@ - - -# Login Server build which contain the config file, found on docker hub with tag: -# gradido/login_server:with-config -# Used for community-server tests on staging - -######################################################################################################### -# Build release -######################################################################################################### -FROM gradido/login_dependencies:alpine-release-3 as release_default - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -COPY ./login_server/CMakeLists.txt.lib ./CMakeLists.txt -COPY ./login_server/src ./src -COPY ./login_server/dependencies/cmake-modules ./dependencies/cmake-modules -COPY ./login_server/dependencies/spirit-po ./dependencies/spirit-po -COPY ./login_server/dependencies/tinf ./dependencies/tinf -COPY ./login_server/scripts ./scripts - -RUN mkdir build && \ - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && \ - make -j$(nproc) Gradido_LoginServer - -RUN cd scripts && \ - chmod +x compile_pot.sh && \ - ./compile_pot.sh - - -######################################################################################################### -# run release with docker default config -######################################################################################################### -#From alpine:latest as login_server -FROM alpine:3.13.5 as login_server_default - -USER root -WORKDIR "/usr/bin" - -COPY --from=release_default /code/build/bin/Gradido_LoginServer /usr/bin/ - -COPY --from=release_default /usr/local/lib/mariadb/libmariadb.so.3 /usr/local/lib/ -COPY --from=release_default /usr/local/lib/libPoco* /usr/local/lib/ -COPY --from=release_default /usr/lib/libsodium.so.23 /usr/lib/ -COPY --from=release_default /usr/lib/libstdc++.so.6 /usr/lib/ -COPY --from=release_default /usr/lib/libgcc_s.so.1 /usr/lib/ - -COPY ./configs/login_server/grd_login.properties /etc/grd_login/ -COPY ./configs/login_server/cacert.pem /etc/grd_login/ -COPY ./configs/login_server/LOCALE /etc/grd_login/ - -EXPOSE 1200 -EXPOSE 1201 - -RUN chmod +x /usr/bin/Gradido_LoginServer -ENTRYPOINT ["/usr/bin/Gradido_LoginServer"] -#CMD Gradido_LoginServer - - - - - diff --git a/login_server/Dockerfiles/ubuntu/Dockerfile.debug b/login_server/Dockerfiles/ubuntu/Dockerfile.debug deleted file mode 100644 index 31b6f549f..000000000 --- a/login_server/Dockerfiles/ubuntu/Dockerfile.debug +++ /dev/null @@ -1,38 +0,0 @@ - -######################################################################################################### -# Prepare debug -######################################################################################################### -FROM gradido/login_dependencies:gcc9-debug-3 as prepare_debug - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -RUN echo '/usr/local/lib' >> /etc/ld.so.conf && ldconfig - -COPY ./CMakeLists.txt.lib ./CMakeLists.txt -RUN ln -s /usr/local/googletest ./googletest -COPY ./src ./src -COPY ./dependencies/cmake-modules ./dependencies/cmake-modules -COPY ./dependencies/spirit-po ./dependencies/spirit-po -COPY ./dependencies/tinf ./dependencies/tinf -COPY ./scripts ./scripts - - -######################################################################################################### -# Build debug -######################################################################################################### -FROM prepare_debug as debug - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -RUN mkdir build && \ - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Debug .. - -RUN cd scripts && \ - chmod +x compile_pot.sh && \ - ./compile_pot.sh - -CMD cd build && cmake .. -DCMAKE_BUILD_TYPE=Debug && make -j$(nproc) Gradido_LoginServer && ./bin/Gradido_LoginServer - diff --git a/login_server/Dockerfiles/ubuntu/Dockerfile.dependencies b/login_server/Dockerfiles/ubuntu/Dockerfile.dependencies deleted file mode 100644 index 883274628..000000000 --- a/login_server/Dockerfiles/ubuntu/Dockerfile.dependencies +++ /dev/null @@ -1,93 +0,0 @@ -# Login-Server Build dependencies for ubuntu -# Uploaded to hub.docker.com with the tag: -# gradido/login_dependencies:gcc9-debug-3 for debug build -# Update tag when dependencies are added or removed - -# Control Build Type with ARG BUILD_TYPE -# Valid values do you find here: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html -# Default is set to Debug - -##### BUILD-ENV ##### -FROM gcc:9 as gcc9_build - -RUN apt-get update && \ - apt-get install -y --no-install-recommends libssl-dev libboost-dev gettext libsodium-dev lcov && \ - apt-get autoclean && \ - apt-get autoremove && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - - -######################################################################################################### -# gcc 9 cmake -######################################################################################################### -FROM gcc9_build as gcc_9_cmake - -RUN git clone https://github.com/Kitware/CMake.git --branch=v3.19.8 && \ - cd CMake && \ - ./bootstrap --parallel=$(nproc) && \ - make -j$(nproc) && \ - make install - -######### BUILD grpc ############## -FROM gcc_9_cmake as gcc_9_protobuf - -ARG BUILD_TYPE=Debug - -RUN git clone https://github.com/protocolbuffers/protobuf.git --recursive -j4 && \ - cd protobuf && \ - ./autogen.sh && \ - ./configure && \ - make -j$(nproc) && \ - make install && \ - ldconfig - -# protobuf libs missing after make install -#RUN cp grpc/build/third_party/protobuf/*.a /usr/local/lib/ - -######### BUILD poco ############## -FROM gcc_9_cmake as gcc_9_poco - -ARG BUILD_TYPE=Debug - -RUN git clone https://github.com/pocoproject/poco.git --recursive && \ - cd poco && \ - git checkout poco-1.9.4-release && \ - mkdir cmake-build && cd cmake-build && \ - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. && make -j$(nproc) && \ - make install - -######### BUILD mariadb ########### -FROM gcc_9_cmake as gcc_9_mariadb-connector - -ARG BUILD_TYPE=Debug - -RUN git clone https://github.com/mariadb-corporation/mariadb-connector-c.git && \ - cd mariadb-connector-c && \ - git checkout 159540f && \ - mkdir build && cd build && \ - cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. && make -j$(nproc) && \ - make install - -######################################################################################################### -# builded libs and binaries -######################################################################################################### -FROM gcc9_build as gcc9_libs - -RUN echo '/usr/local/lib' >> /etc/ld.so.conf && ldconfig - -# copy CMake from cmake stage -COPY --from=gcc_9_cmake /usr/local/bin/cmake /usr/local/bin/cmake -COPY --from=gcc_9_cmake /usr/local/share/cmake-3.19/Modules /usr/local/share/cmake-3.19/Modules -COPY --from=gcc_9_cmake /usr/local/share/cmake-3.19/Templates /usr/local/share/cmake-3.19/Templates - -# copy from grpc -COPY --from=gcc_9_protobuf /usr/local /usr/local -COPY --from=gcc_9_protobuf /protobuf/third_party/googletest /usr/local/googletest - -# COPY from poco -COPY --from=gcc_9_poco /usr/local /usr/local - -# COPY from mariadb -COPY --from=gcc_9_mariadb-connector /usr/local /usr/local - diff --git a/login_server/Dockerfiles/ubuntu/Dockerfile.release b/login_server/Dockerfiles/ubuntu/Dockerfile.release deleted file mode 100644 index aa727c59c..000000000 --- a/login_server/Dockerfiles/ubuntu/Dockerfile.release +++ /dev/null @@ -1,49 +0,0 @@ - -######################################################################################################### -# Build release -######################################################################################################### -FROM gradido/login_dependencies:ubuntu-release-3 as release - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -COPY ./CMakeLists.txt.lib ./CMakeLists.txt -COPY ./src ./src -RUN ln -s /usr/local/googletest ./googletest -COPY ./dependencies/cmake-modules ./dependencies/cmake-modules -COPY ./dependencies/spirit-po ./dependencies/spirit-po -COPY ./dependencies/tinf ./dependencies/tinf -COPY ./scripts ./scripts - -RUN mkdir build && \ - cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && \ - make -j$(nproc) Gradido_LoginServer - -RUN cd scripts && \ - chmod +x compile_pot.sh && \ - ./compile_pot.sh - - -######################################################################################################### -# run release -######################################################################################################### -#From alpine:latest as login_server -FROM ubuntu:latest as login_server - -USER root -WORKDIR "/usr/bin" - -COPY --from=release /code/build/bin/Gradido_LoginServer /usr/bin/ - -COPY --from=release /usr/local/lib/mariadb/libmariadb.so.3 /usr/local/lib/ -COPY --from=release /usr/local/lib/libPoco* /usr/local/lib/ -COPY --from=release /usr/local/lib/libproto* /usr/local/lib/ -COPY --from=release /usr/lib/libsodium.so.23 /usr/lib/ -COPY --from=release /usr/lib/libstdc++.so.6 /usr/lib/ -COPY --from=release /usr/lib/libgcc_s.so.1 /usr/lib/ - - -RUN chmod +x /usr/bin/Gradido_LoginServer -ENTRYPOINT ["/usr/bin/Gradido_LoginServer"] -#CMD Gradido_LoginServer diff --git a/login_server/Dockerfiles/ubuntu/Dockerfile.test b/login_server/Dockerfiles/ubuntu/Dockerfile.test deleted file mode 100644 index 59caaf3c5..000000000 --- a/login_server/Dockerfiles/ubuntu/Dockerfile.test +++ /dev/null @@ -1,58 +0,0 @@ - -######################################################################################################### -# Prepare debug -######################################################################################################### -FROM gradido/login_dependencies:gcc9-debug-3 as prepare_debug - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - -RUN echo '/usr/local/lib' >> /etc/ld.so.conf && ldconfig - -COPY ./CMakeLists.txt.lib ./CMakeLists.txt -RUN ln -s /usr/local/googletest ./googletest -COPY ./src ./src -COPY ./cmake/CodeCoverage.cmake ./cmake/CodeCoverage.cmake -COPY ./dependencies/cmake-modules ./dependencies/cmake-modules -COPY ./dependencies/spirit-po ./dependencies/spirit-po -COPY ./dependencies/tinf ./dependencies/tinf -COPY ./scripts ./scripts - - -######################################################################################################### -# Install Coverage tool -######################################################################################################### -FROM prepare_debug as coverage - - -RUN apt-get update && \ - apt-get install -y --no-install-recommends python3-pip && \ - apt-get autoclean && \ - apt-get autoremove && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* -# fastcov need gcovr to work -RUN pip3 install gcovr setuptools wheel && \ - pip3 install fastcov - - -######################################################################################################### -# Build test -######################################################################################################### -FROM coverage as test - -ENV DOCKER_WORKDIR="/code" -WORKDIR ${DOCKER_WORKDIR} - - -RUN if [ ! -d "./build_cov" ] ; then mkdir build_cov; fi - -RUN cd build_cov && \ - cmake -DCMAKE_BUILD_TYPE=Debug -DCOLLECT_COVERAGE_DATA=ON -DCOVERAGE_TOOL=fastcov .. && \ - make -j$(nproc) Gradido_LoginServer_Test - -#ENTRYPOINT make -C build_cov coverage -CMD cd build_cov && make coverage && \ - if [ ! -d "./coverage" ] ; then mkdir coverage; fi && \ - cp coverage.info ./coverage/ - \ No newline at end of file diff --git a/login_server/Doxyfile b/login_server/Doxyfile deleted file mode 100644 index f738fb2ff..000000000 --- a/login_server/Doxyfile +++ /dev/null @@ -1,2573 +0,0 @@ -# Doxyfile 1.8.17 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the configuration -# file that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# https://www.gnu.org/software/libiconv/ for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "Gradido Login-Server" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = 0.20.KW11.02 - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "Store Keys and Login-Data for Gradido" - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = I:/Gradido/php/gradido_com1/GradidoCoin_300x.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = ./doc - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = YES - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line -# such as -# /*************** -# as being the beginning of a Javadoc-style comment "banner". If set to NO, the -# Javadoc-style will behave just like regular comments and it will not be -# interpreted by doxygen. -# The default value is: NO. - -JAVADOC_BANNER = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice -# sources only. Doxygen will then generate output that is more tailored for that -# language. For instance, namespaces will be presented as modules, types will be -# separated into more groups, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_SLICE = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: -# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser -# tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is -# Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 5 - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual -# methods of a class will be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIV_VIRTUAL = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# declarations. If set to NO, these declarations will be included in the -# documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# (including Cygwin) ands Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = ./src/cpp - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen -# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, -# *.vhdl, *.ucf, *.qsf and *.ice. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.idl \ - *.ddl \ - *.odl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.cs \ - *.d \ - *.php \ - *.php4 \ - *.php5 \ - *.phtml \ - *.inc \ - *.m \ - *.markdown \ - *.md \ - *.mm \ - *.dox \ - *.py \ - *.pyw \ - *.f90 \ - *.f \ - *.for \ - *.tcl \ - *.vhd \ - *.vhdl \ - *.ucf \ - *.qsf \ - *.as \ - *.js - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = src/cpp/proto/hedera - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# entity all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see https://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse_libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -# If clang assisted parsing is enabled you can provide the clang parser with the -# path to the compilation database (see: -# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files -# were built. This is equivalent to specifying the "-p" option to a clang tool, -# such as clang-check. These options will then be passed to the parser. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse_libclang=ON option for CMake. - -CLANG_DATABASE_PATH = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# https://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML -# documentation will contain a main index with vertical navigation menus that -# are dynamically created via JavaScript. If disabled, the navigation index will -# consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have JavaScript, -# like the Qt help browser. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_MENUS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with OSX -# 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy -# genXcode/_index.html for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = YES - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands -# to create new LaTeX commands to be used in formulas as building blocks. See -# the section "Including formulas" for details. - -FORMULA_MACROFILE = - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side JavaScript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /